দূরবর্তী সিস্টেমে কোনও বন্দর যদি পৌঁছনীয় হয় তা পরীক্ষা করুন (টেলনেট ছাড়াই)


352

পুরানো দিনগুলিতে, আমরা telnetদেখতে telnet hostname portপেতাম যে কোনও দূরবর্তী হোস্টের কোনও পোর্ট খোলা আছে: যে কোনও হোস্টের যে কোনও বন্দরের সাথে সংযোগ স্থাপনের চেষ্টা করবে এবং আপনাকে কাঁচা টিসিপি প্রবাহে অ্যাক্সেস দেবে।

আজকাল, আমি যে সিস্টেমে কাজ করি সেগুলিতে টেলনেট ইনস্টল করা হয়নি (সুরক্ষার কারণে) এবং সমস্ত হোস্টের সমস্ত বহির্মুখী সংযোগগুলি ডিফল্টরূপে অবরুদ্ধ। সময়ের সাথে সাথে, কোন হোস্টের জন্য কোন বন্দরগুলি খোলা রয়েছে তার ট্র্যাক হারানো সহজ।

সীমিত সংখ্যক প্যাকেজ ইনস্টল করা লিনাক্স সিস্টেম ব্যবহার করে, এবং telnetউপলভ্য না হলে পরীক্ষার অন্য কোনও উপায় আছে কি ?


সম্পর্কিত: এসও
কেনোরব

আমি এই একই সমস্যা ছিল। নীচে @ শুভনাথ চুন্ডারের উত্তরটি সাহায্য করেছে। যাইহোক, আমি তখন জানতে পারি যে টেলনেট ইনস্টল করা একটি ছোট বিষয় ছিল brew install telnet। তাই আমি আশা করি লিনাক্স ব্যবহারকারীরা yumএবং এর সাথেও একই কাজ করতে পারেন apt-get
Mig82

উত্তর:


277

বাশ কিছু সময়ের জন্য টিসিপি এবং ইউডিপি বন্দরগুলিতে অ্যাক্সেস করতে সক্ষম হয়েছে । ম্যান পৃষ্ঠা থেকে:

/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

তাআ দা!


এটি মিনিজিডব্লিউতেও কাজ করে বলে মনে হচ্ছে । উদাহরণস্বরূপ, একটি দূরবর্তী VNC- র 192.168.2.100 উপর সার্ভার "বিড়াল </dev/tcp/192.168.2.100/5900" ব্যবহার করে "RFB 003,008" সঙ্গে সাড়া দেয়।
পিটার মর্টেনসেন

1
@ লরনিক্স, ঠিক আছে, তবে এই ক্ষেত্রে আমাকে এনসি ব্যবহার না করে -z বিকল্পের সাথে একই ফলাফলটি পেতে হবে, তবে এটি এখনও কার্যকর হয় না: # এনসি -ভি-ডাব্লু 127.0.0.1 18080 127.0.0.1 18080 পোর্টের সাথে সংযোগ [টিসিপি / *] সফল! # বিড়াল </dev/tcp/127.0.0.1/18080 কেবল কোনও ফলাফল ছাড়াই ঝুলছে। আমি কখন "/ dev / tcp / host / Port" বিকল্পটি ব্যবহার করতে পারি তা কেবল বুঝতে চাই
আলেকজান্দ্র

5
@ আলেকজান্ডার ... আসলে "কোনও ফলাফল ছাড়াই ঝুলন্ত" বেশ প্রত্যাশিত আচরণ। বিড়াল ইনপুট জন্য অপেক্ষা করছে। এনসি- তে অতিরিক্ত স্মার্টস রয়েছে যাতে এটি কোনও ডেটা মুলতুবি থাকা অনুধাবন করতে সক্ষম হয় এবং চেষ্টা করা বন্ধ করে দেয়। বিড়াল নয় বেশ যেমন স্মার্ট। চেষ্টা করুন cat < /dev/tcp/localhost/22, আপনার এসএসডি শিরোনাম পাওয়া উচিত। স্পষ্টতই, 18080 বন্দরে আপনার প্রক্রিয়া কিছু প্রেরণের আগে কিছু আসার জন্য অপেক্ষা করে। পোর্ট 22 ( এসএসএস ) এর সংস্করণ এবং কী নয় আপনাকে আপনাকে অভ্যর্থনা জানায়। চেষ্টা কর!
লার্নিক্স

