我正在配置堡垒主机
跳转服务器
我正在尝试自动记录服务器中的 SSH 终端,我正在使用。当我将以下内容添加到我的TermRecord
时,问题就开始了:TermRecord -o ss.html
.bashrc
echo "TermRecord -o ss.html" >> ~/.bashrc
终端将充斥着“脚本已启动”而不保存任何内容。
答案1
我对此完全没有经验TermRecord
,我的回答是基于对发生的事情的合理(我希望如此)猜测。
它看起来再次喜欢TermRecord
来源.bashrc
,或者更有可能的是它运行另一个bash
提供文件来源的地方。我认为后者无论如何它TermRecord
再次运行,又有另一个bash
来源.bashrc
,等等。
如果这阻止您登录,请参阅无需运行即可登录bash_profile
或bashrc
。我会尝试从那里ssh -t username@hostname /bin/sh
修复我的问题。.bashrc
为了使其按预期工作,您需要找到一种方法来抑制执行TermRecord
if already inside TermRecord
。最好的方法是如果程序向环境中添加了某个变量,那么您就可以检测到它。我找不到它是否设置了任何变量。
如果没有,你可以自己做。而不是
TermRecord -o ss.html
在你的.bashrc
使用中是这样的:
[ -z "$TR_PPID" ] && { export TR_PPID=$$; TermRecord -o ss.html; }
意思是:如果变量为空,就将其设置为shell PID并运行TermRecord
;否则不执行任何操作(继续下一行)。
笔记:
- 确保命名的变量
TR_PPID
未被其他任何变量使用TermRecord
。这个名字是我编造的(来自“TermRecord parend PID”),但可能会有冲突。 -o ss.html
如果您多次登录,硬编码可能会带来麻烦。- 如果
TermRecord
执行,则其余部分将在退出时.bashrc
由外部提供。内部将自行提供文件。bash
TermRecord
bash
- 为了避免嵌套进程,您可以考虑用 替换外部进程,
bash
而TermRecord
不是创建单独的进程;可以使用 来完成exec TermRecord -o ss.html
。在这种情况下,您可能希望整行都位于 的最开头.bashrc
。现在变量将表示“TermRecord PID”,因此这TR_PID
将是一个更好的名称。
可能的(?) 替代方案:用作TermRecord
您的登录 shell。
- 只有当它支持作为登录 shell 时才可以(我不知道这一点);否则可能会造成麻烦(但也许自定义包装器可以修复它)。更改登录 shell 的实验(请参阅
chsh
)应该在不离开旧 shell 甚至不使用额外的“紧急 shell”的情况下进行。如果您以任何方式将自己锁定并且无法重新登录,您仍然可以使用旧 shell 进行修复。 - 这可能需要编辑
/etc/shells
。 - 在这种情况下,您根本就不应该
TermRecord
从您的开始。.bashrc
答案2
据我了解,您希望在 ssh 连接到服务器时记录所有终端 stdin/stdout?
考虑使用 脚本命令
script <output_filename>
然后 ssh 到你的服务器,完成后关闭你的 ssh 连接并
exit
要停止脚本录制,您提供的 $output_filename 将位于您当前的目录中。
附言:你可以使用以下约定来确保你的录音始终具有唯一的名称
script foo_$(date +"%Y-%m-%d%H%M") # full date and time included in filename
或者
script foo_$(date +%s) # unique number calculate by seconds since the Unix epoch