سؤال إغلاق منفذ يدويًا من سطر الأوامر


أرغب في إغلاق منفذ مفتوح في وضع الاستماع بين تطبيق الخادم والعميل.

هل هناك أي خيار سطر أوامر يدوي في Linux لإغلاق منفذ؟

ملحوظة:  لقد عرفت أن "التطبيق الذي يملك المقابس المتصلة فقط هو الذي يجب إغلاقه ، والذي سيحدث عند إنهاء التطبيق."

لا أفهم لماذا يكون ذلك ممكنًا فقط من خلال التطبيق الذي يفتحه ... لكنني لا زلت أتوق إلى معرفة ما إذا كان هناك أي طريقة أخرى للقيام بذلك.


95
2018-04-06 03:39


الأصل


لا ، فتحت الموانئ تنتمي إلى العملية التي فتحت لهم ، لا يوجد أي تحكم ممكن من الخارج. وهو أمر جيد ، أو يجب على جميع التطبيقات أن تتوقع أن يتم العبث بمنافذها المفتوحة (وملفاتها). ومع ذلك ، يمكنك منع حركة المرور إلى منفذ عن طريق firewalling (iptables) ، لكن ذلك لن يغلق ويتخلى عن المنفذ للاستخدامات الأخرى. - Jürgen Strobel
غاب الكثير من المستجيبين عن وجهة نظر هذا السؤال. من الهراء الإعلان عن أن التطبيق الذي يمتلك المنفذ فقط يمكنه فصله. يمكنني قطع الاتصال عن طريق المشي إلى مربع وسحب كابل إيثرنت من المقبس ، أو عن طريق قتل التطبيق في الطرف الآخر من الاتصال! يجب كتابة الطلب للتعامل مع هذا. لذلك --- كيف يمكنك اختبار للتأكد من أن التطبيق مكتوب بشكل صحيح دون الحاجة إلى التدخل البدني و / أو التحكم في الكمبيوتر الآخر؟ - Dale Wilson
"... لا يوجد أي تحكم ممكن من الخارج". هذه ملاحظة مهمة ، لقد أرشدتني إلى السؤال التالي ، كيف يمكنني أن أكون جزءًا من العملية من الخارج؟ GDB. - Dankó Dávid


الأجوبة:


واجهت نفس المشكلة ، يجب أن تبقى العملية على قيد الحياة ولكن يجب إغلاق المقبس. لا يعد إغلاق المقبس في عملية تشغيل أمرًا مستحيلاً ولكنه صعب:

  1. حدد موقع العملية:

    netstat -np
    

    تحصل على source/destination ip:port portstate pid/processname خريطة

  2. حدد موقع واصف ملف مأخذ التوصيل في العملية

    lsof -np $pid
    

    يمكنك الحصول على قائمة: اسم العملية ، pid ، user ، fileDescriptor ، ... سلسلة اتصال.

    حدد موقع الملف fileDescriptor المطابق للاتصال.

    الآن قم بتوصيل العملية:

    gdb -p $pid
    
  3. الآن أغلق المقبس:

    call close($fileDescritor)
    
    //does not need ; at end.
    

    ثم فصل:

    quit
    

    والمقبس مغلق.


114
2017-11-01 01:43



sudo lsof -np $pid يعطيني حوالي 200 خط وأنا مرتبك حول كيفية العثور على FD المطلوب. في حالتي العملية هي علامة تبويب Chrome وأنا أحاول إغلاق websockets فتح ... - SET
يبدو الصف عادة مثل: firefox 14812 szupervigyor 97u IPv4 32814564 0t0 TCP 192.168.2.4:40385-> 173.094.39.65:https (ESTABLISHED) كـ: process_name pid user fd [opens_for] بروتوكول الجهاز الداخلي protocol_data_toString - Dankó Dávid
* يبدو الصف عادة مثل: firefox 14812 szupervigyor 97u IPv4 32814564 0t0 TCP 192.168.2.4:40385-> 173.194.39.65:https (ESTABLISHED) كـ: process_name pid user fd [opens_for] بروتوكول الجهاز البرمجي protocol_data_toString تحتاج إلى معرفة ip عن بعد العنوان والعثور على العمود الأخير. في المثال الخاص بي 97 هو FileDescriptor. البحث أمر صعب إذا قمت بفتح اتصال متعدد بالمضيف المستهدف. - Dankó Dávid
هذا هو الحل الرائع - marcorossi
إذا كنت ترغب في محاكاة المقبس الذي يتم إغلاقه بواسطة النهاية البعيدة (على سبيل المثال ، الخروج من النظير) ، فمن الأفضل استخدام shutdown: call shutdown($fileDescriptor, 0). - ecatmur


