我有一些通过 ssh 登录的 HP 交换机。开关发送一个终端命令来禁用换行(terminfo 用语中的“rmam”),但随后无法重新启用它,这在我退出 ssh 会话后搞砸了我的终端。我可以通过运行来修复终端tput smam
。
有没有办法让 ssh 在我的 ssh 会话结束后自动运行该命令?
将它作为 shell 自动命令运行,或者ssh
在之后始终运行该命令的别名不会杀死我,但我更愿意通过 ssh 解决问题,以便我可以限制命令仅在我连接到已知后运行-坏主机。
我的 ssh 客户端是 OpenSSH_6.2p2,但如果某处有新功能,我可以更改或更新。
OpenSSH 有一个名为的选项
LocalCommand
,当您建立 ssh 连接时,它会在客户端运行命令。不幸的是,它在 ssh 会话建立之前运行命令,而不是之后。但这给了我一个想法,即我可能能够以某种方式让前面的进程等待 ssh 会话结束。尽管 ssh 进程是 LocalCommand 的父 PID,但事实证明它仍然不是那么容易。但是,我确实找到了在 MacOS X 下对我有用的东西,并且应该在(其他)BSD 上工作,如果不是 Linux 的话。我编写了一个小的 C 程序,它使用该
kqueue()
接口等待自己的 ppid,然后在该进程退出后运行提供的命令。(下面的源代码清单,有兴趣的人。)现在我只需要在我的
~/.ssh/config
文件中引用这个程序:这似乎工作得很好。那些在 Linux 上的人……我想你可以通过轮询 's ppid 来尝试同样的事情,
LocalCommand
并希望该 pid 不会被重用。(见https://stackoverflow.com/questions/1157700/how-to-wait-for-exit-of-non-children-processes)wait4parent.c:
您可以为此制作简单的 ssh 包装器,并在其中指定要在 ssh 之后运行的命令,例如