দক্ষতার সাথে পরীক্ষা করুন যদি লিনাক্সে কোনও বন্দর খোলা থাকে?


197

কোনও বাশ স্ক্রিপ্ট থেকে কীভাবে আমি 445কোনও সার্ভারে কোনও পোর্ট খোলা / শুনছি কিনা তা দ্রুত জানতে পারি ।

আমি বেশ কয়েকটি অপশন চেষ্টা করেছি, তবে আমি দ্রুত কিছু চাই:
lsof -i :445 (সেকেন্ড নেয়)
netstat -an |grep 445 |grep LISTEN(কয়েক সেকেন্ড সময় নেয়)
telnet(এটি ফিরে আসে না)
৪. nmap, netcatসার্ভারে উপলব্ধ নয়

এটির জন্য প্রথমে গণনা না করা এবং এর পরে গ্রেপস জেনে ভাল লাগবে।


1
নেটকাট পাওয়া যায়? এটির একটি দ্রুত ব্যর্থ পথ আইআইআরসি রয়েছে। নেটকাট.সোর্সফোর্জন.নেট
জিমআর

5
netstat -lnt(সাথে -tএবং বাইরে -a) কেবলমাত্র টিসিপি সংযোগ শোনার ক্ষেত্রে আউটপুটকে সীমাবদ্ধ করবে। এটি কিছুটা গতি বাড়িয়ে দিতে পারে। আপনার -4যদি আইপিভি 6 এর প্রয়োজন না হয় তবেই আপনি আইপিভি 4 এর জন্য যুক্ত করতে পারেন।
বার্তোসক মকজুলস্কি 21

lsof -i একটি ব্যক্তিগত প্রিয়।
ম্যাট জয়েস

14
netstat -an | grep PORTNUMBER | grep -i listenযদি আউটপুট খালি থাকে তবে পোর্টটি ব্যবহার হচ্ছে না।
অটোম্যাটিক্স

আমি জানি না কেন আপনার lsofজন্য ধীর কারণ, তবে সাধারণত আপনি তালিকাভুক্ত সমাধানগুলির মধ্যে এটি সেরা the আপনার netstatসমাধান খুব নির্ভরযোগ্য নয় (আপনি যখনই ব্যবহার করবেন আপনি এটি অনুমান করতে পারেন grep; যাইহোক কেউ যদি উদাহরণস্বরূপ 4450 শুনছেন তবে এটি সত্য হয়)। telnetএবং netcatআসলে একটি সংযোগ তৈরি করার চেষ্টা করুন, যা সর্বদা আপনি চান তা নাও হতে পারে।
পিটারসোহন

উত্তর:


154

সম্প্রতি অবাক হয়ে আমি জানতে পারি যে বাশ স্থানীয়ভাবে ফাইল বর্ণনাকারী হিসাবে টিসিপি সংযোগ সমর্থন করে । ব্যবহার করা:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

আমি ফাইল বর্ণনাকারী হিসাবে 6 ব্যবহার করছি কারণ 0,1,2 স্টিডিন, স্টাডআউট এবং স্টার্ডার। 5 বাশ কখনও কখনও শিশু প্রক্রিয়াগুলির জন্য ব্যবহার করে , সুতরাং 3,4,6,7,8, এবং 9 টি নিরাপদ থাকতে হবে।

নীচের মন্তব্য অনুসারে, কোনও স্ক্রিপ্টে স্থানীয় সার্ভারে শোনার জন্য পরীক্ষা করতে :

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

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

আপনার ব্যবহারের ক্ষেত্রে যেমন এটি ইমেল প্রেরণ করা, ব্যর্থতায় স্ক্রিপ্ট থেকে বেরিয়ে আসা বা প্রয়োজনীয় পরিষেবা শুরু করা যেমন এটির জন্য সংশোধন করুন।


2
এটি কেবল আমার জন্য ফাঁসি হয়েছে।
আমান জৈন 21

@ আমানজেইন বিড়াল ইওএফ বা সিটিআরএল-সি ছাড়ার জন্য অপেক্ষা করছে। আপনার প্রোটোকলের জন্য আপনাকে এটি সামঞ্জস্য করতে হবে। বিটিডাব্লু আপনি কি এটি কোনও রিমোট সার্ভারে চালাচ্ছেন?
স্পেনসার রথবুন

আমি /etc/init.d/ এর অধীনে সার্ভারের একটি স্ক্রিপ্টে পোর্ট চেকিং কোড এম্বেড করতে চাই
আমান জৈন

