Jak zobaczyć polecenia wykonywane w innej powłoce?

9

Czy istnieje sposób na obejrzenie, jakie polecenia są wykonywane w innej powłoce, gdy są one wykonywane? Obie powłoki są bashowe i mam dostęp do roota, jeśli to ma znaczenie. Nie mogę zainstalować żadnego dodatkowego oprogramowania i nie chcę, aby druga powłoka musiała robić coś specjalnego, np. Uruchomić ekran.

Sytuacja: jestem zdalnie zalogowany do komputera z systemem Linux, podobnie jak współpracownik. Chciałbym zobaczyć polecenia, które wykonuje w swojej powłoce. Wiem, że mógłbym użyć dowolnej kombinacji watchi pszobaczyć polecenia, których uruchomienie zajmuje dłużej niż sekundę, ale nie sądzę, aby pomogło to w przypadku bardzo krótkich poleceń.

Tom Panning
źródło
5
wbudowane polecenia, takie jak kill, i cdnie spawnuj podprocesów i nigdy nie pojawią się w wynikach ps.
jordanm,
@jordanm Dzięki, to dobra uwaga. Nawet z poleceniami, które powodują rozwidlenie / exec, prawdopodobnie byłoby to wystarczająco dobre.
Tom Panning

Odpowiedzi:

7

Ponieważ jesteś rootem, zawsze możesz strace -f -e execve -p her_bash_pid. Jest -fto konieczne, ponieważ jej powłoka rozwinie nowy proces przed exec, ale oznacza to również, że zobaczysz wszystko, co procesy podrzędne wykonują.

Jim Paris
źródło
Dzięki, wyjście grepping strace dla exec czyni go dość czytelnym. Jestem pewien, że fakt, że ciągle podąża za dziećmi dzieci, pewnego dnia mnie dezorientuje, ale na razie myślę, że będę bezpieczny. Szkoda, że ​​nie ma możliwości automatycznego odłączenia się od procesu po wywołaniu exec.
Tom Panning
Jest open source; zawsze możesz dodać tę funkcję, jeśli naprawdę jej potrzebujesz. :) Lub dodaj nieco bardziej inteligentny skrypt analizujący dane wyjściowe strace, które ignorują PID, gdy tylko się pojawi exec.
Jim Paris,
5

Jeśli twój współpracownik może zmodyfikować niektóre ustawienia historii swojej powłoki bash, możesz uzyskać te informacje z tail -f /home/user/.bash_history. Oto ustawienie potrzebne do zapisania .bash_history po każdym poleceniu, a nie po wyjściu z powłoki:

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

Uważam jednak sesję ekranową za „idealne” rozwiązanie.

Jordan
źródło
5

Po szybkich badaniach (i przemyśleniu) mogę podać ci następującą listę możliwych opcji:

  • przeczytaj jej bash_history. Ale zwykle jest napisane tylko przy wylogowaniu. askubuntu.com ma post na temat zmiany tego zachowania ( edycja : @jordanm najwyraźniej miał ten sam pomysł i publikowanie było szybsze ...).
  • Jeśli była na fizycznym terminalu (/ dev / ttyX), możesz użyć programu conspy.
  • Wykorzystaj ją screen. Jeśli chcesz tylko pomóc jej, a nie szpiegować, może chcieć uruchomić sesję na ekranie. Następnie możesz po prostu dołączyć do jej sesji przezsudo -u herUsername screen -x
  • Możesz napisać skrypt opakowania powłoki, który rejestruje polecenia w wybranym pliku dziennika. Musiałbyś ustawić jej powłokę na ten skrypt (to tylko pomysł, może, ale nie musi działać).
  • Używanie cat /dev/pts/X | tee /dev/pts/Xbyło pierwszą rzeczą, jaka przyszła mi do głowy. Ale po próbie tak naprawdę nie działa i jest bardzo brudnym rozwiązaniem. Każdy znak jest drukowany tylko na jednym z dołączonych terminali (co jest również powodem wywołania tee). Podczas wypróbowania mógłbym szpiegować każdą sekundę postaci. Przy odrobinie wyobraźni możesz odgadnąć, co zamierza…
mreithub
źródło
źle: conspy nie działa z ttys
Zibri
3

Ekran GNU jest jak dotąd najlepszym wyróżnieniem IMO. Jeśli ekran GNU (lub tmux) nie jest dostępny, poproś współpracownika script -f.

A potem możesz obserwować, co ona robi, robiąc tail -fn +0 /path/to/typescript.

Stéphane Chazelas
źródło
0

Aby udostępnić terminal ekranowy systemu Unix, abyś mógł zobaczyć dane wejściowe i wyjściowe współpracownika w czasie rzeczywistym, użyj screenpolecenia Unix .

  1. Ty i współpracownik logujecie się w ssh jako ten sam użytkownik systemu Unix
  2. Wpisujesz polecenie

    screen -d -m -S myscreenname

    screen -x myscreenname

    (Oczywiście zamień myscreenname na dowolną nazwę ekranową).

  3. Współpracownik wpisuje polecenie

    screen -x myscreenname

  4. Aby zakończyć udostępnianie terminali Unix, każda osoba może wpisać polecenie

    exit

Świetną funkcją screena jest to, że możesz wpisywać polecenia z terminala uniksowego, a współpracownik widzi wynik na swoim ekranie. Jest to doskonały sposób na administrowanie parami i mentora młodszych administratorów Unix.

Jirawat Uttayaya
źródło
0

Aby wypełnić odpowiedź @ jordanm ... jeśli oboje korzystacie z tego samego konta użytkownika, tj. Z danych wyjściowych

echo $HOSTNAME
echo $USER 

jest to samo dla ciebie i twojego współpracownika, wtedy możemy się zabawić.

Możemy umożliwić przeglądanie wywoływanych poleceń w jednym terminalu, aby były natychmiast dostępne w innym

Jeśli wywołasz historyw swoim terminalu, zobaczysz poprzednie polecenia. Domyślnie bash zapisuje swoją historię na koniec każdej sesji do a ~/.bash_history file, zastępując istniejący plik zaktualizowaną wersją. Oznacza to, że jeśli jesteś zalogowany z wieloma sesjami bash, tylko ostatnia, która zakończy działanie, będzie miała zapisaną historię.

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

Edytuj swój ~/.bashrci dodaj do niego

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

gdzie

history -adołącza do ~/.bash_historypliku natychmiast zamiast na końcu sesji

history -c usuwa bieżącą historię sesji

history -rodczytuje ~/.bash_historyplik, do którego dołączyliśmy, z powrotem do naszej historii sesji

Uwaga: parametr zawiera polecenia, które są wykonywane przed każdym nowym wiersza poleceń. tak command1 zostaną zapisane tylko do historii, kiedy polecenie2 jest wykonywanePROMPT_COMMAND

Możesz także kliknąć znacznik czasu obok każdego polecenia, aby ułatwić sobie przeglądanie historii. Ponownie edytuj ~/.bashrci dołącz

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

Również fajny hack, jeśli lubisz korzystać z wielu terminali i chcesz mieć dostęp do historii poleceń :)

Więcej informacji

brat-bilo
źródło