1
@ লরনিক্স, ব্যাখ্যার জন্য আপনাকে অনেক ধন্যবাদ! এখন সীমাবদ্ধতা স্পষ্ট। আমি মনে করি, বন্দরগুলি পরীক্ষা করার জন্য এনসি ব্যবহার করা পছন্দসই উপায় হওয়া উচিত।
আলেকজান্ডার

2
কোনও ডকারের ধারক যার সাথে কোনও ইনস্টল নেই সেগুলির সাথে কাজ করার সময় এটি অবিশ্বাস্যরূপে সহায়ক। কনটেইনারটি ডিএনএসের মাধ্যমে কনটেইনারযুক্ত ডিবিতে অ্যাক্সেস পেয়েছিল তা দ্রুত যাচাই করতে সক্ষম হয়েছিল। উদাহরণ: বিড়াল </ dev / tcp / হোস্ট-নেম / 5432
মাইকেল হবস

404

সুন্দর এবং ভার্বোজ! ম্যান পেজ থেকে।
একক বন্দর:

nc -zv 127.0.0.1 80

একাধিক বন্দর:

nc -zv 127.0.0.1 22 80 8080

বন্দরগুলির ব্যাপ্তি:

nc -zv 127.0.0.1 20-30

6
মনে হচ্ছে এটি সবচেয়ে উত্তম উত্তর বলে মনে হচ্ছে, ধন্যবাদ। ;-)
lpapp

6
বন্ধ করা বন্দরগুলির জন্য দূরবর্তী সার্ভারের জন্য (একই ল্যান) উবুন্টু 14.04 (বিশ্বস্ত তাহির) এ চেষ্টা করার পরে এটি ঝুলিয়ে দেওয়া হয়েছিল (এটি 127 সেকেন্ড পরে সময়সীমা শেষ হয়েছিল) - সুতরাং স্ক্রিপ্টগুলিতে খুব উপযুক্ত নয় suitable এটি এমন কোনও পরিষেবার জন্য কাজ করেছিল যা বন্দরের খোলা ছিল। "-W2" বিকল্পটি ব্যবহার করা সমাধান হতে পারে।
পিটার মর্টেনসেন

6
ইউডিপি পোর্টগুলির জন্য ইউ-ইউ বিকল্পটি ব্যবহার করুন।
এফরেন

8
সংস্করণে 6.4 এনসিএট-জেডটি স্বীকৃত নয়। আমি z
smishra

5
আপনি এর সাথে একাধিক রেঞ্জ চেক করতে পারেন: nc -zv 127.0.0.1 22,80,8080,20-30,443-446(এনসি সংস্করণ: 1.107-4)।
বোবল

102

নেটকাট একটি দরকারী সরঞ্জাম:

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

0123 পোর্ট খোলা থাকলে এবং 1এটি বন্ধ থাকলে আউটপুট হবে Will


এটি আমার নিজের চেয়ে অনেক বেশি মার্জিত এবং স্ক্রিপ্টযোগ্য উত্তর। এটা আমার জন্য দুর্ভাগ্যজনক যে নিরাপত্তা সচেতন sysadmins যারা বলা telnetএছাড়াও বলা nc(যদিও - অদ্ভুত - না curlবা wget)।
স্টিভ এইচএইচএইচ

হ্যাঁ এটি সম্পূর্ণ স্বেচ্ছাচারী এবং নির্বোধ।
thnee

3
যাক FORবিবৃতি শুরু!
চাদ হ্যারিসন

