දුරස්ථ පද්ධතියක වරායක් ළඟා විය හැකිදැයි පරීක්ෂා කරන්න (ටෙල්නෙට් නොමැතිව)


377

පැරණි දිනවල, telnetදුරස්ථ ධාරකයක වරායක් විවෘතව තිබේදැයි අපි දැක ඇත්තෙමු : telnet hostname portඕනෑම ධාරකයක ඕනෑම වරායකට සම්බන්ධ වීමට සහ අමු TCP ප්‍රවාහයට ප්‍රවේශය ලබා දීමට උත්සාහ කරනු ඇත.

මේ දිනවල, මා වැඩ කරන පද්ධති ටෙල්නෙට් ස්ථාපනය කර නොමැත (ආරක්ෂක හේතූන් මත), සහ සියලු ධාරකයන් වෙත පිටතට යන සම්බන්ධතා පෙරනිමියෙන් අවහිර කර ඇත. කාලයාගේ ඇවෑමෙන්, කුමන ධාරකයන්ට විවෘත වන්නේ කුමන වරායන්ද යන්න පිළිබඳ අවබෝධය නැති කර ගැනීම පහසුය.

දුරස්ථ පද්ධතියක වරායක් විවෘතව තිබේදැයි පරීක්ෂා කිරීමට තවත් ක්‍රමයක් තිබේද - සීමිත පැකේජ සංඛ්‍යාවක් ස්ථාපනය කර ඇති ලිනක්ස් පද්ධතියක් භාවිතා කර telnetතිබේද?



මටත් මේ ප්‍රශ්නයම තිබුණා. පහත සුභ්‍රනාත් චුන්දර්ගේ පිළිතුර උපකාරි විය. කෙසේ වෙතත්, ටෙල්නෙට් ස්ථාපනය කිරීම කුඩා දෙයක් බව මම පසුව දැන ගතිමි brew install telnet. ඒ නිසා මම ලිනක්ස් පරිශීලකයන් හා සමග ඒ හා සමාන දෙයක් කරන්න පුළුවන් බලාපොරොත්තු yumහා apt-get.
මිග් 82

Answers:


305

ටික වේලාවක් TCP සහ UDP වරායන් වෙත පිවිසීමට Bash ට හැකි වී තිබේ . මෑන් පිටුවෙන්:

/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.

එබැවින් ඔබට මේ වගේ දෙයක් භාවිතා කළ හැකිය:

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

ටා ඩා!


මෙය MinGW හි ද ක්‍රියාත්මක වන බව පෙනේ . උදාහරණයක් ලෙස, 192.168.2.100 හි දුරස්ථ VNC සේවාදායකයක් "cat </dev/tcp/192.168.2.100/5900" භාවිතා කරමින් "RFB 003.008" සමඟ ප්‍රතිචාර දක්වයි.
පීටර් මෝර්ටෙන්සන්

1
ornornix, හරි, නමුත් මේ අවස්ථාවේ දී මට -z විකල්පයක් නොමැතිව nc භාවිතයෙන් එකම ප්‍රති result ලය ලබා ගත යුතුව ඇත, නමුත් එය තවමත් ක්‍රියාත්මක නොවේ: # nc -v -w5 127.0.0.1 18080 127.0.0.1 18080 වරායට සම්බන්ධතාවය [tcp / *] සාර්ථකයි! # cat </dev/tcp/127.0.0.1/18080 කිසිදු ප්‍රති .ලයක් නොමැතිව එල්ලී සිටින්න. මට "/ dev / tcp / host / port" විකල්පය භාවිතා කළ හැක්කේ කවදාදැයි තේරුම් ගැනීමට අවශ්‍යයි
ඇලෙක්සැන්ඩර්

