Wie werden die Befehle in einer anderen Shell ausgeführt?


9

Gibt es eine Möglichkeit zu beobachten, welche Befehle in einer anderen Shell ausgeführt werden, während sie ausgeführt werden? Beide Shells sind Bash, und ich habe Root-Zugriff, wenn das wichtig ist. Ich kann keine zusätzliche Software installieren und möchte nicht, dass die andere Shell etwas Besonderes wie den Bildschirm ausführen muss.

Situation: Ich bin remote an einem Linux-Computer angemeldet, ebenso ein Mitarbeiter. Ich würde gerne die Befehle sehen, die sie in ihrer Shell ausführt. Ich weiß, dass ich eine Kombination von watchund verwenden könnte ps, um Befehle anzuzeigen, deren Ausführung länger als eine Sekunde dauert, aber ich glaube nicht, dass dies bei sehr kurzen Befehlen helfen würde.


5
Eingebaute Befehle wie killund erzeugen cdkeine Unterprozesse und würden niemals in der ps-Ausgabe erscheinen.
Jordanm

@ Jordanm Danke, das ist ein guter Punkt. Selbst mit nur den Befehlen, die einen Fork / Exec verursachen, wäre das wahrscheinlich gut genug.
Tom Panning

Antworten:


7

Da du root bist, könntest du es immer strace -f -e execve -p her_bash_pid. Das -fist notwendig , weil ihre Schale ein neues Verfahren vor der Gabel wird exec, aber das bedeutet auch , dass Sie etwas sehen werden , dass die untergeordneten Prozesse als auch auszuführen.


Dank der Ausgabe von grepping strace für exec ist es ziemlich lesbar. Ich bin sicher, dass die Tatsache, dass es immer wieder Kindern von Kindern folgt, mich eines Tages verwirren wird, aber im Moment denke ich, dass ich in Sicherheit bin. Es ist eine Schande, dass es keine Möglichkeit gibt, sich automatisch von einem Prozess zu trennen, nachdem er exec aufgerufen hat.
Tom Panning

Es ist Open Source; Sie können diese Funktion jederzeit hinzufügen, wenn Sie sie wirklich benötigen. :) Oder fügen Sie ein etwas intelligenteres Skript hinzu, das die Strace-Ausgabe analysiert und eine PID ignoriert, sobald sie vorhanden ist exec.
Jim Paris

5

Wenn Ihr Mitarbeiter einige Verlaufseinstellungen für seine Bash-Shell ändern kann, können Sie diese Informationen unter tail -f /home/user/.bash_history abrufen. Hier ist die Einstellung, die Sie benötigen, damit .bash_history nach jedem Befehl und nicht beim Beenden der Shell geschrieben wird:

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

Ich würde eine Bildschirmsitzung jedoch als "ideale" Lösung betrachten.


5

Nach einer kurzen Recherche (und einigen Überlegungen) kann ich Ihnen die folgende Liste möglicher Optionen geben:

  • lies ihre bash_history. Aber es wird normalerweise nur beim Abmelden geschrieben. askubuntu.com hat einen Beitrag über das Ändern dieses Verhaltens ( edit : @jordanm hatte anscheinend die gleiche Idee und war schneller zu posten ...).
  • Wenn sie sich auf einem physischen Terminal (/ dev / ttyX) befand, konnten Sie das Programm verwenden conspy.
  • Lass sie benutzen screen. Wenn Sie ihr nur helfen und sie nicht ausspionieren möchten, ist sie möglicherweise bereit, ihre Sitzung auf dem Bildschirm durchzuführen. Sie können dann einfach an ihre Sitzung von anhängensudo -u herUsername screen -x
  • Sie können ein Shell-Wrapper-Skript schreiben, das die Befehle in einer Protokolldatei Ihrer Wahl protokolliert. Sie müssten ihre Shell auf dieses Skript einstellen (Dies ist nur eine Idee, es könnte funktionieren oder nicht).
  • Verwenden cat /dev/pts/X | tee /dev/pts/Xwar das erste, was mir in den Sinn kam. Aber nach dem Versuch funktioniert es nicht wirklich und ist eine sehr schmutzige Lösung. Jedes Zeichen wird nur auf einem der angeschlossenen Terminals gedruckt (was auch der Grund für den Anruf ist tee). Beim Ausprobieren konnte ich jeden zweiten Charakter ausspionieren. Mit ein wenig Fantasie könnte man erraten, was sie vorhat ...