1
বন্ধ করা বন্দরগুলির জন্য দূরবর্তী সার্ভারের জন্য (একই ল্যান) উবুন্টু 14.04 (বিশ্বস্ত তাহির) এ চেষ্টা করার পরে এটি ঝুলিয়ে দেওয়া হয়েছিল (এটি প্রায় 127 সেকেন্ড পরে শেষ হয়েছিল) - সুতরাং স্ক্রিপ্টগুলিতে খুব উপযুক্ত নয়। এটি এমন কোনও কাজের জন্য কাজ করেছে যা বন্দরের খোলা ছিল, ফিরে আসবে 0. বিকল্পটি "-w2" ব্যবহার করা সমাধান হতে পারে।
পিটার মর্টেনসেন

1
আমি মনে করি -G 2টিসিপি সময়সীমার জন্য আরও উপযুক্ত হবে
বি

58

socatউপরের @ লরিনিক্সের উত্তরে বর্ণিত যেমন অন্য কোনও সরঞ্জাম ব্যবহার না করেই সহজ পদ্ধতি is এটি কেবলমাত্র /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...)এবং সাব-কমান্ডের আউটপুট পুনর্নির্দেশ করি।


এটি দুর্দান্ত। আশা করি এটি শীর্ষে পর্যন্ত ভোট পেয়েছে। আমি কেবল এটি পৃষ্ঠাটি খুব নীচে পড়েছি কারণ এটি বন্ধ করার আগে আমি দুর্ঘটনাক্রমে স্ক্রোল করেছি।
স্টিল.টনি

@ ওকুমা.টনি - হ্যাঁ এটি সবসময়ই কিউ এর একটি সমস্যা যার অনেক উত্তর রয়েছে 8-)। প্রতিক্রিয়া জন্য ধন্যবাদ যদিও, এটি প্রশংসা করা।
slm

46

আমি দেখেছি যে curlকাজ একই ভাবে করার জন্য কাজ পেতে পারেন telnet, এবং curlএমনকি আপনাকে বলতে হবে যা প্রোটোকল শ্রোতা প্রত্যাশা করে।

হোস্টনাম এবং পোর্ট থেকে প্রথম যুক্তি হিসাবে একটি HTTP ইউআরআই তৈরি করুন 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 পোর্টে পৌঁছানো যাবে এবং এটি একটি এএমকিউপি শ্রোতা চালাচ্ছে বলে মনে হচ্ছে।

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

বিভিন্ন বার্তাগুলির মধ্যে পার্থক্য করা গুরুত্বপূর্ণ: প্রথম ব্যর্থতা কারণ curlবন্দরের সাথে সংযোগ স্থাপন করতে পারেনি। দ্বিতীয় ব্যর্থতা একটি সাফল্য পরীক্ষা, যদিও curlএকটি এএমকিউপি শ্রোতার পরিবর্তে এইচটিটিপি শ্রোতার প্রত্যাশিত।


5
কার্ল উপলব্ধ না হলে, উইজেট হতে পারে might wget -qS -O- http://ip.add.re.ss:portকার্যকরভাবে একই জিনিস করা উচিত।
একটি সিভিএন

4
এটি এমনকি কোনও হোস্টনামের সাথেও কাজ করে, প্রাক্তন। curl myhost:22
에이 바

এটি ভুল হতে পারে। আমি টমক্যাট পরিষেবাটি চালাচ্ছি, তবে 404 ত্রুটি পেয়েছি। # কার্ল-কে 192.168.194.4:6443 <html><head> <শিরোনাম> অ্যাপাচি টমক্যাট / 7.0.34 - ত্রুটি প্রতিবেদন </ শিরোনাম << স্টাইল> <! - এইচ 1 --- এইচআর {রঙ: # 525D76;} -> </style> </head><body> <h1> HTTP স্থিতি 404 - / </h1> <এইচআর আকার = "1" নোশিড = "নোশাদে"> <p> <b> টাইপ করুন </ b> স্থিতির প্রতিবেদন </ p> <p> <b> বার্তা </ b> <u>/</u></p><p> <b> বিবরণ </ b> <u> অনুরোধ করা সংস্থানটি উপলভ্য নয়। </u> </p> <এইচআর আকার = "1" নোশাদে = "নোশাদে"> <h3> অ্যাপাচি টমক্যাট / 7.0.34 </h3> </body> </html>

অনুরূপ পদ্ধতির সাথে আমার পোস্ট দেখুন ।
কেনারব