5
Lex ඇලෙක්සැන්ඩර් ... ඇත්ත වශයෙන්ම, "කිසිදු ප්‍රති result ලයක් නොමැතිව එල්ලී සිටීම" බොහෝ දුරට අපේක්ෂිත හැසිරීමකි. පූසා ආදානය සඳහා බලා සිටී. එන්සී තෙක් කිසිදු-දත්ත දැනෙනවා කිරීම සඳහා අවශ්ය පියවර අමතර smarts ඇති අතර උත්සාහ නතර වෙනවා. බළලා නොවේ තරමක් ස්මාර්ට් ලෙස. උත්සාහ කරන්න cat < /dev/tcp/localhost/22, ඔබ ඔබේ sshd ශීර්ෂකය ලබා ගත යුතුය. පැහැදිලිවම, 18080 වරායේ ඔබගේ ක්‍රියාවලිය කිසිවක් යැවීමට පෙර යමක් පැමිණෙන තෙක් බලා සිටී. වරාය 22 ( ssh ) එහි අනුවාදය සහ වොට්නොට් සමඟ ඔබට සුබ පතයි. එය අත්හදා බලන්න!
ලෝර්නික්ස්

1
ornornix, පැහැදිලි කිරීම සඳහා ඔබට බොහෝම ස්තූතියි! දැන් සීමාව පැහැදිලිය. වරාය පරීක්ෂා කිරීමට වඩාත් සුදුසු ක්‍රමයක් විය යුත්තේ එන්.සී.
ඇලෙක්සැන්ඩර්

3
කිසිවක් ස්ථාපනය කර නොමැති ඩොකර් බහාලුමක් සමඟ වැඩ කිරීමේදී මෙය ඇදහිය නොහැකි තරම් උපකාරී විය. කන්ටේනරයට ඩීඑන්එස් හරහා බහාලුම් නොවන ඩීබී වෙත ප්‍රවේශය ඇති බව ඉක්මනින් තහවුරු කර ගැනීමට හැකි විය. උදාහරණය: cat </ dev / tcp / hostname / 5432
මයිකල් හොබ්ස්

430

නියමයි, වාචිකයි! මිනිසා පිටු වලින්.
තනි වරාය:

nc -zv 127.0.0.1 80

බහු වරායන්:

nc -zv 127.0.0.1 22 80 8080

වරාය පරාසය:

nc -zv 127.0.0.1 20-30

7
ස්තූතියි, හොඳම පිළිතුර ලෙස පෙනේ. ;-)
lpapp

6
සංවෘත වරායන් සඳහා දුරස්ථ සේවාදායකයක් (එකම LAN) සඳහා උබුන්ටු 14.04 (විශ්වාසදායක තාහර්) මත උත්සාහ කළ විට මෙය එල්ලී තිබුණි (එය තත්පර 127 කට පසුව කල් ඉකුත් විය) - එබැවින් ස්ක්‍රිප්ට් සඳහා එතරම් සුදුසු නොවේ. වරාය විවෘතව ඇති සේවාවක් සඳහා වුවද එය ක්‍රියාත්මක විය. "-W2" විකල්පය භාවිතා කිරීම විසඳුම විය හැකිය.
පීටර් මෝර්ටෙන්සන්

6
UDP වරායන් සඳහා -u විකල්පය භාවිතා කරන්න.
එප්‍රන්

8
Ncat -z හි 6.4 අනුවාදය හඳුනාගෙන නොමැත. මට z නොමැතිව කළ හැකි විය
smishra

5
ඔබට පහත පරාසයන් පරීක්ෂා කළ හැකිය: nc -zv 127.0.0.1 22,80,8080,20-30,443-446(nc අනුවාදය: 1.107-4).
බොබෙල්

104

නෙට්කැට් ප්‍රයෝජනවත් මෙවලමකි:

nc 127.0.0.1 123 &> /dev/null; echo $?

0වරාය 123 විවෘතව 1තිබේ නම් සහ එය වසා තිබේ නම් ප්‍රතිදානය කරනු ඇත.


මෙය මගේ පිළිතුරට වඩා බොහෝ අලංකාර හා පිටපත් කළ හැකි පිළිතුරකි. එය අත්හිටවූ ආරක්ෂක සවි conscious ානික සිසැඩ්මින්වරු telnetද අත්හිටුවා තිබීම මට අවාසනාවකි nc(නමුත් - අමුතු ලෙස - නැත curlහෝ නැත wget).
ස්ටීව් එච්එච්එච්

ඔව් එය සම්පූර්ණයෙන්ම අත්තනෝමතික හා මෝඩ වැඩකි.
thnee

3
FORප්‍රකාශ ආරම්භ කිරීමට ඉඩ දෙන්න !
චැඩ් හැරිසන්