أنت نوع من طرح السؤال الخطأ هنا. ليس من الممكن حقا ببساطة "إغلاق منفذ" من خارج التطبيق الذي فتح المقبس يستمع إليه. الطريقة الوحيدة للقيام بذلك هي قتل العملية التي تمتلك المنفذ تمامًا. وبعد ذلك ، في غضون دقيقة أو اثنتين ، سيصبح المنفذ متاحًا للاستخدام مرة أخرى. إليك ما يحدث (إذا كنت لا تهتم ، تخطى إلى النهاية حيث أريك كيف تقتل عملية امتلاك منفذ معين):

الموانئ هي الموارد التي خصصها نظام التشغيل لعمليات مختلفة. هذا مشابه لطلب نظام التشغيل لملف ملف. ومع ذلك ، على عكس مؤشرات الملف ، قد تملك عملية واحدة فقط في كل مرة منفذ. من خلال واجهة مأخذ توصيل BSD ، يمكن للعمليات تقديم طلب للاستماع على منفذ ، والذي سوف يمنحه نظام التشغيل بعد ذلك. سيضمن نظام التشغيل أيضًا عدم حصول أي عملية أخرى على نفس المنفذ. في أي نقطة ، يمكن للعملية الافراج عن المنفذ عن طريق إغلاق المقبس. سوف يقوم نظام التشغيل بعد ذلك باستعادة المنفذ. بدلاً من ذلك ، إذا انتهت العملية دون تحرير المنفذ ، فسيستعيد نظام التشغيل المنفذ في النهاية (على الرغم من أنه لن يحدث على الفور: سيستغرق الأمر بضع دقائق).

الآن ، ما تريد القيام به (ببساطة إغلاق المنفذ من سطر الأوامر) ، غير ممكن لسببين. أولا ، إذا كان ذلك ممكنا ، فإن ذلك يعني أن عملية واحدة يمكن ببساطة سرقة مورد عملية أخرى (الميناء). ستكون هذه سياسة سيئة ، ما لم تقتصر على العمليات المميزة. السبب الثاني هو أنه من غير الواضح ما الذي سيحدث للعمليّة التي تملكها الميناء إذا سمحنا لها بالاستمرار في العمل. تتم كتابة رمز العملية على افتراض أنه يملك هذا المورد. إذا أخذناها ببساطة ، فسوف ينتهي الأمر بالتعطل من تلقاء نفسها ، لذلك لا تسمح لك OS بالقيام بذلك ، حتى إذا كنت تمثل عملية مميزة. بدلا من ذلك ، يجب عليك ببساطة قتلهم.

على أي حال ، إليك كيفية قتل عملية تمتلك منفذًا معينًا:

sudo netstat -ap | grep :<port_number>

سيؤدي ذلك إلى إخراج الخط المقابل لمنفذ عقد العملية ، على سبيل المثال:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

في هذه الحالة، procHoldingPort هو اسم العملية التي فتحت الميناء ، 4683 هو pid ، و 8000 (لاحظ أنه هو TCP) هو رقم المنفذ الذي يحمله.

ثم ، انظر في العمود الأخير ، سترى /. ثم نفذ هذا:

kill  <pid>

إذا لم ينجح ذلك (يمكنك التحقق من خلال إعادة تشغيل الأمر netstat). افعل هذا:

kill -9 <pid>

بشكل عام ، من الأفضل تجنب إرسال SIGKILL إن استطعت. هذا هو السبب في أنني أقول لك أن تحاول kill قبل kill -9. فقط باستخدام kill يرسل ألطف SIGTERM.

كما قلت ، سيستغرق الأمر بضع دقائق لإعادة فتح المنفذ إذا قمت بذلك. لا أعرف طريقة لتسريع هذا الأمر. إذا كان شخص آخر يفعل ذلك ، أود أن أسمع ذلك.