@ আমানজাইন আমি একটি স্থানীয় সিস্টেমের জন্য এটি আপডেট করেছি। আপনি কি এটি সঠিক শুনছেন কিনা তা খতিয়ে দেখতে চান? কোনও প্রোটোকল চেকিং নেই, যেমন HTTP- র মাধ্যমে কোনও পৃষ্ঠার অনুরোধ করা?
স্পেনসার রথবুন

1
এটি কোনও নির্ভরযোগ্য পদ্ধতি নয়, কারণ সমস্ত ওএস নয় (যেমন উবুন্টু 16 যেমনটি আমি আবিষ্কার করেছি) /dev/tcp/IP/PORTগাছ তৈরির জন্য সংকলিত
ব্যাশের

107

এখানে "দ্রুত উত্তর" সহ একটি খুব সংক্ষিপ্ত রয়েছে: শেল স্ক্রিপ্ট থেকে দূরবর্তী টিসিপি পোর্টটি খোলা থাকলে কীভাবে পরীক্ষা করবেন?

nc -z <host> <port>; echo $?

আমি এটি 127.0.0.1 এর সাথে "দূরবর্তী" ঠিকানা হিসাবে ব্যবহার করি।

এটি পোর্ট খোলা থাকলে "0" এবং পোর্ট বন্ধ থাকলে "1" প্রদান করে

যেমন

nc -z 127.0.0.1 80; echo $?

-z নির্দিষ্ট করে যে এনসি কেবলমাত্র ডেমনগুলি শোনার জন্য তাদের কোনও ডেটা না প্রেরণে স্ক্যান করবে। এই বিকল্পটি -l বিকল্পের সাথে সম্মিলিতভাবে ব্যবহার করা একটি ত্রুটি।


2
ধন্যবাদ এটি সহজতম উপায় বলে মনে হচ্ছে, ধন্যবাদ। স্যাম্পল স্ক্রিপ্ট লিঙ্কটি আর কাজ করছে না, তবে এটি যাইহোক বেশ স্ব-ব্যাখ্যা করছে।
derFunk

নিস! এটি অনেকগুলি বন্দর খোলা সার্ভারের অন্যান্য উত্তরগুলির তুলনায় অনেক দ্রুত। আমার জন্য <0.01 সেকেন্ডের মধ্যে ফিরে আসে যখন নেটস্যাট / লসফ
টিম

2
-Z পতাকাটি এনএমএপ ভিত্তিক এনসিএটিতে পাওয়া যায় না যা সবচেয়ে সাম্প্রতিকভাবে ফেডোরা, সেন্টোস ইত্যাদি দিয়ে পাঠায় (nmap-ncat-6.01-9.fc18.x86_64)
জ্যাক

9
পাল্টা স্বজ্ঞাতভাবে, বন্দরটি খোলা থাকলে এই "0" এবং বন্দরটি বন্ধ থাকলে "1" প্রদান করে।
শান

3
@ শিয়ান ইউনিক্স কমান্ডগুলি সাধারণত সাফল্য এবং ব্যর্থতার জন্য শূন্য-নির্দেশিত করতে '0' ফিরিয়ে দেয়। সুতরাং '0' ইঙ্গিত করে যে এটি সফলভাবে সংযুক্ত হয়েছে এবং শূন্য নয় যে এটি কোনও কারণে সংযুক্ত হয়নি। নোট করুন, তবে, 'এনসি'র কিছু সংস্করণ' -z 'যুক্তিটিকে সমর্থন করে না তাই stackoverflow.com/a/25793128/6773916 তর্কাতীতভাবে একটি ভাল সমাধান।
ধনী সেডম্যান

89

আপনি আরও দ্রুত ফলাফলের জন্য এইভাবে নেটস্যাট ব্যবহার করতে পারেন:

লিনাক্সে:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

ম্যাকে:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

এটি পোর্টে শোনার প্রক্রিয়াগুলির একটি তালিকা আউটপুট করবে (এই উদাহরণে 445) বা পোর্টটি বিনামূল্যে থাকলে কিছুই আউটপুট দেবে না।


1
আপনার নেটস্যাট সিনট্যাক্সটি ভুল। netstat -ln --tcp কাজ করে তবে তবু ধীর হয়
আমান জৈন

6
আসলে এটি সঠিক বাক্য গঠন তবে সম্ভবত আপনি লিনাক্স ব্যবহার করছেন এবং আমি ম্যাক এ আছি। লিনাক্সের জন্য এটি ব্যবহার করুন:netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
অনুভভা

21
এই কিছুই আউটপুট।
জর্জেন পল

1
প্রশ্নটি যদিও লিনাক্স সম্পর্কে ছিল, সুতরাং সম্ভবত মন্তব্যটির উত্তর হওয়া উচিত।
আপক্রিক

