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

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

有没有办法在执行命令时观察另一个 shell 中正在执行哪些命令?两个 shell 都是 bash,而且我有 root 访问权限,如果这很重要的话。我无法安装任何额外的软件,并且我不希望其他 shell 必须执行任何特殊操作,例如运行屏幕。

情况:我远程登录到 Linux 计算机,同事也是如此。我想查看她在 shell 中运行的命令。我知道我可以使用watch和的某种组合ps来查看任何运行时间超过一秒的命令,但我不认为这对非常短的命令有帮助。

答案1

既然你是root,你就永远可以strace -f -e execve -p her_bash_pid。这-f是必要的,因为她的 shell 会在 之前分叉一个新进程exec,但这也意味着您也将看到子进程执行的任何内容。

答案2

如果您的同事可以修改其 bash shell 的某些历史设置,那么您可以从 tail -f /home/user/.bash_history 获取此信息。以下是在每个命令之后而不是在 shell 退出时写入 .bash_history 所需的设置:

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

不过,我认为屏幕会话是一个“理想”的解决方案。

答案3

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

  • 阅读她的 bash_history。但通常只写在注销时。askubuntu.com有一篇关于改变这种行为的帖子(编辑@乔丹显然有相同的想法并且发布速度更快......)。
  • 如果她在物理终端 (/dev/ttyX) 上,您可以使用该程序conspy
  • 让她利用screen。如果您只是想提供帮助而不是监视她,她可能愿意在屏幕内运行她的会话。然后您可以简单地附加到她的会话sudo -u herUsername screen -x
  • 您可以编写一个 shell 包装脚本,将命令记录到您选择的日志文件中。您必须将她的 shell 设置为该脚本(这只是一个想法,它可能有效也可能无效)。
  • 使用cat /dev/pts/X | tee /dev/pts/X是我首先想到的。但尝试后并没有真正起作用,并且是一个非常肮脏的解决方案。每个字符仅打印到一个连接的终端(这tee也是调用的原因)。尝试时我可以监视每一个角色。只要稍微发挥一下想象力,你就能猜到她在做什么……

答案4

去完成@乔丹的答案...如果你们都使用相同的用户帐户,即输出

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包含执行的命令每个新的命令提示符。所以命令1仅当以下情况时才会保存到历史记录中命令2被执行

您可能还想在每个命令旁边添加一个时间戳,以方便查看历史记录。再次编辑~/.bashrc并附加

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

如果您喜欢使用多个终端并希望获得可用的命令历史记录,这也是一个不错的技巧:)

更多信息

相关内容