আমার মনে হয় আপনি যা করতে চান তা হল শ্রবণ পোর্টগুলির একটি তালিকা পাওয়া এবং তারপরে অন্য কোনও টিসিপি সংযোগগুলি থেকে সেগুলি সরিয়ে ফেলা, তারপরে সেগুলি বহির্গামী সংযোগগুলির মধ্যে থাকবে। Ss (সকেট স্থিতি) কমান্ডটি "স্থানীয় ঠিকানা: পোর্ট" এবং "পিয়ার ঠিকানা: পোর্ট" কলামগুলি আউটপুট দেয়, আমাদের "পিয়ের ঠিকানা: পোর্ট" কলামটি নয়, "স্থানীয় ঠিকানা: পোর্ট" কলাম থেকে শ্রবণ পোর্টগুলি সরিয়ে ফেলতে হবে, অন্যথায় আপনি কিছু বহির্গামী সংযোগ মিস করতে পারেন। সুতরাং এটি অর্জন করতে যে আমি \s{2}+
"স্থানীয় ঠিকানা: পোর্ট" কলামের পিছনে থাকা ফাঁকা জায়গাগুলির সাথে ম্যাচ করার জন্য গ্রেপের ": $ পোর্ট" স্ট্রিংটি ব্যবহার করছি ; সেই কলামটির পিছনে দুটি বা ততোধিক সাদা স্পেস রয়েছে, যেখানে "পিয়ার অ্যাড্রেস: পোর্ট" এর একটি স্পেস এবং তারপরে একটি নতুন লাইন (গ্রার ... কেবল একটি নতুন লাইন থাকা উচিত, আইএমও,\s+
\s{2}+
।) সাধারণত আমি এস এর ফিল্টারিং কার্যকারিতা ব্যবহার করার চেষ্টা করতে পারি ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>
। তবে দেখা যাচ্ছে যে স্ট্রিংটি কত দীর্ঘ হতে পারে তার একটি সীমা রয়েছে, এটি এমন একটি সিস্টেমে বোমা ফাটিয়েছিল যেখানে আমার প্রচুর শ্রবণ পোর্ট ছিল। তাই আমি গ্রেপ দিয়ে একই জিনিস করার চেষ্টা করছি। আমি বিশ্বাস করি যে নিম্নলিখিতগুলি কাজ করবে:
FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')
ss -tn state established dst :* | grep -P -v "$FILTER"
নোট করুন এটি আপনি ব্যবহার করছেন ss এর সংস্করণটির উপর নির্ভর করে, পুরানো সংস্করণগুলির (যেমন: ss ইউটিলিটি, আইপ্রউট 2-এসএস 111117) এর আলাদা আউটপুট ফর্ম্যাট রয়েছে, তাই আপনাকে জোর করে $ 4 এর পরিবর্তে $ 3 ব্যবহার করতে হতে পারে। আরো উল্লেখ্য ss -tln
এবং ss -tn state listening
আপনি বিভিন্ন আউটপুট, যা একটু পাল্টা স্বজ্ঞাত আমাকে দেয়। YMMV।
আমি কিছুটা আরও মার্জিত সমাধান পেয়েছি যার জন্য হোস্টের আইপি জানার দরকার নেই, ss -tn state established dst :*
ভাল কাজ করে, আমি উপরের কমান্ড লাইনগুলিকে সংশোধন করেছি।