टेस्ट अगर टेलनेट पोर्ट शेल स्क्रिप्ट के भीतर सक्रिय है


11

मैं परीक्षण करने के लिए एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं कि क्या टेलनेट के माध्यम से लॉगिन करना संभव है। मैं वास्तव में लॉग इन नहीं करना चाहता हूं; इसलिए, उम्मीद की जरूरत नहीं है। मैं सिर्फ यह देखना चाहता हूं कि क्या मैं लॉगिन प्रॉम्प्ट प्राप्त करने में सक्षम हूं। यह लिनक्स सिस्टम से किया जा रहा है इसलिए मैं उपयोग करने की कोशिश कर रहा हूं nc:

nc 192.168.10.5 23 -w 1 | grep -q login 
if [ $? -eq 1 ]
then
    echo "console is down"
fi

समस्या यह है कि इससे मेरा कंसोल लॉक हो रहा है। ऐसा लगता -wहै कि वास्तव में कनेक्शन नहीं छोड़ रहा है।

मैंने टेलनेट का उपयोग करने की भी कोशिश की, लेकिन मैं स्क्रिप्ट के भीतर से कनेक्शन नहीं तोड़ पा रहा हूं। कोशिश कर रहे हैं

\echo "\035" | telnet 192.168.10.5

इससे पहले कि मैं एक लॉगिन संकेत मिलता है टूट जाता है।


के संभावित डुप्लिकेट superuser.com/questions/621870/...
vschum

जवाबों:


14

बैश छद्म डिवाइस प्रदान करता है जो आप इस तरह से परिचित हैं /dev/null। हालाँकि अन्य डिवाइस हैं जैसे कि /dev/tcpऔर /dev/udpनेटवर्क कनेक्शन के परीक्षण के लिए, जिसे आप बैश स्क्रिप्ट के भीतर से भी उपयोग कर सकते हैं।

बैश के मैन पेज से अंश

बैश कई फाइलनामों को विशेष रूप से संभालता है, जब उनका उपयोग पुनर्निर्देशन में किया जाता है, जैसा कि निम्नलिखित तालिका में वर्णित है:

          /dev/fd/fd
                 If fd is a valid integer, file descriptor fd is duplicated.
          /dev/stdin
                 File descriptor 0 is duplicated.
          /dev/stdout
                 File descriptor 1 is duplicated.
          /dev/stderr
                 File descriptor 2 is duplicated.
          /dev/tcp/host/port
                If  host  is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a TCP connection to the corresponding socket.
          /dev/udp/host/port
                If host is a valid hostname or Internet address, and port 
                is an integer port number or service name, bash attempts to 
                open a  UDP  connection to the corresponding socket.

उदाहरण

यहां मैं अपने डोमेन में स्किनर नाम के होस्ट से कनेक्शन का परीक्षण कर रहा हूं और यह देख रहा हूं कि क्या मैं इसके पोर्ट 22 से जुड़ सकता हूं।

नोट: पोर्ट 22 एसएसएच के लिए है, टेलनेट उपयोग पोर्ट 23 के लिए।

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

महान तो चलो एक गैर बंदरगाह की कोशिश:

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

ठीक है कि काम करता है, लेकिन यह भयानक बदसूरत उत्पादन है। कोइ चिंता नहीं। आप echo > /dev/tcp/...एक सबशेल में चला सकते हैं और /dev/nullइसे थोड़ा साफ करने के लिए सभी आउटपुट को रीडायरेक्ट कर सकते हैं । यहां वह पैटर्न है जिसका उपयोग आप अपनी शेल स्क्रिप्ट में कर सकते हैं:

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down

यदि आप विशेष रूप से परीक्षण करना चाहते हैं telnet, तो वह डिफ़ॉल्ट रूप से पोर्ट 23 पर चलता है, इसलिए जहां स्लम में 22 और 223 का उपयोग किया गया है, 23 का उपयोग करें।
वारविक