74
2018-04-06 04:05



smehmood - شكرا على الشرح التفصيلي .. شك قليل .. كيف تسترد النواة ميناء مفتوحا بعمليّة قتل بشكل مفاجئ ؟؟ يبدو أن الحل الذي تقدمه هو قتل العملية التي تحمل الميناء ...
codingfreak يعرف النواة أن العملية قد اختفت. يعرف أنه يمكن استعادة الميناء. هناك في الواقع قواعد توقيت إغلاق المنفذ ، للتأكد من عدم وجود أي حزم طائشة تطفو على 'الشبكة. كيف تعرف أنها تملك هذه الموارد؟ هذا ما تفعله النواة ، يتتبع الأشياء. - Rich Homolka
حتى ينشر شخص ما شيء معقول مثل unix.tools.port.close(<my port number>) سأستخدم init 6. - Snowcrash


يمكن أيضًا استخدام Fuser

fuser -k -n *protocol portno*

هنا بروتوكول tcp / udp و portno هو الرقم الذي ترغب في إغلاقه. مثلا

fuser -k -n tcp 37

مزيد من المعلومات في صفحة العضو المنصهر


18
2018-02-13 08:44



مجرد قتل عملية امتلاك لم يعمل بالنسبة لي ، ولكن لم المصهر. شكرا! - webwurst
حصلت على نتائج مختلطة معها ، حتى بعد استخدام المصهر ، حصلت على "مأخذ بالفعل قيد الاستخدام" عند محاولة إعادة استخدام المنفذ من التطبيق المقتول حتى تفعل ذلك كجذر. على الجانب الآخر ، يبدو أن وقت تحرير المقبس أقصر ثم من قبل ، لذا شكرًا على أي حال. - Jan Vlcinsky
JanVlcinsky ربما تكون هناك عملية "ولي الأمر" التي تعيد بدء العملية لحظات القتل بعدها fuser يجرى؟ - RedBaron
RedBaron: وفقا للتعليق superuser.com/a/415236/153413 مشكلتي ينشأ في تطبيق مكتوب بشكل سيئ ، والتي لا تنظيف / إغلاق المقبس تحت الإنهاء. وبالتالي fuser يجد العملية باستخدام المنفذ ويقتل ، ولكن لا يحل الحقيقة ، أن مأخذ التوصيل غير مغلق. 60 ثانية والنواة يفعل ذلك بالنسبة لي. - Jan Vlcinsky


يمكنك بدلاً من ذلك استخدام iptables:

iptables -I INPUT -p tcp --dport 80 -j DROP

انها تنجز أساسا ما تريد. سيؤدي هذا إلى إسقاط كل حركة مرور TCP إلى المنفذ 80.


5
2018-04-06 09:38



لا ، سيؤدي هذا إلى إبقاء المقبس مفتوحًا حتى إغلاق جميع المهلات. (ستخفي كل حركة المرور من عملية الامتلاك التي لا تملك بعد ذلك وسيلة لمعرفة أنها يجب أن تغلقها.) يمكنك استخدامها -j REJECT لإرجاع علامة إعادة تعيين TCP ، والتي ستشاهد بعد ذلك عملية الامتلاك الخاصة بي (ولكن فقط عندما يحاول الطرف الآخر إرسال شيء ما). - Marki555


netstat -anp | grep 80

يجب أن يخبرك ، إذا كنت تقوم بتشغيل apache ، "httpd" (هذا مجرد مثال ، استخدم المنفذ الذي يستخدمه التطبيق الخاص بك بدلاً من 80)

pkill -9 httpd 

أو

killall -9 httpd

3
2018-04-06 03:45



حاول قتل طبيعي قبل اللجوء إلى -9 - Thilo
omfgroflmao - لكنه سيقتل العملية التي فتحت الميناء ؟؟
codingfreak العملية التي تحمل المنفذ ، نعم سوف تقتلها.


ربما يمكنك فقط معرفة العملية التي فتحت مأخذ التوصيل الذي يكون المنفذ المرتبطة ، وقتل هذه العملية.