11
[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
এটি কি সর্বদা টিসিপি ব্যবহার করে বা ইউডিপি চেক করার কোনও উপায় আছে?
kmoe

9

এখানে ওয়ান-লাইনার রয়েছে:

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

বাশ সিনট্যাক্স ব্যবহার করে @ লরনিক্স উত্তরে ব্যাখ্যা করা হয়েছে ।

আরও তথ্যের জন্য, চেক করুন: উন্নত বাশ-স্ক্রিপ্টিং গাইড: অধ্যায় 29. /devএবং/proc


বন্ধ বন্দরগুলির সময়সীমা কী?
টিলো

6

আমি পুরো দিন ধরে লড়াই করে যাচ্ছিলাম কারণ এই উত্তরগুলির কোনওোটাই আমার পক্ষে কাজ করে নি বলে মনে হয়। সমস্যাটি হ'ল অতি সাম্প্রতিকতম সংস্করণটিতে ncআর -zপতাকা নেই, তবে হোস্টটি অ্যাক্সেসযোগ্য না হলে টিসিপি দিয়ে সরাসরি অ্যাক্সেস (@ লরনিক্স এবং @ এসএমএল অনুযায়ী) ব্যর্থ হয়। অবশেষে আমি এই পৃষ্ঠাটি পেয়েছি , যেখানে অবশেষে আমি একটি নয় তবে দুটি কার্যকারী উদাহরণ পেয়েছি :

  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কমান্ড সময়সীমার যত্ন নেয়, এবং বাকীটি @ এসএমএল থেকে আসে)

তারপরে, ফলাফলটি বের করতে কেবল &&এবং / অথবা ||(বা এমনকি $?) ব্যবহার করুন । আশা করি, কেউ এই তথ্য দরকারী হিসাবে পাবেন।


3

@ একরব এবং @ আজুকিকুরুর উত্তরগুলির সংমিশ্রণে আপনি পোর্ট খোলা / বন্ধ / ফায়ারওয়াল পরীক্ষা করতে পারেন।

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

3

আপনার সিস্টেমে কী ইনস্টল করা হয়েছে তার উপর নির্ভর করে এমন একটি পদ্ধতি বেছে নেবে যা এখানে একটি ফাংশন:

# 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

2

এটা আপনার বাক্সে উপলব্ধ নাও হতে হবে, কিন্তু দিয়ে চেষ্টা nmap


4
nmapএকটি ভাল সরঞ্জাম, তবে এই সিস্টেমে উপলব্ধ নয়। ডাউনলোডের পরিবর্তে nmap, এটি সংকলন করুন, এটি আমার হোম ডিরেক্টরিতে ইনস্টল করুন, তারপরে এটি অন্য সমস্ত সিস্টেমে অনুলিপি করুন, আমি বেশিরভাগ লিনাক্স ইনস্টলেশনতে বিদ্যমান সরঞ্জামগুলি ব্যবহার করে কোনও উপায় খুঁজে প্রত্যাশা করছিলাম।
স্টিভ এইচএইচএইচ

1

রেফারেন্সের জন্য, @ পেপারুনাসের উত্তরে প্রসারিত:

পরীক্ষার জন্য এনএমএপ ব্যবহারের উপায় হ'ল:

nmap -p 22 127.0.0.1

(উদাহরণস্বরূপ উপরে প্রদর্শনের উদ্দেশ্যে লোকালহোস্ট ব্যবহার করা হয়েছে)


0

আপনি যদি সিস্টেমের চেয়ে বেশি পরীক্ষা করে থাকেন তবে আপনি আমাদের পরীক্ষার সরঞ্জামটি ডিডিএ-সার্ভারস্পেক ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) ব্যবহার করতে পারেন such আপনি আপনার প্রত্যাশা সংজ্ঞায়িত করতে পারেন

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

এবং এই প্রত্যাশাটি হয় স্থানীয় হোস্টের বিরুদ্ধে বা দূরবর্তী হোস্টগুলির বিরুদ্ধে (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

হুডের নীচে আমরা উপরে প্রোক্রোজড হিসাবে নেটকাট ব্যবহার করছি ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.