¿Cómo ver los comandos ejecutados en otro shell?

9

¿Hay alguna manera de ver qué comandos se ejecutan en otro shell, mientras se ejecutan? Ambos shells son bash, y tengo acceso de root, si eso importa. No puedo instalar ningún software adicional, y no quiero que el otro shell tenga que hacer nada especial como ejecutar la pantalla.

Situación: estoy conectado remotamente a una máquina Linux, y también lo es un compañero de trabajo. Me gustaría ver los comandos que está ejecutando en su caparazón. Sé que podría usar alguna combinación de watchy psver cualquier comando que demore más de un segundo en ejecutarse, pero no creo que eso ayude con comandos muy cortos.

Toma panorámica
fuente
55
Los comandos incorporados como kill, y cdno generan subprocesos y nunca aparecerían en la salida ps.
jordanm
@jordanm Gracias, ese es un buen punto. Incluso con solo los comandos que causan un fork / exec, eso probablemente sería lo suficientemente bueno.
Tom Panning

Respuestas:

7

Como eres root, siempre podrías strace -f -e execve -p her_bash_pid. Esto -fes necesario porque su shell bifurcará un nuevo proceso antes del exec, pero esto también significa que también verá todo lo que los procesos secundarios ejecutan.

Jim Paris
fuente
Gracias, el resultado de grepping strace para exec lo hace bastante legible. Estoy seguro de que el hecho de que siga a los hijos de niños me confundirá algún día, pero por ahora creo que estaré a salvo. Es una pena que no haya forma de separarse automáticamente de un proceso después de que llame a exec.
Tom Panning
Es de código abierto; siempre puedes agregar esa función si realmente la necesitas. :) O agregue un script un poco más inteligente que analice la salida de strace que ignora un PID una vez que execes.
Jim Paris
5

Si su compañero de trabajo puede modificar algunas configuraciones de historial para su shell bash, entonces puede obtener esta información en tail -f /home/user/.bash_history. Aquí está la configuración que necesitará para que .bash_history se escriba después de cada comando, en lugar de en la salida de shell:

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

Sin embargo, consideraría que una sesión de pantalla es una solución "ideal".

jordanm
fuente
5

Después de una investigación rápida (y algunas reflexiones) puedo darle la siguiente lista de posibles opciones:

  • lee su bash_history. Pero generalmente solo se escribe al cerrar sesión. askubuntu.com tiene una publicación sobre cómo cambiar ese comportamiento ( editar : @jordanm aparentemente tuvo la misma idea y fue más rápido para publicar ...).
  • Si ella estaba en una terminal física (/ dev / ttyX), podría usar el programa conspy.
  • Hazla usar screen. Si solo quieres ayudarla y no espiarla, ella podría estar dispuesta a ejecutar su sesión dentro de la pantalla. Entonces puede simplemente adjuntar a su sesión porsudo -u herUsername screen -x
  • Podría escribir un script de envoltura de shell que registre los comandos en un archivo de registro de su elección. Tendría que configurar su shell para ese script (Esto es solo una idea, podría o no funcionar).
  • Usar cat /dev/pts/X | tee /dev/pts/Xfue lo primero que me vino a la mente. Pero después de intentarlo realmente no funciona y es una solución muy sucia. Cada carácter solo se imprime en uno de los terminales conectados (que también es la razón para llamar tee). Al probarlo, podía espiar a cada segundo personaje. Con un poco de imaginación, podrías adivinar lo que está haciendo ...
mreithub
fuente
mal: conspy no funciona con ttys
Zibri
3

La pantalla de GNU es IMO, la mejor recomendación hasta ahora. Si la pantalla GNU (o tmux) no está disponible, ejecute a su compañero de trabajo script -f.

Y luego puedes ver lo que está haciendo haciendo tail -fn +0 /path/to/typescript.

Stéphane Chazelas
fuente
0

Para compartir un terminal de pantalla Unix, para que pueda ver las entradas y salidas de su compañero de trabajo en tiempo real, use el screencomando Unix .

  1. Usted y el compañero de trabajo inician sesión como el mismo usuario de Unix en ssh
  2. Escribe el comando

    screen -d -m -S myscreenname

    screen -x myscreenname

    (Por supuesto, reemplace myscreenname con lo que quiera que sea el nombre de usuario).

  3. El compañero de trabajo teclea el comando

    screen -x myscreenname

  4. Para terminar de compartir sus terminales Unix, cualquier persona puede escribir el comando

    exit

La gran característica de la pantalla es que puede escribir comandos desde su terminal Unix y el compañero de trabajo puede ver la salida en su pantalla. Es una excelente manera de hacer administración de pares y mentor de administradores junior de Unix.

Jirawat Uttayaya
fuente
0

Para completar la respuesta de @ jordanm ... si ambos usan la misma cuenta de usuario, es decir, la salida de

echo $HOSTNAME
echo $USER 

es lo mismo para usted y su compañero de trabajo, entonces podemos divertirnos un poco.

Podemos habilitar la visualización de comandos invocados en un terminal para que esté disponible instantáneamente en otro

Si invoca historyen su terminal, verá sus comandos anteriores. De forma predeterminada, bash escribe su historial al final de cada sesión en una ~/.bash_history file, sobrescribiendo el archivo existente con una versión actualizada. Esto significa que si ha iniciado sesión con varias sesiones de bash, solo se guardará el historial de la última en salir.

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

Edite su ~/.bashrcy agréguelo

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

dónde

history -aagrega al ~/.bash_historyarchivo inmediatamente en lugar de al final de la sesión

history -c borra el historial de la sesión actual

history -rlee el ~/.bash_historyarchivo al que hemos añadido, de nuevo en nuestro historial de sesiones

Nota: el PROMPT_COMMANDparámetro contiene comandos que se ejecutan antes de cada nuevo símbolo del sistema. entonces command1 solo se guardará en el historial cuando se ejecute command2

Es posible que también desee colocar una marca de tiempo junto a cada comando para su comodidad al ver el historial. Nuevamente, edite su ~/.bashrcy agregue

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

También es un buen truco si te gusta usar múltiples terminales y te gusta tener tu historial de comandos disponibles :)

Más información

hermano-bilo
fuente