ولكن ، عليك أن تدرك أنه ما لم تحتوي هذه العملية على معالج يعمل على تهيئة كل العناصر التي كانت تستخدمها (مفتوحة) الملفات ، المقابس ، الشوك ، الأشياء التي يمكن أن تبقى ما لم يتم إغلاقه بشكل صحيح عند الإنهاء) ثم كنت قد خلقت هذا السحب على أداء النظام. بالإضافة إلى ذلك ، سيظل مأخذ التوصيل مفتوحة حتى يدرك النواة أن العملية قد قتلت. هذا عادة فقط يستغرق حوالي دقيقة.

أفترض أن أفضل سؤال سيكون: ما هو المنفذ (الذي ينتمي إلى ما هي العملية) هل تريد أن تتوقف؟

إذا كنت تحاول وضع حد لباب أو الفيروس الذي وجدته ، فيجب عليك على الأقل أن تتعلم ما هي البيانات التي تعود ذهابًا وإيابًا قبل أن تنهيها. (wireshark جيد لهذا) (و اسم العملية القابل للتنفيذ حتى تتمكن من حذفه و منعه من العودة عند إعادة التشغيل) ، أو إذا كان شيئًا قمت بتثبيته (مثل HTTPD أو FTPD أو أي شيء) فيجب أن يكون لديك بالفعل إمكانية الوصول إلى العملية نفسها.

عادة سيكون لديه برنامج التحكم (إيقاف HTTPD | بداية أو شيء). أو ، إذا كان الأمر يتعلق بنظام ما ، فربما لا يجب أن تفسد الأمر. على أي حال ، اعتقدت أنه بما أن الجميع يعطيك زاوية "كيف" ، يجب أن أعطيك التحذيرات.


2
2018-04-22 05:02



تعليق جيد جدا. لدي برنامج واحد ، والذي لا يؤدي إلى إغلاق المقبس الناتج عن السلوك الموصوف - حيث إن المقبس غير قابل للاستخدام لمدة 60 ثانية تقريبًا. عندما أتوقف وأبدأ هذه العملية ، فإنها تشتكي لمدة دقيقة ، أن العنوان والمنفذ مستخدم بالفعل. أفضل حل هو تصحيح عملية التصرف السيئة لإغلاق بشكل صحيح ، ولكن في وقت ما هذا ليس خيارًا. هل هناك طريقة لنطلب من kernel التحقق من ذلك المقبس المحظور في وقت أقرب من 60 ثانية؟ - Jan Vlcinsky


نظرت لأول مرة في عمليات العقد والعقد ، ثم فعلت ما يلي:

ps -A | grep node

10418 pts/23   00:00:05 node

10551 pts/23   00:00:00 node

ps -A | grep mongo

10490 pts/23   00:00:00 mongod

بمجرد تحديدها ، قم بقتل العمليات باستخدام أمر القتل.

kill -9 10418
kill -9 10490

وأخيرا ، اكتب meteor ويجب أن يعمل مرة أخرى.


2
2018-05-27 03:46





يمكنك كتابة سيناريو بتعديل iptables وإعادة تشغيلها. برنامج نصي واحد لإضافة قاعدة إسقاط جميع الحزم على المنفذ ، برنامج نصي آخر لإزالة القاعدة المذكورة.

وقد أظهرت لك الإجابات الأخرى كيف تقتل العملية المرتبطة بالميناء - قد لا يكون هذا ما تريده. إذا كنت تريد استمرار تشغيل الخادم ، ولكن لمنع الاتصالات من العملاء ، فإنك تريد حظر المنفذ ، وليس إيقاف العملية.


1
2018-04-06 04:10



Michael Shimmins ... هم أصوات الشيقة حيث يمكننا منع المنفذ على جانب الخادم حتى لا يرسل العميل أية رسائل.
كذلك يمكن للعميل أن يرسل رسائل كل ما يريدونه ، لقد أغلقنا الباب حتى لا يتمكنوا من الدخول.


قضية أخرى: في وقت ما تمتلك النواة الموانئ نفسها. وأنا أعلم أن توجيه NAT يحمل بعض المنافذ مفتوحة لاستخدام NAT. لا يمكنك قتل عملية لهذا ، وهذا هو النواة ، وإعادة التشكيل والتشغيل مطلوب.


1
2017-11-01 02:08