ওপেনএসএইচ-এর একটি বিকল্প রয়েছে LocalCommand
যা ক্লায়েন্টের পক্ষে কমান্ড চালায় যখন আপনি এসএস সংযোগ করেন। দুর্ভাগ্যক্রমে, এটি ssh অধিবেশন প্রতিষ্ঠার আগে কমান্ড চালায় , পরে নয়। তবে এটি আমাকে ধারণা দিয়েছে যে আমি কোনওভাবে সেই পূর্ববর্তী প্রক্রিয়াটি ssh অধিবেশন শেষ হওয়ার অপেক্ষা করতে সক্ষম হতে পারি। Ssh প্রক্রিয়া লোকালকমন্ডের প্যারেন্ট পিআইডি হওয়া সত্ত্বেও দেখা গেছে যে এটি এখনও এত সহজ নয়।
তবে, আমি এমন কিছু পেয়েছি যা ম্যাকস এক্স এর অধীনে আমার জন্য কাজ করে এবং লিনাক্স না হলে (অন্যান্য) বিএসডি-তে কাজ করা উচিত। আমি একটি ছোট সি প্রোগ্রাম লিখেছি যা kqueue()
ইন্টারফেসটি তার নিজের পিপিডের জন্য অপেক্ষা করতে এবং তারপরে প্রক্রিয়াটি শেষ হয়ে গেলে সরবরাহিত কমান্ড চালায়। (উত্স কোডের তালিকা নীচে, যারা আগ্রহী তাদের জন্য।)
এখন আমি এই ~/.ssh/config
ফাইলটি আমার ফাইলটিতে উল্লেখ করতে পারি :
host hp-switch*
PermitLocalCommand yes
LocalCommand ~/bin/wait4parent 'tput smam'
এবং এটি ঠিক কাজ করে বলে মনে হচ্ছে। লিনাক্সে আপনারা ... আমার ধারণা, আপনি LocalCommand
পিপিডের জন্য ভোট দিয়ে একই ধরণের জিনিসটি চেষ্টা করতে পারেন এবং আশা করি যে পিডটি পুনরায় ব্যবহার না হয়ে যায়। ( 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);
}