1
80 বন্দরটি পরীক্ষা করার জন্য আমার ব্যবহার করা দরকার awk '$6 == "LISTEN" && $4 ~ "80$"'। পরিবর্তে পোর্ট নম্বর সহ বিন্দুটির জন্য পরীক্ষা করার পরিবর্তে \.80, আমি ব্যবহার করেছি 80$। অন্যথায়, এই এছাড়াও ধারণকারী IP ঠিকানা মিলেছে .80এবং পোর্ট দিয়ে শুরু 80যেমন 8000
প্যাট্রিক অসিটি

37

আপনি এটির জন্য নেটক্যাট ব্যবহার করতে পারেন।

nc ip port < /dev/null

সার্ভারের সাথে সংযোগ স্থাপন করে এবং আবার সংযোগটি সরাসরি বন্ধ করে দেয়। নেটকাট যদি সংযোগ করতে সক্ষম না হয় তবে এটি একটি শূন্য-বহির্গমন কোডটি দেয়। প্রস্থান কোডটি ভেরিয়েবল stored? এ সংরক্ষণ করা হয়। উদাহরণ হিসাবে,

nc ip port < /dev/null; echo $?

নেটকাট পোর্টের সাথে সাফল্যের সাথে সংযোগ করতে পারলে 0 এবং কেবল ফিরে আসবে।


1
এই উত্তরের আরও উন্নতি প্রয়োজন। এনসি এই ক্ষেত্রে পুরোপুরি কাজ করে। / dev / tcp কৌশলটি চতুর, তবে সংকেত বাধা সহ একটি স্ক্রিপ্ট প্রয়োগ করা কঠিন বলে মনে হচ্ছে।
অবিন্দ্র গলচরণ

5
nc-zএই উদ্দেশ্যে পতাকা রয়েছে , যার থেকে ইনপুট নেওয়ার দরকার নেই /dev/null-zউপরের পতাকাটি ব্যবহার করে ইতিমধ্যে একটি উত্তর রয়েছে ।
অ্যাবে ভোলেকার

2
@ আবেভোলেকার এনসি-র সমস্ত সংস্করণ -z পতাকা সমর্থন করে না। আমি সেন্টোস 7 এ আছি এবং টনির সমাধানটি আমার প্রয়োজন অনুসারে খুঁজে পেয়েছি।
শাদোনিনজা

@ শাদোনিনজা জেনে রাখা ভাল! আমি যদি ২০১৪ সাল থেকে আমার মন্তব্যটির বাইরে ফ্লিট-নেপস সম্পাদনা করতে পারি তবে আমি করব।
আবে ভোলেকার

'এনসি' আর '-z' সমর্থন করে না এবং তাই এই উত্তরটি সর্বোত্তম সমাধান বলে মনে হয়।
ধনী সেডম্যান

17

বাশ ব্যবহার করে স্পেনসার রথবুনের উত্তরের ভিত্তিতে:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed

ভাল, এটি "সংযোগ প্রত্যাখ্যান" বার্তাটি দমন করবে। পরিষেবাটি যদি চিরকাল অপেক্ষা না করে সংযোগটি গ্রহণ করে তবে স্বয়ংক্রিয়ভাবে প্রস্থান করে।
সেফ

পরিষেবাগুলির জন্য সর্বোত্তম সমাধান যা কোনও নতুন সংযোগের পরে কোনও ডেটা প্রেরণ করে না। নেটক্যাট কল করার চেয়ে প্রায় 20 গুণ বেশি দ্রুত। থেকে সংক্ষিপ্ত করা যাবে: &>/dev/null </dev/tcp/127.0.0.1/$PORT
ইত্যাদি

16

সেগুলি / proc / নেট / টিসিপি-তে তালিকাভুক্ত।

এটি হেক্সে ":" এর পরে দ্বিতীয় কলাম:

> cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 10863 1 ffff88020c785400 99 0 0 10 -1                     
   1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1                      
   2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000  1000        0 10562454 2 ffff88010040f7c0 22 3 30 5 3                   
   3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000  1000        0 10701021 2 ffff880100474080 41 3 22 10 -1                 
   4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000  1000        0 10700849 2 ffff880104335440 57 3 18 10 -1                 
   5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000  1000        0 10698952 2 ffff88010040e440 46 3 0 10 -1                  
   6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000  1000        0 9562907 2 ffff880104334740 22 3 30 5 4                    
   7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000  1000        0 10696677 2 ffff880106cc77c0 45 3 0 10 -1  

সুতরাং আমার ধারণা :50তৃতীয় কলামের মধ্যে একটি অবশ্যই স্ট্যাকওভারফ্লো হতে হবে: o)

