如何查看在另一个shell中执行的命令?


9

有什么方法可以观察正在执行的命令在另一个shell中的执行情况?两个shell都是bash,如果有关系的话,我具有root用户访问权限。我无法安装任何额外的软件,并且我不希望其他外壳必须执行任何特殊操作,例如运行屏幕。

情况:我远程登录了Linux计算机,同事也是如此。我想看看她正在外壳中运行的命令。我知道我可以结合使用watchps来查看所有需要花费一秒钟以上时间才能运行的命令,但是我认为这对于非常短的命令没有帮助。


5
内置命令(例如)kill,并且cd不会产生子进程,并且永远不会出现在ps输出中。
jordanm 2012年

@jordanm谢谢,这很不错。即使仅使用引起fork / exec的命令,也可能已经足够了。
汤姆·潘宁

Answers:


7

既然您是root,就可以一直strace -f -e execve -p her_bash_pid-f之所以必须这样做,是因为她的shell将在之前派生一个新进程exec,但这也意味着您还将看到子进程也执行的任何内容。


谢谢,grep sexec的strace的输出使其相当可读。我相信它会一直跟随着有孩子的孩子,这一事实会让我迷惑不解,但就目前而言,我认为我会很安全。遗憾的是,在调用exec之后无法自动从进程中分离出来。
汤姆·潘宁

它是开源的;如果确实需要,可以随时添加该功能。:)或添加一个稍微更智能的脚本来解析strace输出,该输出将忽略PID之后的输出exec
吉姆·巴黎

5

如果您的同事可以修改其bash shell的某些历史记录设置,则可以从tail -f /home/user/.bash_history获取此信息。这是在每个命令之后而不是在shell出口上编写.bash_history所需的设置:

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

我认为屏幕会议是“理想的”解决方案。


5

经过快速研究(和一些思考),我可以为您提供以下可能的选择列表:

  • 阅读她的bash_history。但是它通常仅在注销时写入。askubuntu.com上有一篇关于改变这种行为的帖子(编辑@jordanm显然具有相同的想法,并且发布速度更快...)。
  • 如果她在物理终端(/ dev / ttyX)上,则可以使用该程序conspy
  • 利用她screen。如果您只是想帮助而不是监视她,则她可能愿意在屏幕上运行她的会话。然后,您可以通过以下方式附加到她的会话中sudo -u herUsername screen -x
  • 您可以编写一个Shell包装程序脚本,将命令记录到您选择的日志文件中。您必须将她的shell设置为该脚本(这只是一个主意,可能有效也可能无效)。
  • 使用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. 您和同事在ssh中以相同的Unix用户身份登录
  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在每个会话结束时将其历史记录写入~/.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我们附加到的文件,回到会话历史记录中

注意:PROMPT_COMMAND参数包含每个新命令提示符之前执行的命令。因此,仅当执行command2时,command1才会保存到历史记录中

在查看历史记录时,您可能还希望在每个命令旁边加上一个时间戳。再次,编辑您的~/.bashrc并追加

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

如果您想使用多个终端并且想要使用命令历史记录,这也是一个不错的技巧:)

更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.