শেল স্ক্রিপ্ট থেকে দূরবর্তী টিসিপি পোর্ট খোলা থাকলে পরীক্ষা করুন


297

শেল স্ক্রিপ্টের ভিতরে থেকে যদি কোনও প্রদত্ত টিসিপি পোর্ট রিমোট সার্ভারে খোলা থাকে তবে সঠিকভাবে পরীক্ষা করার জন্য আমি একটি দ্রুত এবং সহজ পদ্ধতির সন্ধান করছি।

আমি এটি টেলনেট কমান্ড দিয়ে পরিচালনা করতে পেরেছি এবং বন্দরটি খোলার সময় এটি ঠিকঠাক কাজ করে তবে এটি কখনই শেষ হয় না এবং কেবল সেখানে স্তব্ধ হয়ে যায় ...

একটি নমুনা এখানে:

l_TELNET=`echo "quit" | telnet $SERVER $PORT | grep "Escape character is"`
if [ "$?" -ne 0 ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

আমার হয় আরও ভাল উপায় বা টেলনেটকে টাইমআউট করার জন্য বল প্রয়োগ করার উপায় প্রয়োজন যদি এটি 8 সেকেন্ডের মধ্যে সংযোগ না করে এবং উদাহরণস্বরূপ শেলটিতে আমি ধরতে পারি এমন কোনও কিছু ফিরিয়ে আনুন (রিটার্ন কোড, বা স্ট্রাউডের স্ট্রিং)।

আমি পার্ল পদ্ধতিটি জানি, যা আইও :: সকেট :: আইএনইটি মডিউলটি ব্যবহার করে এবং একটি সফল স্ক্রিপ্ট লিখেছিল যা একটি বন্দর পরীক্ষা করে, তবে সম্ভব হলে পার্ল ব্যবহার করা এড়াতে চাই।

দ্রষ্টব্য: এটি আমার সার্ভারটি চলছে (যেখানে এটি থেকে আমার চালানো দরকার)

সুনোস 5.10 জেনেরিক_139556-08 আই 86 পিসি আই 386 আই 86 পিসি



উত্তর প্রত্যাশার সাথে মিথ্যা। আমরা একটি সাধারণ স্ক্রিপ্ট লিখেছিলাম যা আমাদের প্রয়োজন বন্দরটিতে একটি টেলনেট পাঠায়, যার সময়সীমা 8 সেকেন্ড ছিল। এগুলি থেকে বাছাই করার জন্য প্রচুর উদাহরণ রয়েছে। আমরা এই পোস্টে বন্ধ ভিত্তিক আমাদিগের: unix.com/shell-programming-scripting/...
Yanick Girouard

1
github.com/monmitted-plugins/monmitted-plugins থেকে check_tcp স্ট্রিং প্রবেশ করানো এবং প্রত্যাশিত উত্তরের জন্য যাচাই করা সহ এটি করতে পারে।

উত্তর:


452

বি রোডস দ্বারা চিহ্নিত হিসাবে, কাজ ncকরবে। এটি ব্যবহারের আরও কমপ্যাক্ট উপায়:

nc -z <host> <port>

সেই ncপথটি কেবল পোর্টটি খোলা আছে কিনা তা পরীক্ষা করে দেখবে, সাফল্যে 0, ব্যর্থতার সাথে 1 দিয়ে বেরিয়েছে।

দ্রুত ইন্টারেক্টিভ চেকের জন্য (5 সেকেন্ডের সময়সীমা সহ):

nc -z -v -w5 <host> <port>

48
Centos7 ডিফল্ট nmap নেটক্যাট ব্যবহার করে এবং -z বিকল্প নেই।
jolestar

7
এটি আরএইচইএল / সেন্টোসে কাজ করে না। এই
ডিসট্রোসগুলির

2
এফডাব্লুআইডাব্লু, আমি আমার উত্তর সম্পূর্ণরূপে একটি উদাহরণের সাথে
নিরীক্ষণ করেছি, আরএইচইএল

4
কমপক্ষে ম্যাকের -G#সময়সীমা ছাড়াও আপনাকে সংযোগের সময়সীমা আলাদা করতে সংযুক্ত করার প্রয়োজন হতে পারে -w#যা মূলত পঠনের সময়সীমা হিসাবে কাজ করে।
ডক্টর জে

1
@ জোলেস্টার -zবিকল্পটি পেতে আপনি সেন্টোস 7 এ ম্যানুয়ালি এনকাট আপগ্রেড করতে পারেন । আপনি বিবেচনা করতে চাইতে পারেন: unix.stackexchange.com/questions/393762/…
ড্যামিয়েন Ó Ceallaigh

149

এর বিকল্পগুলি -zএবং -w TIMEOUTবিকল্পগুলির সাথে এটি করা যথেষ্ট সহজ ncতবে সমস্ত সিস্টেম ncইনস্টল করে নি। আপনার কাছে বাশের সাম্প্রতিক পর্যায়ে সংস্করণ থাকলে এটি কাজ করবে:

# Connection successful:
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/google.com/80'
$ echo $?
0

# Connection failure prior to the timeout
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/sfsfdfdff.com/80'
bash: sfsfdfdff.com: Name or service not known
bash: /dev/tcp/sfsfdfdff.com/80: Invalid argument
$ echo $?
1

# Connection not established by the timeout
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/google.com/81'
$ echo $?
124

এখানে যা ঘটছে তা হ'ল timeoutসাবকম্যান্ডটি চালাবেন এবং নির্দিষ্ট সময়সীমার (উপরের উদাহরণের 1 সেকেন্ড) মধ্যে না বেরিয়ে এলে এটি মেরে ফেলবেন। এই ক্ষেত্রে bashসাবকম্যান্ড এবং নির্দিষ্ট সার্ভার এবং পোর্টের সাথে সংযোগ স্থাপনের চেষ্টা করার জন্য এর বিশেষ / dev / tcp হ্যান্ডলিং ব্যবহার করে। bashসময়সীমার মধ্যে যদি সংযোগটি খুলতে পারে তবে catতা অবিলম্বে এটি বন্ধ করে দেওয়া হবে (যেহেতু এটি পড়ছে /dev/null) এবং একটি স্ট্যাটাস কোড সহ প্রস্থান 0করবে যার মাধ্যমে bashএবং পরে প্রচার করবে timeoutbashনির্দিষ্ট সময়সীমার আগে যদি কোনও সংযোগ ব্যর্থতা পায় তবে bash1 এর প্রস্থান কোড সহ প্রস্থান timeoutকরবেন যা আবার ফিরে আসবে। এবং যদি বাশ কোনও সংযোগ স্থাপন করতে সক্ষম না হয় এবং নির্দিষ্ট সময়সীমাটির মেয়াদ শেষ হয়, তবেtimeoutbash124 এর স্থিতি দিয়ে হত্যা করবে এবং প্রস্থান করবে ।


1
/dev/tcpলিনাক্স ব্যতীত অন্যান্য সিস্টেমে কি উপলব্ধ? বিশেষত ম্যাকস সম্পর্কে কী?
পিটার

8
/ Dev / tcp জিনিসটি ব্যাশের একটি বৈশিষ্ট্য, তাই হ্যাঁ। তবে দেখে মনে হচ্ছে
ম্যাকসের

1
@ অলিয়োনন - দেখে মনে হচ্ছে timeoutএটি ফ্রিবিএসডি-তে নেই এবং আমার পুরানো উবুন্টু বাক্সে এটি একটি ইনস্টলযোগ্য প্যাকেজ রয়েছে তবে এটি ডিফল্টরূপে নেই। টাইমআউট বা নেটক্যাটের মতো তৃতীয় পক্ষের সরঞ্জামগুলি ব্যতীত একা বাশে এটি করার উপায় থাকলে খুব দুর্দান্ত।
গ্রাহাম

3
শুধু যে উল্লেখ করতে চেয়েছিলেন timeoutপ্রদর্শিত হয় গনুহ coreutils অংশ হতে এবং homebrew সঙ্গে Macs- এর ইনস্টল করা যাবে: brew install coreutils। এটি তখন হিসাবে উপলব্ধ হবে gtimeout
কেবলমাত্র

1
@ উইল্ডকার্ড একটি ব্যাশ পরিবর্তনের লগের পরামর্শ দেয় bash-2.04-devel, যদিও হোস্ট নামের জন্য সমর্থন যুক্ত করা যেতে পারে bash-2.05-alpha1
একিউম্যানাস

109

TOC:

  • ব্যাশ এবং timeout
    • হুকুম
    • উদাহরণ
  • ব্যবহার nc
    • হুকুম
    • RHEL 6 (এনসি-1.84)
      • স্থাপন
      • উদাহরণ
    • RHEL 7 (nmap-ncat-6.40)
      • স্থাপন
      • উদাহরণ
  • মন্তব্য

ব্যাশ এবং ব্যবহার করে timeout:

নোট যেটি timeoutRHEL 6+ এর সাথে উপস্থিত থাকতে হবে বা বিকল্পভাবে জিএনইউ কোর্টিলস 8.22 তে পাওয়া যাবে। MacOS এ এটি ব্যবহার করে ইনস্টল করুন brew install coreutilsএবং এটি হিসাবে ব্যবহার করুন gtimeout

COMMAND:

$ timeout $TIMEOUT_SECONDS bash -c "</dev/tcp/${HOST}/${PORT}"; echo $?

হোস্ট এবং পোর্টকে প্যারামিট্রাইজ করা হলে, উপরের মতো ${HOST}এবং সেগুলি নির্দিষ্ট করে দেওয়ার বিষয়ে নিশ্চিত হন ${PORT}। এগুলিকে কেবল $HOSTএবং হিসাবে উল্লেখ করবেন না $PORT, যেমন ধনুর্বন্ধনী ছাড়া; এটি এই ক্ষেত্রে কাজ করবে না।

উদাহরণ:

সাফল্য:

$ timeout 2 bash -c "</dev/tcp/canyouseeme.org/80"; echo $?
0

ব্যর্থতা:

$ timeout 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?
124

যদি আপনার অবশ্যই প্রস্থান স্থিতি সংরক্ষণ করতে পারে bash,

$ timeout --preserve-status 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?
143

ব্যবহার nc:

দ্রষ্টব্য যে ncRHEL 7 এ একটি পশ্চাদপটে অসঙ্গতিপূর্ণ সংস্করণ ইনস্টল হয়ে গেছে।

COMMAND:

মনে রাখবেন যে নীচের কমান্ডটি অনন্য that

$ nc -w $TIMEOUT_SECONDS -v $HOST $PORT </dev/null; echo $?

RHEL 6 (এনসি-1.84):

স্থাপন:

$ sudo yum install nc

উদাহরণ:

সাফল্য:
$ nc -w 2 -v canyouseeme.org 80 </dev/null; echo $?
Connection to canyouseeme.org 80 port [tcp/http] succeeded!
0
ব্যর্থতা:
$ nc -w 2 -v canyouseeme.org 81 </dev/null; echo $?
nc: connect to canyouseeme.org port 81 (tcp) timed out: Operation now in progress
1

যদি হোস্টনাম একাধিক আইপি-তে মানচিত্র করে, তবে উপরের ব্যর্থ কমান্ডটি তাদের অনেক বা সমস্তের মধ্যেই সাইকেল চালাবে। উদাহরণ স্বরূপ:

$ nc -w 2 -v microsoft.com 81 </dev/null; echo $?
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
1

RHEL 7 (nmap-ncat-6.40):

স্থাপন:

$ sudo yum install nmap-ncat

উদাহরণ:

সাফল্য:
$ nc -w 2 -v canyouseeme.org 80 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 52.202.215.126:80.
Ncat: 0 bytes sent, 0 bytes received in 0.22 seconds.
0
ব্যর্থতা:
$ nc -w 2 -v canyouseeme.org 81 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connection timed out.
1

যদি হোস্টনাম একাধিক আইপি-তে মানচিত্র করে, তবে উপরের ব্যর্থ কমান্ডটি তাদের অনেক বা সমস্তের মধ্যেই সাইকেল চালাবে। উদাহরণ স্বরূপ:

$ nc -w 2 -v microsoft.com 81 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connection to 104.43.195.251 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 23.100.122.175 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 23.96.52.53 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 191.239.213.197 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection timed out.
1

মন্তব্য:

-v( --verbose) যুক্তি এবং echo $?কমান্ড শুধুমাত্র চিত্রণ জন্য অবশ্যই আছে।


3
timeout 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?দারুণ পয়েন্ট!
ipacocks

যোগ 2>&1না প্রতিধ্বনি অবস্থা result_test=$(nc -w 2 $ip_addreess 80 </dev/null 2>&1 ; echo $?)
সংযা Snex

55

আপনার সাথে netcatকোনও বন্দরটি এভাবে খোলা আছে কিনা তা পরীক্ষা করে দেখতে পারেন:

nc my.example.com 80 < /dev/null

ncটিসিপি বন্দরটি খোলা থাকলে এবং তার ব্যর্থতা (সাধারণত রিটার্ন কোড 1) টিসিপি সংযোগ তৈরি না করতে পারলে এর রিটার্ন মান সাফল্য হবে।

ncআপনি যখন এটি চেষ্টা করবেন তখন এর কয়েকটি সংস্করণ হ্যাং হয়ে যাবে, কারণ তারা ফাইলের শেষের দিক থেকে প্রাপ্ত হওয়ার পরেও তাদের সকেটের অর্ধেক প্রেরণ বন্ধ করে না /dev/null। আমার নিজের উবুন্টু ল্যাপটপে (18.04), netcat-openbsdআমি ইনস্টল করা নেটকাটের সংস্করণটি একটি কার্যকরী প্রস্তাব দেয়: -Nতাত্ক্ষণিক ফলাফল পাওয়ার জন্য বিকল্পটি প্রয়োজনীয়:

nc -N my.example.com 80 < /dev/null

1
এর স্বাদের জন্য দুর্দান্ত কাজ করে ncযা -wপতাকাটিকে সমর্থন করে না ।
ডেভিড ডসট

5
ধন্যবাদ - -zসমর্থন ব্যতীত এনসির সংস্করণগুলির জন্যও কাজ করে - আরএইচইএল / সেন্টোস on এ কাজ করে, উদাহরণস্বরূপ
অ্যান্ড্রু

1
যদিও এই পদ্ধতিটি ভাল, -wপ্রয়োজনীয়, এটি কোনও ব্যর্থতা যা কোনও স্ক্রিপ্টে ব্যবহৃত কমান্ডটি দশ সেকেন্ডের জন্য স্থির রাখতে পারে। আমি একটি উত্তর লিখেছি যা অন্তর্ভুক্ত -w
একিউম্যানাস

2
+1 এটি দুর্দান্ত কারণ এনসি আলপাইন লিনাক্স এবং উবুন্টু উভয়ের সাথেই স্ট্যান্ডার্ড আসে। সম্ভবত অন্যরা। আপনি যখন সরিয়ে চলেছেন এবং পারবেন না তখন অতিরিক্ত ইনস্টল করার দরকার নেই। এর জন্য ধন্যবাদ! আমি যুক্ত করতে পারি,nc host port -w 2 && echo it works
std''OrgnlDave

2
আমি পছন্দ nc -vz localhost 3306। এটি আরও ভার্বোজ আউটপুট দেয়। এটি কেবল ম্যাকের জন্য চেষ্টা করে।
EFreak

29

বাশ -এ টিসিপি / ইউডিপি সংযোগের জন্য সিউডো-ডিভাইস ফাইলগুলি সরাসরি ব্যবহার করা যায়। লিপিটি এখানে:

#!/usr/bin/env bash
SERVER=example.com
PORT=80
</dev/tcp/$SERVER/$PORT
if [ "$?" -ne 0 ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

পরীক্ষামূলক:

$ ./test.sh 
Connection to example.com on port 80 succeeded

এখানে ওয়ান-লাইনার (ব্যাশ সিনট্যাক্স):

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

নোট করুন যে কিছু সার্ভারগুলি ফায়ারওয়াল এসওয়াইএন বন্যার আক্রমণ থেকে সুরক্ষিত থাকতে পারে, তাই আপনি টিসিপি সংযোগের সময়সীমা (~ 75 সেকস) অনুভব করতে পারেন। সময়সীমা ইস্যুটির যথাযথ সমাধান করতে, চেষ্টা করুন:

timeout 1 bash -c "</dev/tcp/stackoverflow.com/81" && echo Port open. || echo Port closed.

দেখুন: টিসিপি কানেক্ট () সিস্টেম কল টাইমআউট কীভাবে হ্রাস করবেন?


1
@ এ বি বি এটি সার্ভারের ফায়ারওয়াল কনফিগারেশনের সাথে সম্পর্কিত যা কোনও এসওয়াইএন বন্যার আক্রমণ প্রতিরোধ করতে কোনও প্রতিক্রিয়া দেয় না। দৌড়াদৌড়িও telnet canyouseeme.org 81ঝুলছে। এটি আপনার টাইম আউট সীমা দ্বারা নিয়ন্ত্রিত হয় যা সম্ভবত ব্যাশে হার্ডকডযুক্ত। দেখুন: হ্রাস টিসিপি সংযোগ () সিস্টেম কল সময়সীমা
কেনারব

প্যারামিট্রাইজেশনের জন্য , কমপক্ষে এবং হিসাবে, এখন এটি নির্দিষ্ট করা $SERVERএবং $PORTধনুর্বন্ধনী সহ প্রয়োজনীয় বলে মনে হচ্ছে । ${SERVER}${PORT}
অ্যাকিউম্যানাস

13

একাধিক গিট সংগ্রহস্থলগুলিতে কাজ করার জন্য আমার আরও নমনীয় সমাধান প্রয়োজন তাই আমি 1 এবং 2 এর ভিত্তিতে নিম্নলিখিত sh কোডটি লিখেছিলাম । আপনি gitlab.com এর পরিবর্তে আপনার সার্ভারের ঠিকানা এবং 22 এর পরিবর্তে আপনার পোর্ট ব্যবহার করতে পারেন।

SERVER=gitlab.com
PORT=22
nc -z -v -w5 $SERVER $PORT
result1=$?

#Do whatever you want

if [  "$result1" != 0 ]; then
  echo  'port 22 is closed'
else
  echo 'port 22 is open'
fi

1
ধন্যবাদ! এটি আমার জীবনকে /etc/rc.local এর পক্ষে সহজ করে তোলে
শাহিন খালেদ

10

আপনি যদি ksh বা ব্যাশ ব্যবহার করছেন তবে তারা উভয়ই / dev / tcp / IP / PORT কনস্ট্রাক্ট ব্যবহার করে সকেটে / থেকে IO পুনঃনির্দেশ সমর্থন করে । এই সালে Korn থেকে শেল উদাহরণ আমি পুনঃনির্দেশিত am কোন সমিতি এর ( : ) std-ইন একটি সকেট থেকে:

W$ python -m SimpleHTTPServer &
[1]     16833
Serving HTTP on 0.0.0.0 port 8000 ...
W$ : </dev/tcp/127.0.0.1/8000

সকেটটি খোলা না থাকলে শেলটি একটি ত্রুটি মুদ্রণ করে:

W$ : </dev/tcp/127.0.0.1/8001
ksh: /dev/tcp/127.0.0.1/8001: cannot open [Connection refused]

অতএব আপনি যদি এটি কোনও শর্তে পরীক্ষা হিসাবে ব্যবহার করতে পারেন :

SERVER=127.0.0.1 PORT=8000
if (: < /dev/tcp/$SERVER/$PORT) 2>/dev/null
then
    print succeeded
else
    print failed
fi

নো-ওপেনটি একটি সাব-শেলের মধ্যে রয়েছে সুতরাং এসএসডি-ইন পুনঃনির্দেশ ব্যর্থ হলে আমি স্টাডি-ইরর ফেলে দিতে পারি।

আমি প্রায়শই HTTP- র মাধ্যমে কোনও উত্সের প্রাপ্যতা পরীক্ষা করার জন্য / dev / tcp ব্যবহার করি :

W$ print arghhh > grr.html
W$ python -m SimpleHTTPServer &
[1]     16863
Serving HTTP on 0.0.0.0 port 8000 ...
W$ (print -u9 'GET /grr.html HTTP/1.0\n';cat <&9) 9<>/dev/tcp/127.0.0.1/8000
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.6.1
Date: Thu, 14 Feb 2013 12:56:29 GMT
Content-type: text/html
Content-Length: 7
Last-Modified: Thu, 14 Feb 2013 12:55:44 GMT

arghhh
W$ 

এই ওয়ান-লাইনারটি সকেট থেকে পড়া এবং লেখার জন্য ফাইল বর্ণনাকারী 9 খুলবে , সকেটে HTTP GET মুদ্রণ করে এবং সকেট catথেকে পড়তে ব্যবহার করে।


1
@ এএবিবি আমার মনে হয় আপনার বোঝানো হচ্ছে এটি দীর্ঘ সময়ের জন্য স্তব্ধ হয়ে থাকে যদি বন্দরটি কোনও প্রতিক্রিয়া না দেখায় যেমন উদাহরণস্বরূপ ফিল্টার করা হয় বা আইপি তে কিছুই থাকে না। যদি বন্দরটি সক্রিয়ভাবে সংযোগটি অস্বীকার করে তবে একটি বন্দর বন্দর কোনও বিলম্ব ঘটায় না। অনেক উদ্দেশ্যে এটি বেশ গ্রহণযোগ্য।
এমসি 01

এই কৌশলটি ইতিমধ্যে কেনারব দ্বারা পূর্বের উত্তরে এই উত্তরের আগে পোস্ট করা হয়েছিল । যাইহোক, বড় বিষয়টি হ'ল এটি যদি দীর্ঘ সময় ধরে স্তব্ধ থাকে তবে বন্দরটি প্রতিক্রিয়া জানায় না। উদাহরণস্বরূপ, </dev/tcp/canyouseeme.org/80এবং তারপর চেষ্টা করুন </dev/tcp/canyouseeme.org/81
অ্যাকিউম্যানাস

9

একটি পুরানো প্রশ্ন থাকাকালীন, আমি কেবল এর বৈচিত্রটি নিয়ে কাজ করেছি, তবে এখানকার কোনও সমাধানই কার্যকর ছিল না, তাই আমি অন্য একটি সন্ধান পেয়েছি এবং এটি উত্তরোত্তর জন্য যুক্ত করছি am হ্যাঁ, আমি জানি ওপি বলেছিল যে তারা এই বিকল্প সম্পর্কে সচেতন ছিল এবং এটি তাদের উপযুক্ত নয়, তবে যে কারওর অনুসরণ করে এটি কার্যকর হতে পারে।

আমার ক্ষেত্রে, আমি একটি apt-cacher-ngথেকে স্থানীয় পরিষেবার প্রাপ্যতার জন্য পরীক্ষা করতে চাইdocker বিল্ড । তার মানে পরীক্ষার পূর্বে একেবারে কিছু ইনস্টল করা যাবে না। কোন nc, nmap, expect, telnetবা pythonperlতবে মূল গ্রন্থাগারগুলির সাথে উপস্থিত রয়েছে, তাই আমি এটি ব্যবহার করেছি:

perl -MIO::Socket::INET -e 'exit(! defined( IO::Socket::INET->new("172.17.42.1:3142")))'

6

কিছু ক্ষেত্রে যেখানে কার্ল, টেলনেট, এনসি ও এনম্যাপের মতো সরঞ্জামগুলি উপলভ্য নয় আপনার কাছে এখনও উইজেটের সুযোগ রয়েছে

if [[ $(wget -q -t 1 --spider --dns-timeout 3 --connect-timeout 10  host:port; echo $?) -eq 0 ]]; then echo "OK"; else echo "FAIL"; fi

6

ব্যাশ ব্যবহার করে বন্দরগুলি পরীক্ষা করুন

উদাহরণ

$ ./test_port_bash.sh 192.168.7.7 22

22 বন্দর খোলা আছে

কোড

HOST=$1
PORT=$2
exec 3> /dev/tcp/${HOST}/${PORT}
if [ $? -eq 0 ];then echo "the port $2 is open";else echo "the port $2 is closed";fi

4

আপনি যদি ব্যবহার করতে চান ncতবে সমর্থন করে এমন কোনও সংস্করণ না থাকলে -zব্যবহার করার চেষ্টা করুন --send-only:

nc --send-only <IP> <PORT> </dev/null

এবং সময়সীমা সহ:

nc -w 1 --send-only <IP> <PORT> </dev/null

এবং ডিএনএস অনুসন্ধান ছাড়া এটি কোনও আইপি:

nc -n -w 1 --send-only <IP> <PORT> </dev/null

এটি কোডগুলি -zসংযুক্ত করতে পারে কিনা তার ভিত্তিতে হিসাবে ফেরত দেয় ।


1

আমি অনুমান করছি যে উত্তরের জন্য খুব দেরি হয়ে গেছে, এবং এটি ভাল নাও হতে পারে তবে আপনি এখানে যান ...

এটি কোনও ধরণের টাইমার দিয়ে কিছুক্ষণ লুপের ভিতরে রাখার বিষয়ে। আমি সোলারিসের চেয়ে পার্ল লোকের চেয়ে বেশি, তবে আপনি যে শেলটি ব্যবহার করছেন তার উপর নির্ভর করে আপনার মতো কিছু করতে সক্ষম হওয়া উচিত:

TIME = 'date +%s' + 15
while TIME != `date +%s'
do whatever

এবং তারপরে কেবল লুপটিতে একটি পতাকা যুক্ত করুন, যাতে এটি শেষ হওয়ার আগে যদি সময়সীমা বেঁধে যায়, আপনি ব্যর্থতার কারণ হিসাবে সময়সীমাটি উদ্ধৃত করতে পারেন।

আমি সন্দেহ করি যে টেলনেটের একটি সময়সীমাও রয়েছে, তবে আমার মাথার উপরের অংশটি ছেড়ে, আমি মনে করি উপরের কাজ করবে।


1

আমার শর্ট স্ক্রিপ্টের দরকার ছিল যা ক্রোন চালিত হয়েছিল এবং আউটপুট নেই। আমি nmap ব্যবহার করে আমার সমস্যা সমাধান করেছি

open=`nmap -p $PORT $SERVER | grep "$PORT" | grep open`
if [ -z "$open" ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

এটি চালানোর জন্য আপনার এনএম্যাপ ইনস্টল করা উচিত কারণ এটি ডিফল্ট ইনস্টলড প্যাকেজ নয়।


nmapস্টপআউটে প্রেরণে গ্রীপযোগ্য আউটপুটও কার্যকর হতে পারে -oG -। (গ্রেপকে কিছুটা সংশোধন করার প্রয়োজন হবে)
গার্ট ভ্যান ডান বার্গ

0

এটি পর্দার পিছনে টেলনেট ব্যবহার করে এবং ম্যাক / লিনাক্সে দুর্দান্ত কাজ করে বলে মনে হচ্ছে। লিনাক্স / ম্যাকের সংস্করণগুলির মধ্যে পার্থক্যের কারণে এটি নেটক্যাট ব্যবহার করে না এবং এটি ডিফল্ট ম্যাক ইনস্টলের সাথে কাজ করে।

উদাহরণ:

$ is_port_open.sh 80 google.com
OPEN

$ is_port_open.sh 8080 google.com
CLOSED

is_port_open.sh

PORT=$1
HOST=$2
TIMEOUT_IN_SEC=${3:-1}
VALUE_IF_OPEN=${4:-"OPEN"}
VALUE_IF_CLOSED=${5:-"CLOSED"}

function eztern()
{
  if [ "$1" == "$2" ]
  then
    echo $3
  else
    echo $4
  fi
}

# cross platform timeout util to support mac mostly
# https://gist.github.com/jaytaylor/6527607
function eztimeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }

function testPort()
{
  OPTS=""

  # find out if port is open using telnet
  # by saving telnet output to temporary file
  # and looking for "Escape character" response
  # from telnet
  FILENAME="/tmp/__port_check_$(uuidgen)"
  RESULT=$(eztimeout $TIMEOUT_IN_SEC telnet $HOST $PORT &> $FILENAME; cat $FILENAME | tail -n1)
  rm -f $FILENAME;
  SUCCESS=$(eztern "$RESULT" "Escape character is '^]'." "$VALUE_IF_OPEN" "$VALUE_IF_CLOSED")

  echo "$SUCCESS"
}

testPort 

0

সর্বাধিক ভোটপ্রাপ্ত উত্তরের উপর ভিত্তি করে তৈরি করা, এখানে একটি সময়সীমা সহ দুটি বন্দর উন্মুক্ত হওয়ার জন্য অপেক্ষা করার একটি ফাংশন রয়েছে। দু'টি বন্দর যা 886 এবং 1111 খোলা থাকবে সেই সাথে ম্যাক্স_আর্টেম্পটস (প্রতি সেকেন্ডে 1) নোট করুন।

function wait_for_server_to_boot()
{
    echo "Waiting for server to boot up..."
    attempts=0
    max_attempts=30
    while ( nc 127.0.0.1 8890 < /dev/null || nc 127.0.0.1 1111 < /dev/null )  && [[ $attempts < $max_attempts ]] ; do
        attempts=$((attempts+1))
        sleep 1;
        echo "waiting... (${attempts}/${max_attempts})"
    done
}

-1

স্থানীয় পোর্টের জন্য পরীক্ষার জন্য nmap-ncat যা ইতিমধ্যে ব্যবহৃত হচ্ছে না


availabletobindon() {
  port="$1"
  nc -w 2 -i 1 localhost "$port" 2>&1 | grep -v -q 'Idle timeout expired'
  return "$?"
}

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