@Warwick - धन्यवाद, मैंने इसे उदाहरण अनुभाग में एक नोट के रूप में जोड़ा है।
slm

@sim टिप्पणी के लिए धन्यवाद। मैंने इसे पहले भी देखा था लेकिन मैं इसके साथ काम करने में सक्षम नहीं था। मेरा मुद्दा यह है कि मुझे लॉगिन प्रॉम्प्ट के लिए grep या परीक्षण करने में सक्षम होना चाहिए। इस स्थिति में कंसोल लॉक है और कोई लॉगिन प्रॉम्प्ट नहीं है। # telnet 192.168.10.5 Trying 192.168.10.5... Connected to 192.168.10.5 (192.168.10.5). Escape character is '^]'. Connection closed by foreign host.
rleon

# cat < /dev/tcp/192.168.10.12/23 मुझे एक लॉगिन प्रॉम्प्ट देता है लेकिन मैं इससे बाहर नहीं निकल पा रहा हूं।
रैलन

1
वाह .. वहाँ पुनर्निर्देशन का आवंटन। # cat afile ^] चलाने के बाद कि यह सिर्फ ब्रेक को प्रतिध्वनित कर रहा है afile। अभी भी इसके साथ खेल रहा हूं, लेकिन मुझे लगता है कि मैं लगभग वहां हूं।
17

7

आप का उपयोग कर सही रास्ते पर हैं nc, लेकिन अगर आप वास्तव में परीक्षण करना चाहते हैं कि क्या आप कनेक्शन स्थापित कर सकते हैं, तो nc के -zस्विच का उपयोग करें :

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi

यह सभी प्रणालियों पर काम नहीं करता है, मेरे nc में -z झंडा नहीं है
Shapeshifter

दिलचस्प। यह कौन सा संस्करण ncहै?
डोपघोटी

मैं CentOS 7 पर हूं, और nc को nmap-ncat से बदल दिया गया है, जिसमें वह विकल्प नहीं है :(
Shapeshifter

अगर मुझे सही से याद है, तो जो पैकेज आपको CentOS में चाहिए, वह बस है nc
डोपघोटी

nc, namp-ncat सेंटोस 7 में है
शापेशिफ्टर

2

मुझे पता है कि उत्तर थोड़ा देर से है, लेकिन मैं देख रहा था कि यह कैसे करना है और एनसी का उपयोग करना सुरक्षा कारणों के लिए एक विकल्प नहीं था, इसलिए यहां ऐसा है अगर यह किसी की मदद कर सकता है।

आपकी आरंभिक प्रतिध्वनि में क्या गायब था -e स्विच:

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

और डिस्कनेक्ट करने के बाद टेलनेट छोड़ने के लिए एक नई पंक्ति + छोड़ो कमान। जैसे की:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

यदि आप स्टेटमेंट और $ का मूल्यांकन करते हैं तो स्पष्ट रूप से वही काम करेगा यदि आप ब्लॉक शैली का उपयोग करते हैं? जैसा कि आपने शुरू में किया था:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

जब तक हम उस पर हैं, जहाँ तक nc जाता है, यह इस बात पर निर्भर करता है कि आपके पास nc का स्वाद क्या है (gnu ncat vs nmap-ncat)। Gnu में -z स्विच होगा:

  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

जबकि दूसरा नहीं होगा और आपको अपने रिक्त स्थान को अटकाने के लिए एक खाली लाइन को पाइप करना होगा:

echo | nc 10.0.0.1 23
# (evaluate $? here)

1

nc -z 192.168.10.5 23कमांड प्रॉम्प्ट में चलाएं या इस कमांड को चलाने के लिए एक बैश स्क्रिप्ट बनाएं।

यदि कनेक्शन सफल होता है तो यह नीचे दिया गया विवरण देता है।

192.168.10.5 23 पोर्ट [tcp / *] का कनेक्शन सफल रहा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.