2
සංවෘත වරායන් සඳහා දුරස්ථ සේවාදායකයක් (එකම LAN) සඳහා උබුන්ටු 14.04 (විශ්වාසදායක තාහර්) මත උත්සාහ කළ විට මෙය එල්ලී තිබුණි (තත්පර 127 කට පසුව එය කල් ඉකුත් විය) - එබැවින් ස්ක්‍රිප්ට් සඳහා එතරම් සුදුසු නොවේ. වරාය විවෘතව ඇති සේවාවක් සඳහා එය ක්‍රියාත්මක වුවද, 0 ආපසු එයි. "-W2" විකල්පය භාවිතා කිරීම විසඳුම විය හැකිය.
පීටර් මෝර්ටෙන්සන්

1
-G 2TCP කල් ඉකුත්වීම සඳහා වඩාත් සුදුසු යැයි මම සිතමි
AB

64

ඉහත මෙවලම socat@ ලෝර්නික්ස්ගේ පිළිතුරෙහි විස්තර කර ඇති පරිදි වෙනත් මෙවලමක් භාවිතා නොකර සරලම ක්‍රමය වේ. මෙය හුදෙක් /dev/tcp/...විධාන රේඛාව හරහා වෙනත් සේවාදායකයෙකුට ලබා දී ඇති වරායක් තිබේදැයි පරීක්ෂා කිරීමට ඔබට අවශ්‍ය නම්, බාෂ් තුළ ඇති psuedo- උපාංගය භාවිතා කරන්නේ කෙසේද යන්න පිළිබඳ සත්‍ය උදාහරණයක් එක් කිරීම පමණි .

උදාහරණ

මගේ ජාලයේ නම් කර ඇති ධාරකයකු සිටින බව පවසන්න skinner.

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

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

ඔබට echo > /dev/...මේ ආකාරයට වරහන් තුළ එතීමට අවශ්‍ය (echo > /dev/...)වන්නේ, ඔබ එසේ නොකළේ නම්, සම්බන්ධතා පරික්ෂා කර බැලීමෙන් පසුව, ඔබට මෙම ආකාරයේ පණිවිඩ පෙන්වනු ඇත.

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

/dev/nullඋපාංගයට දත්ත ලිවීමේ උත්සාහයෙන් එන බැවින් මේවා සරලව හරවා යැවිය නොහැක /dev/tcp. එබැවින් අපි එම සියලු ප්‍රතිදානය උප විධානයක් තුළ ග්‍රහණය කරගනිමු, එනම් උප විධානයේ (...cmds...)ප්‍රතිදානය නැවත හරවා යවමු.


1
මෙය විශිෂ්ටයි. එය ඉහළට ඡන්දය දෙනු ඇතැයි ප්‍රාර්ථනා කරන්න. මම මෙය පිටුවෙන් බොහෝ දුරට කියවා ඇත්තේ එය වැසීමට පෙර අහම්බෙන් අනුචලනය කළ බැවිනි.
තවමත්. ටෝනි

@ ඔකුමා.ටෝනි - ඔව්, එය සෑම විටම Q හි බොහෝ පිළිතුරු ඇති ගැටළුවක් වේ 8-). ප්‍රතිපෝෂණයට ස්තූතියි, එය අගය කරනු ලැබේ.
slm

48

බව ද මට curlරැකියා සඳහා සමාන ආකාරයකින් සිදු වෙන්න පුළුවන් telnet, සහ curlපවා ඔබ කරන ප්රොටෝකෝලය ශ්රවණය බලාපොරොත්තු කියමි.

පළමු තර්කය ලෙස ධාරක නාමයෙන් සහ වරායෙන් HTTP URI එකක් සාදන්න curl. curlසම්බන්ධ විය හැකි නම් , එය ප්‍රොටෝකෝලය නොගැලපීම සහ පිටවීම වාර්තා කරයි (සවන්දෙන්නන් වෙබ් සේවාවක් නොවේ නම්). curlසම්බන්ධ වීමට නොහැකි නම් , එය කල් ඉකුත් වේ.

උදාහරණයක් ලෙස, ධාරක 10.0.0.99 හි 5672 වරාය ෆයර්වෝලයක් මගින් වසා දමා හෝ අවහිර කර ඇත:

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

කෙසේ වෙතත්, වෙනත් පද්ධතියකින්, ධාරක 10.0.0.99 හි 5672 වරායට ළඟා විය හැකි අතර එය AMQP සවන්දෙන්නෙකු ධාවනය කරන බව පෙනේ.

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

