OpenSSH ha un'opzione chiamata LocalCommandche esegue un comando sul lato client quando si effettua una connessione ssh. Sfortunatamente, esegue il comando prima che venga stabilita la sessione ssh, non successivamente. Ma questo mi ha dato l'idea che avrei potuto in qualche modo riuscire a far sì che quel processo precedente attendesse il termine della sessione SSH. Nonostante il fatto che il processo ssh sia il PID padre del LocalCommand, si scopre che non è ancora così facile.
Tuttavia, ho trovato qualcosa che funziona per me su MacOS X e dovrebbe funzionare su (altri) BSD, se non su Linux. Ho scritto un piccolo programma C che utilizza l' kqueue()interfaccia per attendere sul proprio ppid e quindi eseguire un comando fornito una volta terminato il processo. (Elenco dei codici sorgente di seguito, per coloro che sono interessati.)
Ora devo solo fare riferimento a questo programma nel mio ~/.ssh/configfile:
host hp-switch*
PermitLocalCommand yes
LocalCommand ~/bin/wait4parent 'tput smam'
E questo sembra funzionare bene. Quelli di voi su Linux ... Immagino che possiate provare lo stesso genere di sondaggi per LocalCommandil PPID e spero che quel PID non venga riutilizzato. (Vedi /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);
}