falsch: Verschwörung funktioniert nicht mit ttys
Zibri

3

Der GNU-Bildschirm ist IMO die bisher beste Auszeichnung. Wenn der GNU-Bildschirm (oder tmux) nicht verfügbar ist, lassen Sie Ihren Kollegen ausführen script -f.

Und dann können Sie sehen, was sie tut, indem Sie es tun tail -fn +0 /path/to/typescript.


0

Verwenden Sie den Unix- screenBefehl , um ein Unix-Bildschirmterminal freizugeben, damit Sie die Ein- und Ausgaben Ihres Kollegen in Echtzeit sehen können .

  1. Sie und der Mitarbeiter melden sich in ssh als derselbe Unix-Benutzer an
  2. Sie geben den Befehl ein

    screen -d -m -S myscreenname

    screen -x myscreenname

    (Ersetzen Sie natürlich myscreenname durch den gewünschten Bildschirmnamen).

  3. Der Mitarbeiter gibt den Befehl ein

    screen -x myscreenname

  4. Zum Abschluss der Freigabe Ihrer Unix-Terminals kann jede Person den Befehl eingeben

    exit

Die großartige Funktion des Bildschirms besteht darin, dass Sie Befehle von Ihrem Unix-Terminal aus eingeben können und die Mitarbeiter die Ausgabe auf ihrem Bildschirm sehen können. Dies ist eine hervorragende Möglichkeit, um Junior-Unix-Administratoren zu verwalten und zu betreuen.


0

Um die Antwort von @ jordanm zu vervollständigen ... wenn Sie beide dasselbe Benutzerkonto verwenden, dh die Ausgabe von

echo $HOSTNAME
echo $USER 

Ist das gleiche für Sie und Ihren Kollegen, dann können wir etwas Spaß haben.

Wir können die Anzeige für aufgerufene Befehle in einem Terminal aktivieren, damit sie sofort in einem anderen Terminal verfügbar sind

Wenn Sie historyin Ihrem Terminal aufrufen , sehen Sie Ihre vorherigen Befehle. Standardmäßig schreibt bash seinen Verlauf am Ende jeder Sitzung in a ~/.bash_history fileund überschreibt die vorhandene Datei mit einer aktualisierten Version. Dies bedeutet, dass, wenn Sie mit mehreren Bash-Sitzungen angemeldet sind, nur der letzte, der beendet wird, dessen Verlauf gespeichert wird.

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

Bearbeiten Sie Ihre ~/.bashrcund fügen Sie sie hinzu

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

wo

history -awird an die ~/.bash_historyDatei angehängt und nicht am Ende der Sitzung

history -c Löscht den aktuellen Sitzungsverlauf

history -rLiest die ~/.bash_historyangehängte Datei zurück in unseren Sitzungsverlauf

Hinweis: Der PROMPT_COMMANDParameter enthält Befehle, die vor jeder neuen Eingabeaufforderung ausgeführt werden. so command1 wird nur Geschichte gespeichert werden , wenn command2 ausgeführt

Möglicherweise möchten Sie auch einen Zeitstempel neben jeden Befehl setzen, um das Anzeigen des Verlaufs zu vereinfachen. Bearbeiten Sie erneut Ihre ~/.bashrcund fügen Sie sie hinzu

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

Auch ein netter Hack, wenn Sie mehrere Terminals verwenden möchten und Ihre Befehlshistorie verfügbar haben möchten :)

Mehr Info

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.