OpenSSH có một tùy chọn được gọi là LocalCommand
chạy một lệnh ở phía máy khách khi bạn thực hiện kết nối ssh. Thật không may, nó chạy lệnh trước khi phiên ssh được thiết lập, không phải sau đó. Nhưng điều đó đã cho tôi ý tưởng rằng bằng cách nào đó tôi có thể có được quy trình trước đó để chờ phiên ssh kết thúc. Mặc dù thực tế rằng quá trình ssh là PID chính của LocalCommand, nhưng hóa ra nó vẫn không dễ dàng như vậy.
Tuy nhiên, tôi đã tìm thấy thứ gì đó phù hợp với tôi trong MacOS X và phải hoạt động trên (các) BSD khác, nếu không phải là Linux. Tôi đã viết một chương trình C nhỏ sử dụng kqueue()
giao diện để chờ ppid của chính nó và sau đó chạy lệnh được cung cấp khi quá trình đó thoát. (Danh sách mã nguồn dưới đây, cho những người quan tâm.)
Bây giờ tôi chỉ cần tham khảo chương trình này trong ~/.ssh/config
tập tin của mình :
host hp-switch*
PermitLocalCommand yes
LocalCommand ~/bin/wait4parent 'tput smam'
Và điều này dường như chỉ hoạt động tốt. Những người trong số bạn trên Linux, tôi đoán bạn có thể thử điều tương tự bằng cách bỏ phiếu cho LocalCommand
ppid và hy vọng rằng pid không được sử dụng lại. (Xem /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);
}