2009-09-10 14 views
46

मैं एक बैश स्क्रिप्ट बनाने की प्रक्रिया में हूं जो दूरस्थ मशीनों में लॉग इन करेगा और निजी और सार्वजनिक कुंजी बनायेगा।एसएसएच कनेक्शन की जांच के लिए बैश स्क्रिप्ट कैसे बनाएं?

मेरी समस्या यह है कि रिमोट मशीन बहुत विश्वसनीय नहीं हैं, और वे हमेशा नहीं होते हैं। मुझे एक बैश स्क्रिप्ट चाहिए जो जांच करेगी कि एसएसएच कनेक्शन ऊपर है या नहीं। वास्तव में भविष्य के उपयोग के लिए कुंजी बनाने से पहले।

$ ssh -q [email protected] exit 
$ echo $? 
255 

$ ssh -q [email protected] exit 
$ echo $? 
0 

संपादित करें:

+2

आम तौर पर, स्थानीय मशीन पर एक कीपैयर उत्पन्न करने के लिए 'ssh-keygen' चलाता है, फिर' ssh-copy-id' को दूरस्थ मशीनों पर सार्वजनिक कुंजी की प्रतिलिपि बनाने के लिए चलाता है। ऐसा लगता है कि आप चीजों को अलग-अलग कर रहे हैं। क्यों, आपका लक्ष्य क्या है? – ephemient

+1

चूंकि आप स्पष्ट रूप से बदल रहे हैं कि दूरस्थ मशीन कनेक्शन कैसे स्थापित करती हैं, * mosh * को तैनात करने पर विचार करें। http://mosh.mit.edu/ यह अस्थिर कनेक्शन पर एसएसएच पूरक करने का इरादा है। मेरे पास इसके साथ बहुत अच्छे अनुभव हैं। – Aeyoun

उत्तर

92

आप निवेश-मूल्य ssh के साथ इस जाँच कर सकते हैं आप देता है एक और दृष्टिकोण nmap उपयोग करने के लिए किया जाएगा (आप कुंजी या लॉगिन-सामान की जरूरत नहीं होगी):

$ a=`nmap uphost -PN -p ssh | grep open` 
$ b=`nmap downhost -PN -p ssh | grep open` 

$ echo $a 
22/tcp open ssh 
$ echo $b 
(empty string) 

लेकिन आपको संदेश को grep करना होगा (nmap यह दिखाने के लिए रिटर्न-वैल्यू का उपयोग नहीं करता है कि पोर्ट को फ़िल्टर किया गया है, बंद या खुला है)।

EDIT2:

आप ssh-बंदरगाह की वास्तविक राज्य में रुचि रखते हैं, तो आप egrep 'open|closed|filtered' साथ grep open स्थानापन्न कर सकते हैं:

$ nmap host -PN -p ssh | egrep 'open|closed|filtered' 

बस पूरा किया जाना है।

+0

पूरा होने के लिए, क्या आप इंगित कर सकते हैं कि कौन सा रिटर्न कोड सफलता का मतलब है और जिसका मतलब एसएसएच में विफलता है? –

+0

आश्चर्य है कि अगर एसएसएच प्रयास बस वहां लटकता है तो क्या होगा? –

+1

महान जवाब! हालांकि, आप इस बात का जिक्र नहीं करते कि डाउन होस्ट में 'ssh' करने का प्रयास केवल समय के बाद विफल रहता है।60 सेकंड - जो कुछ उपयोगों के लिए निषिद्ध हो सकता है। साथ ही, यदि मेजबाननाम '~/.ssh/config' में परिभाषित किया गया है, तो पहला' ssh' दृष्टिकोण काम करता है जबकि दूसरा 'nmap' तरीका' हल करने में विफल ' "' के साथ विफल रहता है। – ssc

-2

मुझे लगता है कि आप यहां गलत समस्या को हल करने का प्रयास कर रहे हैं। क्या आप एसएसएच डिमन्स को अधिक स्थिर बनाने की कोशिश नहीं कर रहे हैं? monit जैसे कुछ चलाने का प्रयास करें, जो यह देखने के लिए जांच करेगा कि क्या डिमन चल रहा है या नहीं, अगर यह नहीं है (आपको एसएसडीडी के पीछे रूट समस्या को ढूंढने का समय दे रहा है)। या नेटवर्क सेवा परेशानी है? man ifup पर देखने का प्रयास करें। क्या पूरे डर चीज सिर्फ आप को बंद करना पसंद है? खैर, यह एक बड़ी समस्या है ... अपने बॉक्स को नीचे बंद कर रहे हार्डवेयर असफलताओं या सेवाओं को खोजने के लिए अपने लॉग (syslog से शुरू करें) को देखने का प्रयास करें (शायद एक तापमान मॉनीटर?)।

अपनी स्क्रिप्ट्स गलती सहिष्णु बनाना बहुत अच्छा है, लेकिन आप अपने बॉक्सन गलती को सहिष्णु बनाना भी चाहेंगे।

+2

काम नहीं करता है सैम: स्क्रिप्ट की जांच करने के लिए वैध उपयोग के मामले हैं। उदा। (मेरे जैसा): मेरे पास मेरे मशीन पर rsync के माध्यम से मेरे डेटा को बैकअप करने के लिए मेरी मशीन पर एक क्रॉन नौकरी चल रही है। अब मैं बाहर या यहां तक ​​कि डिस्कनेक्ट भी अक्सर हूं और कनेक्शन उपलब्ध नहीं होने पर पुन: निर्धारित करने की आवश्यकता है। मेरा बॉक्सन काफी अच्छा चलता है, लेकिन जैसा कह रहा है: यह हमेशा केबल (उर्फ नेटवर्क) – stwissel

2

प्रयास करें:

echo quit | telnet IP 22 2>/dev/null | grep Connected 
+1

है इस दृष्टिकोण की एक समस्या यह है कि यह ssh_config (यानी/etc/ssh/config या ~/.ssh में परिभाषित मेजबानों को पहचान नहीं पाती है/config) –

16
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK 
+1

एक लाइन आउटपुट: (ssh -q -o "बैचमोड = हाँ" -o "कनेक्टटाइमआउट = 3" [email protected] "echo 2> & 1" और echo SSH_OK || echo SSH_NOK) | पूंछ-एन 1 – Xdg

11

आप की तरह कुछ का उपयोग कर सकते

$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] echo ok 2>&1) 

हो जाएगा ताकि उत्पादन "ठीक है" यदि ssh कनेक्शन ठीक

4

@Adrià Cidre की प्रतिक्रिया के पूरक है आप कर सकते हैं:

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] echo ok 2>&1) 

if [[ $status == ok ]] ; then 
    echo auth ok, do something 
elif [[ $status == "Permission denied"* ]] ; then 
    echo no_auth 
else 
    echo other_error 
fi 
संबंधित मुद्दे