Ssh অধিবেশন শেষ হওয়ার পরে স্থানীয় কমান্ড চালান


9

আমার কিছু এইচপি সুইচ রয়েছে যা আমি এসএসএসের মাধ্যমে লগ ইন করে। সুইচগুলি লাইন মোড়কে অক্ষম করতে একটি টার্মিনাল কমান্ড প্রেরণ করে ("rmam" টার্মিনফো পার্লেন্সে), তবে তারপরে এটি পুনরায় সক্ষম করতে ব্যর্থ হয়, যা ssh সেশন থেকে বেরিয়ে যাওয়ার পরে আমার টার্মিনালটিকে স্ক্রু করে দেয়। আমি চালিয়ে টার্মিনাল ঠিক করতে পারি tput smam

আমার ssh অধিবেশন শেষ হওয়ার পরে স্বয়ংক্রিয়ভাবে কমান্ডটি চালানোর জন্য এসএসএস পাওয়ার কোনও উপায় আছে কি?

এটি শেল অটোকম্যান্ড হিসাবে চালানোর জন্য আমাকে হত্যা করতে হবে না, বা sshপরে উক্ত কমান্ডটি সর্বদা চালানোর জন্য ওরফে হবে না, তবে আমি ssh এর মাধ্যমে সমস্যাটি সমাধান করতে পছন্দ করব যাতে আমি পরিচিতির সাথে সংযোগ স্থাপনের পরে কমান্ডটি চালানোর জন্য সীমাবদ্ধ রাখতে পারি known -ব্যাড হোস্ট।

আমার ssh ক্লায়েন্টটি OpenSSH_6.2p2, তবে কোথাও কোনও নতুন বৈশিষ্ট্য উপস্থিত থাকলে আমি পরিবর্তন বা আপডেট করতে পারি।


আমি কখনই কোনও সমাধান খুঁজে পাইনি ... টেলনেট ব্যবহার করুন;) অথবা কেবল একটি পৃথক টার্মিনাল উইন্ডো ব্যবহার করুন।
ew

একবার বন্ধ ব্যবহারের জন্য সর্বদা ডাবল অ্যাম্পারস্যান্ড থাকে। ssh 1.2.3.4 && tput smam
হেনেস

@ নিউ হোয়াইট: আপনি বলতে চাচ্ছেন যে ফিক্সটি স্বয়ংক্রিয় করার কোনও উপায় আপনি কখনই খুঁজে পাননি? যদি না হয়, ঠিক ঠিক সেখানে প্রশ্ন আছে। এছাড়াও, যখন আমি জানি আপনি কৌতুক করছেন, ঠিক তেমনটি নয় যে সুইচটি আমার টার্মিনালটিতে ক্র্যাঙ্কিং এড়ানো হবে কারণ কেবল সংযোগটি এনক্রিপ্ট করা নেই।
wfaulk

উত্তর:


8

ওপেনএসএইচ-এর একটি বিকল্প রয়েছে 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);
}

2
অসাধারণ! আমি এই স্ক্রিপ্টটি ম্যাকটিতে ব্যবহার করেছি এবং অন্য একটি সিস্টেম কল যুক্ত করেছি যাতে আমার একটি লোকাল কমান্ড রান আপফ্রন্ট (প্রোলগ) থাকতে পারে এবং তারপরে দ্বিতীয় কমান্ডের জন্য অধিবেশন চালানোর জন্য অপেক্ষা করুন (পর্ব)।
কেভিন লি

1
আমি ধারণাটি নিয়েছি এবং কোডটি কিছুটা উন্নত করেছি। আপনি টুল জানতে পারেন GitHub থেকে
drinchev

4

আপনি এটির জন্য সহজ ssh মোড়কে তৈরি করতে পারেন এবং এতে ssh এর পরে চালানোর জন্য আদেশগুলি নির্দিষ্ট করে

nox: ~ $ fssh foo
foo: ~ $ id
uid = 0 (মূল) জিড = 0 (মূল) গোষ্ঠী = 0 (মূল)
foo: ~ $ প্রস্থান
প্রস্থান
1.2.3.4 এর সাথে সংযোগ বন্ধ রয়েছে।
30 অক্টোবর 19:01:35 সিইটি 2014
nox: $ $ বিড়াল বিন / fssh 
#! / বিন / ব্যাশ

eval ssh '$ @'
RC = $?
তারিখ
"$ আরসি" থেকে প্রস্থান করুন

2
হ্যাঁ, আমি বলেছিলাম আমি এটি করতে পারি। (সত্যি বলতে গেলে, আমি অনুমান করি যে আমি কেবল "ওরফে" বলেছি এবং "মোড়ক স্ক্রিপ্ট" নয়)) নির্বিশেষে, আপনি কেন এটি চান তা নিশ্চিত নই eval। এটি ডাবল-কোটিংয়ের সুবিধাটিকে ছুঁড়ে ফেলেছে $@
wfaulk

চেষ্টা কর; আপনি এখনও এসএসএইচের সাথে সরাসরি কথা বলার মতো স্বাভাবিকভাবেই (একক এবং দ্বিগুণ উদ্ধৃতি উভয়ই) উদ্ধৃতি ব্যবহার করতে পারেন। আমি ইল ব্যবহার করলাম কারণ আমার এমন পরিস্থিতি হয়েছিল যেখানে আমি নির্মান কমান্ডের আসল প্রস্থান কোড ক্যাপচার করা সম্ভব ছিল না যতক্ষণ না আমি সম্পূর্ণ নির্মিত বিবৃতিটি না প্রমাণ করি।
হ্রভোয়েপ্পলজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.