मेरे ~ / .bashrc और ~ / .shshrc (पूरी तरह से POSIX संगत, आपकी शेल स्क्रिप्ट के लिए तैयार) से कुछ कार्यों का सरलीकृत संस्करण:
# true if we have the given command(s)
we_have() { type "$@" >/dev/null 2>&1; }
# Usage: probe SERVER PORT|SERVICE
# returns true when SERVER has PORT opened (and responds within one second)
if we_have nc
then probe() { nc -zw1 "$@" >/dev/null 2>&1; }
else probe() { echo X |telnet -e X "$@" >/dev/null 2>&1; }
fi
# Usage: poke SERVER [PORT|SERVICE]
# As probe. Also: PORT defaults to 80 (http) and reports the result
poke() {
local RETVAL STATUS
probe "$1" "${2:-80}"
RETVAL=$?
if [ $RETVAL != 0 ]; then
STATUS=" not"
fi
echo "could$STATUS connect to port ${2:-80} on host '$1'"
return $RETVAL
}
यह पोर्ट नंबर और किसी भी सेवा के नाम को अनुक्रमित करता है /etc/services
। (इसका परीक्षण करने के लिए सावधान रहें; यदि आपका सेवा एक खराब सेवा नाम के कारण विफल हो जाता है, तो आपको पता नहीं चलेगा।)
कुछ उदाहरण परीक्षण:
$ poke localhost ssh
could connect to port ssh on host 'localhost'
$ poke localhost 12345
could not connect to port 12345 on host 'localhost'
का प्रयोग करें probe
बस वापसी मान, जैसे के साथ स्क्रिप्ट कुछ करने के लिए अगर आप चाहते हैं
if probe localhost ssh; then
echo something contingent on hosting ssh goes here
fi
यदि आपके पास nmap
संस्करण 5+ स्थापित है, तो आप कमांड के ncat --send-only --recv-only -w 334ms $1 $2
बजाय उपयोग कर सकते हैं nc
। यह तेजी से विफल होता है (मैं 334ms पर बस गया हूं। एनसी केवल-दूसरे रिज़ॉल्यूशन की अनुमति देता है, इसलिए आप पूर्ण सेकंड की प्रतीक्षा कर रहे हैं)।
ध्यान दें कि यह सत्यापित नहीं करता है कि क्या होस्ट किया जा रहा है, केवल यह कि पोर्ट खुला है। 99% समय, यह काफी अच्छा है। यदि आपको इससे अधिक की आवश्यकता है, तो कुछ इस तरह से प्रयास करें:
nmap -sV -p ssh localhost |grep -qi 'open.*ssh.*ssh[^?]'
यह सर्वर लोकलहोस्ट पर पोर्ट ssh (22) को स्कैन करने और सर्विस / वर्जन की जानकारी निर्धारित करने के लिए नैम्प को बताएगा । मेरे सिस्टम पर, बिना grep के, यह रिपोर्ट करता है:
Starting Nmap 6.40 ( http://nmap.org ) at 2014-02-14 17:01 PST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000048s latency).
Other addresses for localhost (not scanned): 127.0.0.1
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 6.4p1 Debian 2 (protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds
इसलिए grep कमांड SSH के पहले उदाहरण को देख रहा है (जो केवल होस्टिंग सर्वर और संस्करण जानकारी में मैपिंग / इन / सर्विसेज को इंगित करता है), जो "ssh" (केस-इनसेंसिटिव) से मेल खाना चाहिए। -q
झंडा केवल उत्पादन को दबा (तो यह जगह ले सकता है probe
)। अगर नैंप यह पता नहीं लगा सकता है कि सेवा क्या है, तो यह कहेगा ssh?
, इसलिए grep regex मेल खाने से बचता है।
आइए उन्हें मिलाते हुए इसे तेजी से बनाते हैं लेकिन अभी भी यह सत्यापित करते हैं कि एसएसएच वास्तव में परोसा जा रहा है:
# Usage: vet_ssh SERVER [PORT|SERVICE]
# True when SERVER has PORT (default=22) both opened and serving SSH
vet_ssh() {
probe $1 ${2:-22} && nmap -sV -p ${2:-22} $1 |grep -qiE 'open.....*ssh[^?]'
}
अब आप अपने फ़ंक्शन के vet_ssh
स्थान पर उपयोग कर सकते हैं । यह लगभग मेरे मूल कार्य की तरह तेज़ होगा : पोर्ट के न खुलने पर यह समान गति वाला होता है, पोर्ट के खुलने और एसएसएच की सेवा करने पर यह थोड़ा धीमा होता है, और खुले तौर पर धीमा होने पर यह कुछ धीमा हो जाता है और कुछ परोसते हुए नैम जल्दी पहचान नहीं पाता ( या सभी)। वैकल्पिक बंदरगाहों को समायोजित करने के लिए यहाँ grep regex थोड़ा अलग है।probe
poke
poke
इस घटना में कि मैंने आपके प्रश्न की पूरी तरह से गलत व्याख्या की है ... यदि आप जानना चाहते हैं कि क्या आप पहले से ही इस सर्वर से जुड़े हैं (इसके बजाय कि आप कर सकते हैं या नहीं ), तो netstat
इस तरह से उपयोग करें:
# Usage: am_i_sshed_to SERVER [PORT|SERVICE]
# True when you have an established connection to SERVER on PORT (default=22)
am_i_sshed_to() {
local IP_QUERY=`host "$1" |awk -v port="${2:-22}" '
$2 != "mail" { printf "-e %s:%s ", $NF, port }
'`
netstat -tn |grep -w $IP_QUERY |grep -wq ESTABLISHED
}
फिर आप am_i_sshed_to
उसी तरीके से probe
या के रूप में उपयोग कर सकते हैं vet_ssh
।
(स्पष्टीकरण: netstat
प्रत्येक पते को देखने के लिए वास्तव में लंबा समय लगता है। हमें केवल उसी सर्वर की खोज करने की आवश्यकता है जिसे हम जांचना चाहते हैं, इसलिए हमें पहली पंक्ति में कैश awk
करना होगा । कमांड का कहना है कि मेल डिलीवरी पर चर्चा नहीं करने वाली किसी भी पंक्ति को समाप्त होना चाहिए ( $NF
आईपी में)। कि हमारे आगामी netstat कॉल के लिए एक grep क्वेरी, तो 1.2.3.4
जैसे हो जाता है -e 1.2.3.4:22
और हम कई आईपी (हम आदेश लाइन आकार सीमा से पहले कुछ सौ तक) हो सकता है। तो, हम netstat चलाते हैं, केवल TCP देख रहे हैं। कनेक्शन और एक नाम के लिए कुछ भी मैप नहीं कर रहे हैं। हम अपने कैश्ड क्वेरी के खिलाफ शब्दों के लिए grep ("11.2.3.4:22" या "1.2.3.4:2234" से मेल नहीं खाते) (नोटों की जानबूझकर कमी, हमें ज़रूरत नहीं है उन्हें और वे तर्क संरचना को बदल देंगे!) और फिर सुनिश्चित करें कि कनेक्शन अभी भी स्थापित है।grep -q
कोई आउटपुट नहीं है, इसलिए यह एक ड्रॉप-इन प्रतिस्थापन है probe
लेकिन इसके लिए नहीं poke
)
ssh
वर्बोज़ मोड में चलाएं , और यदि यह कनेक्शन स्थापित करता है और प्रमाणीकरण के लिए पूछता है, तो फ़ायरवॉल खुला है।