我有一些我通过SSHlogin的HP交换机。 交换机发送一个terminal命令来禁用换行(terminfo说法中的“rmam”),但是无法重新启用它,在我退出ssh会话后,终止了我的terminal。 我可以运行tput smam来修复terminal。
有什么办法让我的SSH会话结束后自动运行该命令的SSH?
它不会杀了我运行它作为一个shell自动命令,或别名ssh以后总是运行该命令,但我宁愿通过SSH解决这个问题,以便我可以限制命令刚刚运行后,我连接到已知的主机。
我的SSH客户端是OpenSSH_6.2p2,但如果有某个新function,我可以更改或更新。
OpenSSH有一个名为LocalCommand的选项,当你build立一个ssh连接时,在客户端运行一个命令。 不幸的是,它在ssh会话build立之前运行命令,而不是之后。 但是,这给了我一个想法,我可能以某种方式能够让上述过程等待ssh会话结束。 尽pipessh进程是LocalCommand的父PID,事实certificate它仍然不是那么容易。
但是,在MacOS X下,我发现了一些适用于我的东西,如果不是Linux,也应该在其他的BSD上工作。 我写了一个小型的C程序,它使用kqueue()接口等待它自己的ppid,然后在该进程退出时运行提供的命令。 (源代码如下,对于那些有兴趣的人。)
现在我只需要在我的~/.ssh/config文件中引用这个程序:
host hp-switch* PermitLocalCommand yes LocalCommand ~/bin/wait4parent 'tput smam'
这似乎工作得很好。 那些在Linux上的人…我想你可以通过轮询LocalCommand的ppid来尝试同样的事情,并希望这个pid不会被重用。 (请参阅https://stackoverflow.com/questions/1157700/how-to-wait-for-exit-of-non-children-processes )
wait4parent.c:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/event.h> #include <sys/time.h> int main(int argc, char **argv) { pid_t ppid, fpid; struct kevent kev; int kq; int kret; struct timespec timeout; if ( argc > 2 ) { fprintf(stderr, "Please quote the command you want to run\n"); exit(-1); } ppid = getppid(); fpid = fork(); if ( fpid == -1 ) { perror("fork"); exit(-1); } if ( fpid != 0 ) { exit(0); } EV_SET(&kev, ppid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, 0); kq = kqueue(); if ( kq == -1 ) { perror("kqueue"); exit(-1); } kret = kevent(kq, &kev, 1, NULL, 0, NULL); if ( kret == -1 ) { perror("kevent"); exit(-1); } timeout.tv_sec = ( 8 /*hours*/ * 60 /*minutes per hour*/ * 60 /*seconds per minute*/ ); timeout.tv_nsec = 0; kret = kevent(kq, NULL, 0, &kev, 1, &timeout); if ( kret == -1 ) { perror("kevent"); exit(-1); } if ( kret > 0 ) { system(argv[1]); } /* ( kret == 0 ) means timeout; don't do anything */ exit(0); }
你可以为此做一个简单的ssh包装器,并在其中指定要在ssh之后运行的命令,例如
nox:〜$ fssh foo foo:〜$ id uid = 0(root)gid = 0(root)groups = 0(root) foo:〜$ exit 登出 连接到1.2.3.4closures。 Thu Oct 30 19:01:35 CET 2014 nox:〜$ cat bin / fssh #!/斌/庆典 eval ssh'$ @' RC = $? date 退出“$ rc”