Як бачити команди, виконані в іншій оболонці?


9

Чи є спосіб дивитися, які команди виконуються в іншій оболонці, як вони виконуються? Обидві оболонки башти, і у мене є кореневий доступ, якщо це має значення. Я не можу встановити будь-яке додаткове програмне забезпечення, і я не хочу, щоб інші оболонки мали робити щось особливе, як запуск екрана.

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


5
вбудовані команди, такі як kill, і cdне породжують підпроцеси і ніколи не з'являться у виводі ps.
Йорданм

@jordanm Дякую, це хороший момент. Навіть лише за допомогою команд, які викликають fork / exec, це, мабуть, було б досить добре.
Том Панінг

Відповіді:


7

Оскільки ти корінь, ти завжди міг strace -f -e execve -p her_bash_pid. Це -fнеобхідно, тому що її оболонка буде форсувати новий процес перед exec, але це також означає, що ви побачите все, що і дочірні процеси виконуються також.


Дякую, виведення стразевих виходів для exec робить його досить читабельним. Я впевнений, що той факт, що він продовжує стежити за дітьми дітей, мене збентежить якийсь день, але наразі я думаю, що буду в безпеці. Прикро, що немає способу автоматично відключатися від процесу після того, як він викликає exec.
Том Паннінг

Це відкритий код; ви завжди можете додати цю функцію, якщо вона вам справді потрібна. :) Або додайте трохи більш розумний сценарій, що розбирає висновок страйку, який ігнорує PID, як тільки він з'явиться exec.
Джим Парис

5

Якщо ваш колега може змінити деякі параметри історії для їх bash shell, то ви можете отримати цю інформацію з хвоста -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). Пробуючи це, я міг шпигувати за кожним другим персонажем. Трохи уяви ви зможете здогадатися, що вона ...

неправильно: конспірація не працює з 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

    (Звичайно, замініть ім'я екрана на те, що ви хочете, щоб було ім'я екрана).

  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файл, до якого ми додали, знову в історію сеансів

Примітка: параметр містить команди, які виконуються перед тим кожного нового командного рядка. тому команда1 буде збережена в історію лише тоді, коли виконується команда2PROMPT_COMMAND

Для зручності перегляду історії ви також можете хотіти ляпати часову позначку біля кожної команди. Знову відредагуйте ~/.bashrcта додайте

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

Також приємний злом, якщо ви хочете використовувати кілька терміналів і хочете мати свою історію команд :)

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.