Подтвердить что ты не робот

Полная командная строка, когда она была напечатана

Я хочу получить полную командную строку по мере ее ввода.

Это:

" ".join(sys.argv[:])

здесь не работает (удаляет двойные кавычки). Также я предпочитаю не присоединяться к чему-то, что было разобрано и расколото.

Любые идеи?

Спасибо заранее.

4b9b3361

Ответ 1

Ты опоздал. К тому времени, когда введенная команда попадет на Python, ваша оболочка уже поработала над своей магией. Например, кавычки потребляются (как вы заметили), переменные получают интерполяцию и т.д.

Ответ 2

В среде unix это, как правило, невозможно... лучше всего вы можете надеяться, это командная строка, переданная вашему процессу.

Поскольку оболочка (по существу, любая оболочка) может несколько раз набить введенную командную строку, прежде чем передать ее ОС для выполнения.

Ответ 3

* NIX

Посмотрите исходный макет стека (Linux на i386), который обеспечивает доступ к командной строке и среде программы: процесс видит только отдельные аргументы.

Вы не можете получить командную строку, как она была напечатана в общем случае. В Unix оболочка анализирует командную строку на отдельные аргументы и в конечном итоге вызывается execv(path, argv) функция, которая вызывает соответствующий syscall. sys.argv выводится из параметра argv, переданного функции execve(). Вы можете получить что-то эквивалентное, используя " ".join(map(pipes.quote, argv)), хотя вам не нужно, например, перезапустить script с несколько отличающимися параметрами командной строки, тогда sys.argv достаточно (во многих случаях), см. Можно ли установить флаг python -O (optimize) в script?

Есть несколько творческих (не практических) решений:

  • присоединяйте оболочку с помощью gdb и допросите ее (большинство оболочек могут повторять одну и ту же команду дважды) - вы должны иметь возможность получать почти ту же команду, что и в ней, или читать ее файл истории напрямую, если он обновлен до ваш процесс завершается
  • использовать экран, script утилиты для получения сеанса терминала
  • используйте кейлоггер, чтобы получить то, что было напечатано.

Окна

В Windows собственный CreateProcess() интерфейс представляет собой строку, но python.exe по-прежнему получает аргументы в виде списка. subprocess.list2cmdline(sys.argv) может помочь изменить процесс. list2cmdline предназначен для приложений с использованием того же как время выполнения MS C - python.exe является одним из них. list2cmdline не возвращает командную строку по мере ее ввода, но в этом случае возвращает функциональный эквивалент.

На Python 2 вам может понадобиться GetCommandLineW(), чтобы получить символы Unicode из командной строки, которые не могут быть представлены в кодовой странице ANSI (например, cp1252).

Ответ 4

Как уже упоминалось, это, вероятно, невозможно сделать, по крайней мере, не надежно. В некоторых случаях вы можете найти файл истории для оболочки (например, - "bash", но не "tcsh" ) и получить от пользователя текст. Я не знаю, сколько, если таковые имеются, контроля над пользовательской средой.

Ответ 5

Если вы используете linux, я бы предложил обезьяну с командой ~/.bash_history или командой history, хотя я считаю, что команда должна завершить выполнение до того, как она добавится в историю оболочки.

Я начал играть с:

import popen2
x,y = popen2.popen4("tail ~/.bash_history")
print x.readlines()

но я получаю странное поведение, когда оболочка, похоже, полностью не сливается с файлом .bash_history

Ответ 6

В linux есть /proc/<pid>/cmdline, который находится в формате argv[] (т.е. между всеми строками существует 0x00, и вы не можете действительно знать, сколько строк существует, так как вы не получаете argc; вы узнаете об этом, когда в файле закончились данные;).

Вы можете быть уверены, что эта командная строка уже запущена, так как все заполнение экскавации/переменной выполняется, а параметры - красиво упакованные (без лишних пробелов между параметрами и т.д.).