විවිධ පණිවිඩ අතර වෙනස හඳුනා ගැනීම වැදගත් ය: පළමු අසාර්ථකත්වය curlවරායට සම්බන්ධ වීමට නොහැකි වූ නිසා ය . curlAMQP සවන්දෙන්නෙකු වෙනුවට HTTP සවන්දෙන්නෙකු අපේක්ෂා කළද දෙවන අසාර්ථකත්වය සාර්ථක පරීක්ෂණයකි .


5
Curl ලබා ගත නොහැකි නම්, wget විය හැකිය. wget -qS -O- http://ip.add.re.ss:porteffectively ලදායී ලෙස එකම දේ කළ යුතුය.
සීවීඑන්

4
මෙය සත්කාරක නාමයක් සමඟ පවා ක්‍රියා කරයි, උදා. curl myhost:22.
에이 바

මෙය වැරදියි. මම ටොම්කාට් සේවාවක් ක්‍රියාත්මක කරනවා, නමුත් දෝෂ 404 ක් ලැබෙනවා. # curl -k 192.168.194.4:6443 <html> <head> <title> Apache Tomcat / 7.0.34 - දෝෂ වාර්තාව </ title> <style> <! - H1 --- HR {color: # 525D76;} -> </style> </head> <body> <h1> HTTP තත්වය 404 - / </h1> <HR size = "1" noshade = "noshade"> <p> <b> type </b> තත්ව වාර්තාව </ p> <p> <b> පණිවිඩය </ b> <u>/</u></p> <p> <b> විස්තරය </ b> <u> ඉල්ලූ සම්පත නොමැත. </u> </p> <HR size = "1" noshade = "noshade"> <h3> Apache Tomcat / 7.0.34 </h3> </body> </html>

මගේ බලන්න පශ්චාත් සමාන ප්රවේශය සමඟ.
kenorb

13
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

එය ඔබගේ ගැටලුව විසඳනු ඇතැයි සිතමි :)


1
ඔව්, මෙය වඩා හොඳය - සංවෘත වරායන් සඳහා වහාම කාලය ගත කිරීම.
පීටර් මෝර්ටෙන්සන්

1
මෙය සැමවිටම TCP භාවිතා කරනවාද? නැතහොත් එය UDP පරීක්ෂා කිරීමට ක්‍රමයක් තිබේද?
kmoe

11

මෙන්න එක් ලයිනර්:

</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed

ornlornix පිළිතුරෙන් විස්තර කර ඇති Bash syntax භාවිතා කිරීම .

වැඩි විස්තර සඳහා, පරීක්ෂා කරන්න: උසස් බෑෂ්-ස්ක්‍රිප්ටින් මාර්ගෝපදේශය: 29 වන පරිච්ඡේදය /devසහ/proc .


1
සංවෘත වරායන් සඳහා කල් ඉකුත් වීම කුමක්ද?
ටිලෝ

8

මම මුළු දවසම අරගල කළේ මේ පිළිතුරු කිසිවක් මට ප්‍රයෝජනවත් නොවන බැවිනි. ගැටළුව වන්නේ නවතම අනුවාදය ncතවදුරටත් -zධජය නොමැති අතර ධාරකය වෙත ළඟා විය නොහැකි විට TCP හරහා සෘජු ප්‍රවේශය (@lornix සහ @slm අනුව) අසමත් වීමයි. මම අවසානයේදී මෙම පිටුව සොයාගත්තෙමි , එහිදී මට වැඩ කරන උදාහරණ එකක් නොව දෙකක් හමු විය :

  1. nc -w1 127.0.0.1 22 </dev/null

    ( -wධජය කල් ඉකුත් වීම ගැන සැලකිලිමත් වන </dev/nullඅතර -zධජය ප්‍රතිස්ථාපනය කරයි )

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    ( timeoutවිධානය කල් ඉකුත් වීම ගැන බලා ගනී, ඉතිරිය @slm වෙතින් වේ)

ඉන්පසු, ප්‍රති use ලය උපුටා ගැනීම සඳහා සරලව භාවිතා කරන්න &&සහ / හෝ ||(හෝ $?) භාවිතා කරන්න. කවුරුහරි මෙම තොරතුරු ප්‍රයෝජනවත් වේ යැයි බලාපොරොත්තු වෙමු.


