Как увидеть команды, выполненные в другой оболочке?


9

Есть ли способ посмотреть, какие команды выполняются в другой оболочке, как они выполняются? Обе оболочки - bash, и у меня есть root-доступ, если это имеет значение. Я не могу установить дополнительное программное обеспечение, и я не хочу, чтобы другая оболочка выполняла какие-то особенные действия, такие как экран запуска.

Ситуация: я удаленно вошел в Linux-машину, как и мой коллега. Я хотел бы видеть команды, которые она выполняет в своей оболочке. Я знаю, что мог бы использовать некоторую комбинацию watchи, psчтобы увидеть любые команды, выполнение которых занимает больше секунды, но я не верю, что это помогло бы с очень короткими командами.


5
встроенные команды, такие как kill, и cdне порождают подпроцессы и никогда не появятся в выводе ps.
Иордания

@jordanm Спасибо, это хороший момент. Даже с помощью только команд, вызывающих fork / exec, этого вполне достаточно.
Том Паннинг

Ответы:


7

Так как ты root, ты всегда мог strace -f -e execve -p her_bash_pid. Это -fнеобходимо, потому что ее оболочка будет форкировать новый процесс перед exec, но это также означает, что вы увидите все, что выполняются дочерние процессы.


Спасибо, вывод grece strace для exec делает его довольно читабельным. Я уверен, что тот факт, что он продолжает преследовать детей детей, однажды смущает меня, но сейчас я думаю, что буду в безопасности. Жаль, что нет способа автоматически отсоединиться от процесса после вызова exec.
Том Паннинг

Это с открытым исходным кодом; Вы всегда можете добавить эту функцию, если она вам действительно нужна. :) Или добавьте немного более интеллектуальный скрипт, анализирующий вывод strace, который игнорирует PID, если он есть exec.
Джим Пэрис

5

Если ваш коллега может изменить некоторые настройки истории для своей оболочки bash, вы можете получить эту информацию из tail -f /home/user/.bash_history. Вот настройки, которые вам понадобятся для записи .bash_history после каждой команды, а не при выходе из оболочки:

export PROMPT_COMMAND="history -a"
shopt -s histappend

Я бы посчитал сеанс экрана идеальным решением.


5

После быстрого исследования (и некоторого размышления) я могу дать вам следующий список возможных вариантов:

  • прочитайте ее историю Но обычно это пишется только при выходе из системы. На сайте askubuntu.com есть сообщение об изменении этого поведения ( правка : @jordanm, по- видимому, придерживалось той же идеи и было быстрее публиковать ...).
  • Если бы она была на физическом терминале (/ dev / ttyX), вы могли бы использовать программу conspy.
  • Заставь ее использовать screen. Если вы просто хотите помочь, а не шпионить за ней, она, возможно, захочет запустить ее сеанс внутри экрана. Затем вы можете просто прикрепить к ее сессииsudo -u herUsername screen -x
  • Вы можете написать скрипт оболочки, который записывает команды в лог-файл по вашему выбору. Вы должны установить ее оболочку для этого сценария (это всего лишь идея, она может или не может работать).
  • Использование cat /dev/pts/X | tee /dev/pts/Xбыло первым, что пришло мне в голову. Но после попытки действительно не работает и это очень грязное решение. Каждый символ печатается только на одном из подключенных терминалов (что также является причиной вызова tee). Испытывая это, я мог следить за каждым вторым персонажем. С небольшим воображением вы можете догадаться, что она замышляет ...

неправильно: conspy не работает с ttys
Zibri

3

Экран GNU - лучшая награда IMO на данный момент. Если экран GNU (или tmux) недоступен, запустите ваш коллегу script -f.

И тогда вы можете посмотреть, что она делает, делая tail -fn +0 /path/to/typescript.


0

Чтобы использовать экранный терминал Unix, чтобы вы могли видеть входы и выходы своего коллеги в режиме реального времени, используйте команду Unix screen.

  1. Вы и коллега входите в систему как один и тот же пользователь Unix в ssh
  2. Вы вводите команду

    screen -d -m -S myscreenname

    screen -x myscreenname

    (Конечно, замените myscreenname на то, что вы хотите, чтобы отображаемое имя было).

  3. Сотрудник набирает команду

    screen -x myscreenname

  4. Чтобы закончить с совместным использованием ваших терминалов Unix, любой человек может ввести команду

    exit

Отличной особенностью экрана является то, что вы можете вводить команды с терминала Unix, и коллега может видеть результат на ее экране. Это отличный способ сделать парное администрирование и наставник юных администраторов Unix.


0

Чтобы завершить ответ @ jordanm ... если вы оба используете одну и ту же учетную запись пользователя, т.е. вывод из

echo $HOSTNAME
echo $USER 

то же самое для вас и вашего коллеги, тогда мы можем повеселиться.

Мы можем включить просмотр вызванных команд в одном терминале, чтобы они были мгновенно доступны в другом.

Если вы вызываете historyв своем терминале, вы видите ваши предыдущие команды. По умолчанию bash записывает свою историю в конце каждого сеанса в a ~/.bash_history file, перезаписывая существующий файл обновленной версией. Это означает, что если вы вошли в систему с несколькими сеансами bash, только последний из них завершит свою историю.

-------------------------------------------------- -----

Отредактируйте свой ~/.bashrcи добавьте к нему

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

где

history -aдобавляет в ~/.bash_historyфайл сразу, а не в конце сеанса

history -c очищает текущую историю сеанса

history -rчитает ~/.bash_historyфайл, к которому мы добавили, обратно в историю наших сессий

Примечание: параметр содержит команды, которые выполняются перед тем каждого нового командной строки. так command1 будут сохранены только в истории , когда command2 выполняетсяPROMPT_COMMAND

Вы также можете добавить временную метку рядом с каждой командой для удобства просмотра истории. Снова отредактируйте ~/.bashrcи добавьте

export HISTTIMEFORMAT="%d/%m/%y %T "

Также хороший хак, если вы хотите использовать несколько терминалов и хотите, чтобы ваша история команд была доступна :)

Больше информации

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.