有没有办法在执行命令时观察另一个 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 "
如果您喜欢使用多个终端并希望获得可用的命令历史记录,这也是一个不错的技巧:)