6

@Kenorb සහ zAzukikuru වෙතින් ලැබෙන පිළිතුරු ඒකාබද්ධ කිරීමෙන් ඔබට වරාය විවෘත / සංවෘත / ෆයර්වෝල්ඩ් පරීක්ෂා කළ හැකිය.

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

ඕනෑම වරායකට ලඟාවීම සඳහා කරකැවෙන තවත් ප්‍රවේශයක්

curl telnet://127.0.0.1:22

4

ඔබේ පද්ධතියේ ස්ථාපනය කර ඇති දේ මත පදනම්ව එක් ක්‍රමයක් තෝරා ගන්නා ශ්‍රිතයක් මෙන්න:

# Check_port <address> <port> 
check_port() {
if [ "$(which nc)" != "" ]; then 
    tool=nc
elif [ "$(which curl)" != "" ]; then
     tool=curl
elif [ "$(which telnet)" != "" ]; then
     tool=telnet
elif [ -e /dev/tcp ]; then
      if [ "$(which gtimeout)" != "" ]; then  
       tool=gtimeout
      elif [ "$(which timeout)" != "" ]; then  
       tool=timeout
      else
       tool=devtcp
      fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout)  gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout)  timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp)  </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac

}
export check_port

ඇයි ඔබ මෙවලම සකසන්නේ, එය පසුව ප්‍රකාශයේ භාවිතා කිරීමට පමණි. කුමන මෙවලමක් තිබේදැයි පරීක්ෂා කර එය වහාම if block හි භාවිතා කිරීම සරල නොවේද?
මාර්ක් ලිබර්ජර්

2

එය ඔබගේ කොටුවේ නොතිබිය යුතුය, නමුත් උත්සාහ කරන්න nmap.


4
nmapහොඳ මෙවලමක්, නමුත් මෙම පද්ධති වල නොමැත. බාගත කරනවා වෙනුවට nmap, එය සම්පාදනය කර, එය මගේ නිවාස නාමාවලියට ස්ථාපනය කර අනෙක් සියලුම පද්ධති වෙත පිටපත් කරනවා වෙනුවට, බොහෝ ලිනක්ස් ස්ථාපනයන්හි පවතින මෙවලම් භාවිතා කරමින් ක්‍රමයක් සොයා ගැනීමට මම බලාපොරොත්තු වෙමි.
ස්ටීව් එච්එච්එච්

1

යොමු කිරීම සඳහා, පෙපෙරුනාස්ගේ පිළිතුර මත පුළුල් කිරීම:

පරීක්ෂා කිරීම සඳහා nmap භාවිතා කරන ආකාරය ,

nmap -p 22 127.0.0.1

(ඉහත උදාහරණය නිරූපණ අරමුණු සඳහා localhost භාවිතා කරයි)


0

ඔබ පද්ධතියට වඩා වැඩි ප්‍රමාණයක් පරීක්ෂා කිරීමට නම්, එවැනි කාර්යයන් සඳහා අපගේ පරීක්ෂණ මෙවලම dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) භාවිතා කළ හැකිය . ඔබේ අපේක්ෂාව ඔබට අර්ථ දැක්විය හැකිය

{:netcat [{:host "mywebserver.com" :port "443"}
          {:host "telnet mywebserver.com" :port "80"}
          {:host "telnet mywebserver.com" :port "8443"}]}

මෙම අපේක්ෂාව localhost ට හෝ දුරස්ථ ධාරකයන්ට එරෙහිව පරීක්ෂා කරන්න (ssh මගින් සම්බන්ධ කරන්න). දුරස්ථ පරීක්ෂණ සඳහා ඔබ ඉලක්ක නිර්වචනය කළ යුතුය:

{:existing [{:node-name "test-vm1"
             :node-ip "35.157.19.218"}
            {:node-name "test-vm2"
             :node-ip "18.194.113.138"}]
 :provisioning-user {:login "ubuntu"}}

ඔබට පරීක්ෂණය ක්‍රියාත්මක කළ හැකිය java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

කබාය යටතේ අපි ඉහත යෝජනා කර ඇති පරිදි නෙට්කැට් භාවිතා කරමු ...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.