man 5 procআরও বিশদ জন্য সন্ধান করুন। এবং সেড ইত্যাদি বাদে কোমল পাঠকের অনুশীলন হিসাবে রেখে যাওয়া ...


10
ss -tl4 '( sport = :22 )'

2 এমএস কি যথেষ্ট দ্রুত?

কোলন যুক্ত করুন এবং এটি লিনাক্সে কাজ করে


2
দুর্দান্ত এক, ssতুলনায় এমনকি স্বল্পতম nclজন্য শোনা , 4IPv4- র জন্য নয়; sport(অবশ্যই) ঘোরা উৎস বন্দর । উপরের কমান্ডটি শ্রবণকারী টিসিপি পোর্ট ( tবিকল্প) ধরে uনিচ্ছে : ইউডিপিগুলির জন্য ব্যবহার বিকল্প, বা উভয়ই প্রোটোকলের জন্য কোনওটি নয়। নিক্সক্র্যাফ্টেরss মতো বরাবর আরও তথ্য । উল্লেখ্য: ssফিল্টার এখানে কাজ করা হয় না, জানিনা কেন (ব্যাশ 4.3.11, এস এস ইউটিলিটি, iproute2-ss131122), সাথে যেতে পারি , grep
ক্যাম্পা

খুব খারাপ যে ssকমান্ড তার সন্ধান প্রতিফলিত করে একটি প্রস্থান কোড ফেরত দেয় না; এটি সর্বদা 0 প্রস্থান কোড ফেরত দেয়।
জন গ্রীন

| grep LISTEN?
লিউকোস

আমি পেয়েছি State Recv-Q Send-Q Local Address:Port Peer Address:Portএখন? এটার মানে কি?
কালো


6
nc -l 8000

যেখানে 8000 বন্দর নম্বর। যদি বন্দরটি বিনামূল্যে থাকে তবে এটি এমন একটি সার্ভার শুরু করবে যা আপনি সহজেই বন্ধ করতে পারেন। যদি তা না হয় তবে এটি একটি ত্রুটি ছুঁড়ে ফেলবে:

nc: Address already in use

5

আমি আমাদের লিনাক্স পরীক্ষার সার্ভারগুলির কোনও একটিতে কোনও বন্দর খোলা আছে কিনা তা খতিয়ে দেখতে চেয়েছিলাম। আমার ডেভ মেশিন থেকে টেস্ট সার্ভারে টেলনেটের সাথে সংযোগ দেওয়ার চেষ্টা করে আমি তা করতে সক্ষম হয়েছি। আপনি ডেভ মেশিন চালানোর চেষ্টা করুন:

$ telnet test2.host.com 8080
Trying 05.066.137.184...
Connected to test2.host.com

এই উদাহরণে আমি পরীক্ষা করতে চাই 8080 পোর্ট হোস্ট টেস্ট 2.host.com এ খোলা আছে কিনা


1

টিসিপিং একটি খুব কম ওভারহেড সহ দুর্দান্ত সরঞ্জাম it এটি আরও দ্রুত করার জন্য এটির একটি সময়সীমা যুক্তিও রয়েছে:

[root@centos_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[root@centos_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[root@centos_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.

1
যখন স্পেন্সারের সমাধানের জন্য অতিরিক্ত কোনও ইনস্টলসের প্রয়োজন নেই তখন টিসিপিং ইনস্টল করার উপযুক্ত নয়, তবে এটি সবচেয়ে পরিষ্কার এবং সবচেয়ে মানব-পঠনযোগ্য সমাধান def
বিডম্ব্রো

1

আপনি নেটকাট কমান্ডটিও ব্যবহার করতে পারেন

[location of netcat]/netcat -zv [ip] [port]

অথবা

nc -zv [ip] [port]

-z - সরাসরি কোনও ডেটা না প্রেরণে ডেমন শোনার জন্য স্ক্যান করতে এনসি সেট করে।
-v - ভার্বোস মোড সক্ষম করে।


-2

nmapসঠিক সরঞ্জাম। সহজভাবে ব্যবহার করুনnmap example.com -p 80

আপনি এটি স্থানীয় বা দূরবর্তী সার্ভার থেকে ব্যবহার করতে পারেন। এটি কোনও ফায়ারওয়াল অ্যাক্সেসকে বাধা দিচ্ছে কিনা তা সনাক্ত করতে আপনাকে সহায়তা করে।


-4

আপনি যদি iptables ব্যবহার করছেন চেষ্টা করুন:

iptables -nL

অথবা

iptables -nL | grep 445

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