SSH कनेक्शन की जांच करने के लिए एक bash स्क्रिप्ट कैसे बनाएं?


86

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

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


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

1
चूंकि आप स्पष्ट रूप से बदल रहे हैं कि दूरस्थ मशीनें कनेक्शन कैसे स्थापित करती हैं, इसलिए मॉश की तैनाती पर विचार करें । mosh.mit.edu इसका उद्देश्य अस्थिर कनेक्शन पर SSH को पूरक करना है। मुझे इसके साथ बहुत अच्छे अनुभव हैं।
ऐयून

@ephemient मैं जानता हूँ कि यह थोड़ी देर हो चुकी है, लेकिन यह बिल्कुल स्पष्ट है कि वे महत्वपूर्ण था लगता नहीं स्थानीय मशीन के लिए या नहीं स्थानीय उपयोगकर्ता के लिए।
कार्ट

जवाबों:


170

आप इसे रिटर्न-वैल्यू ssh के साथ देख सकते हैं:

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0

संपादित करें: एक और तरीका होगा नैम्प का उपयोग करना (आपको चाबी या लॉगिन-सामान की आवश्यकता नहीं होगी):

$ 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)

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

EDIT2:

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

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

बस पूरा होना है।


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

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

2
बहुत बढ़िया जवाब! हालाँकि, आप यह उल्लेख नहीं करते हैं कि sshनीचे दिए गए होस्ट में प्रयास केवल 60 सेकंड के समय समाप्त होने के बाद ही विफल हो जाता है - जो कुछ उपयोगों के लिए निषेधात्मक हो सकता है। साथ ही, यदि एक होस्टनाम यदि परिभाषित किया गया है ~/.ssh/config, तो पहला sshतरीका काम करता है जबकि दूसरा nmapतरीका विफल रहता है Failed to resolve "<hostname>"
एसएससी

1
आदेशों के बारे में कोई स्पष्टीकरण नहीं ... या आप वास्तव में क्या कर रहे हैं .. क्या है $?? आदि
तोस्कान

# 1 का और भी संक्षिप्त रूप: ssh -q user@downhost exit | echo $? कनेक्शन परिणाम को प्रतिध्वनि में पाइप करें
philn5d

22
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

2
एक पंक्ति आउटपुट: (ssh -q -o "BatchMode = Yes" -o "ConnectTimeout = 3" user@host.com "इको 2> & 1" && इको SSH_OK || इको SSH_NOK) | tail -n1
Xdg

21

आप कुछ इस तरह का उपयोग कर सकते हैं

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

यह आउटपुट "ओके" होगा यदि ssh कनेक्शन ठीक है


14

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

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host 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

7

प्रयत्न:

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

1
इस दृष्टिकोण की एक समस्या यह है कि ssh_config (यानी / etc / ssh / / या / /। Ssh / config) में परिभाषित मेजबानों को मान्यता नहीं है
डिंग-यी चेन

1

नीचे sshकमांड में 0एक सफल कनेक्शन पर एक निकास कोड और एक गैर-शून्य मान होना चाहिए ।

ssh -q -o BatchMode=yes user@remote.com exit

if [ $? != "0" ]; then
    echo "Connection failed"
fi

महान! मैं भी पुनः जोड़ता हूं -o ConnectTimeout = 5, उन मामलों में तेजी से बाहर निकलने के लिए जहां गंतव्य पोर्ट फ़िल्टर किया गया है।
डैनियल

0

यदि कोई व्यक्ति केवल रिमोट मशीन पर पोर्ट 22 खुला है, तो यह जांचना चाहता है कि यह सरल नेटकैट कमांड उपयोगी है। मैंने इसका इस्तेमाल किया क्योंकि मेरे लिए नैम्प और टेलनेट उपलब्ध नहीं थे। इसके अलावा, मेरा ssh कॉन्फ़िगरेशन कीबोर्ड पासवर्ड ऑउटफिट का उपयोग करता है।

यह GUESSWHOz द्वारा प्रस्तावित समाधान का एक प्रकार है।

nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"

0

यदि आप जाँचना चाहते हैं कि कोई दूरस्थ फ़ोल्डर मौजूद है, या वास्तव में कोई अन्य फ़ाइल-परीक्षण:

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

में उद्धरण मत भूलना "$(ssh ...)"


इस सवाल का जवाब नहीं है। ओपी यह जांचना चाहता है कि एसएसएच कनेक्शन को स्थापित किया जा सकता है या नहीं, दूरस्थ ssh लोकेशन में फाइल की जाँच करें।
रकीब फ़िहा

0

कई इंटरफेस के साथ एक सर्वर से कनेक्ट करने के लिए

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

0

उदाहरण BASH 4+ स्क्रिप्ट का उपयोग करना:

# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)

# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
    echo "It's Open! Let's SSH to it.."
else
    echo "The host ${ip} is not accessible!"
fi

0

https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html

कनेक्टिविटी की जाँच के लिए उपरोक्त लिंक पायथन स्क्रिप्ट बनाना है। आप समान विधि और उपयोग कर सकते हैं:

ping -w 1 -c 1 "IP Address" 

बैश स्क्रिप्ट बनाने की कमान।


2
यह केवल रिमोट आईपी को पिंग करेगा। अगर ssh कनेक्शन संभव है तो गारंटी नहीं है।
RJ

यह इंगित करने के लिए धन्यवाद, यहां ssh xlinu.blogspot.com/2019/09/… के लिए कोड है। निर्यात उपयोगकर्ता = "उपयोगकर्ता नाम" निर्यात पास = "पासवर्ड" निर्यात i = "होस्टनाम" निर्यात SSHPASS = $ पास sspass -e ssh $ यूजर @ $ i -q "इको $ i एक्सेसिबल है"
धीरज कुमार

-7

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

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


3
सैम: स्क्रिप्ट की जाँच करने के लिए वैध उपयोग के मामले हैं। जैसे (मुझे पसंद है): मेरे पास मेरे घर के रास के लिए rsync के माध्यम से अपने डेटा का बैकअप लेने के लिए मेरी मशीन पर एक क्रॉन जॉब है। अब मैं बाहर हूं या यहां तक ​​कि बहुत बार डिस्कनेक्ट किया गया है और यदि कनेक्शन उपलब्ध नहीं था, तो इसे फिर से शेड्यूल करने की आवश्यकता है। मेरा बॉक्सन काफी अच्छा चलता है, लेकिन जैसा कि कहा जाता है: यह हमेशा केबल (उर्फ नेटवर्क) है
stwissel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.