OpenSSH hat eine Option namens LocalCommand, die einen Befehl auf der Clientseite ausführt, wenn Sie eine SSH-Verbindung herstellen. Leider wird der Befehl ausgeführt, bevor die SSH-Sitzung eingerichtet wurde, nicht danach. Aber das brachte mich auf die Idee, dass ich den vorhergehenden Prozess irgendwie dazu bringen könnte, auf das Ende der SSH-Sitzung zu warten. Trotz der Tatsache, dass der ssh-Prozess die übergeordnete PID des LocalCommand ist, stellt sich heraus, dass es immer noch nicht so einfach ist.
Ich habe jedoch etwas gefunden, das unter MacOS X für mich funktioniert, und sollte auf (anderen) BSDs funktionieren, wenn nicht auf Linux. Ich habe ein kleines C-Programm geschrieben, das die kqueue()Schnittstelle verwendet, um auf seine eigene ppid zu warten und dann einen bereitgestellten Befehl auszuführen, sobald dieser Prozess beendet wird. (Quellcode-Liste unten für Interessierte.)
Jetzt muss ich nur noch auf dieses Programm in meiner ~/.ssh/configDatei verweisen :
host hp-switch*
PermitLocalCommand yes
LocalCommand ~/bin/wait4parent 'tput smam'
Und das scheint gut zu funktionieren. Diejenigen von euch , auf Linux ... Ich denke , Sie können versuchen , die gleiche Art der Sache durch die Abfrage für LocalCommand‚s ppid und die Hoffnung , dass die pid nicht wiederverwendet erhalten. (Siehe /programming/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);
}