ইউনিক্স সকেট সংযোগের অন্য প্রান্তটি কীভাবে সন্ধান করবেন?


44

আমার একটি প্রক্রিয়া রয়েছে (ডিবিস-ডেমন) যার ইউনিক্স সকেটের সাথে অনেকগুলি উন্মুক্ত সংযোগ রয়েছে। এর মধ্যে একটি সংযোগ এফডি # 36:

=$ ps uw -p 23284
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
depesz   23284  0.0  0.0  24680  1772 ?        Ss   15:25   0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

=$ ls -l /proc/23284/fd/36 
lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410]

=$ netstat -nxp | grep 1013410
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

=$ netstat -nxp | grep dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013953  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013825  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013726  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013471  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012325  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012302  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012289  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012151  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011957  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011937  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011900  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011775  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011771  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011769  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011766  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011663  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011635  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011627  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011540  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011480  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011349  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011312  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011284  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011250  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011231  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011155  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011061  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011049  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011035  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011013  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010961  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010945  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

নম্বর সংযোগের ভিত্তিতে, আমি ধরে নিই যে ডিবিস-ডেমন আসলে সার্ভার। যা ঠিক আছে। তবে dbus-প্রবর্তকটিতে 36 তম ফাইল হ্যান্ডেল সংযোগটি ব্যবহার করে আমি এর সাথে কোন প্রক্রিয়াটি যুক্ত আছে তা কীভাবে খুঁজে পাব? Lsof চেষ্টা করেও / GR / নেট / ইউনিক্সে গ্রেপ করে তবে ক্লায়েন্ট প্রক্রিয়াটি খুঁজে পাওয়ার কোনও উপায় আমি বের করতে পারি না।


এর উত্তর ও উত্তরটিতে
sch

উত্তর:


25

বেশ সম্প্রতি আমি একই সমস্যার জন্য হোঁচট খেয়েছি। আমি স্তম্ভিত হয়ে গিয়েছিলাম যে এমন কিছু মামলা রয়েছে যখন এটি সম্ভব নাও হতে পারে। আমি lsof (ভিক অবেল) এর স্রষ্টার একটি মন্তব্য পেয়েছিলাম যেখানে তিনি উল্লেখ করেছিলেন যে এটি ইউনিক্স সকেট বাস্তবায়নের উপর নির্ভর করে av কখনও কখনও সকেটের জন্য তথাকথিত "এন্ডপয়েন্ট" তথ্য উপস্থিত থাকে এবং কখনও কখনও তা পাওয়া যায় না। দুর্ভাগ্যজনকভাবে লিনাক্সে যেমন এটি উল্লেখ করা যায় তেমন অসম্ভব।

লিনাক্সে, উদাহরণস্বরূপ, যেখানে lsof কে অবশ্যই / proc / নেট / ইউনিক্স ব্যবহার করতে হবে, সমস্ত ইউনিক্স ডোমেন সকেটের একটি সীমাবদ্ধ পথ রয়েছে, তবে শেষের দিকের কোনও তথ্য নেই। প্রায়শই কোনও আবদ্ধ পথ নেই। এটি প্রায়শই অন্যান্য শেষ পয়েন্টটি নির্ধারণ করা অসম্ভব করে তোলে তবে এটি লিনাক্স / প্রোক ফাইল সিস্টেম প্রয়োগের ফলাফল।

আপনি যদি / প্রোকে / নেট / ইউনিক্সের দিকে তাকান তবে আপনি নিজেরাই দেখতে পাচ্ছেন যে, (আমার সিস্টেমে অন্তত) তিনি সম্পূর্ণরূপে সঠিক। আমি এখনও হতবাক, কারণ সার্ভার সমস্যাগুলি ট্র্যাক করার সময় আমি এই জাতীয় বৈশিষ্ট্যটিকে প্রয়োজনীয় বলে মনে করি find


রেফারেন্স: গ্রুপ. google.com/forum/#!topic/comp.unix.admin/iZLsq5dHdyI
এস্তানি

মনে রাখবেন যে /proc/net/unixআপনি যে কোনও এলোমেলো ডোমেন সকেটের রেফারেন্সটি সংগ্রহ করেছেন তার লক্ষ্য ফাইলটি আপনাকে জানাবে /proc/.../fd/
i336_

26

এই উত্তরটি কেবল লিনাক্সের জন্য। ইউনিক্স এবং লিনাক্স স্ট্যাক এক্সচেঞ্জের উত্তরের ভিত্তিতে , আমি ইন-কার্নেল ডেটা স্ট্রাকচার ব্যবহার করে এবং ব্যবহার করে অ্যাক্সেস করা ইউনিক্স ডোমেন সকেটের অন্য প্রান্তটি সাফল্যের সাথে সনাক্ত করেছি । আপনাকে এবং কার্নেল বিকল্পগুলি সক্ষম করতে হবে ।gdb/proc/kcoreCONFIG_DEBUG_INFOCONFIG_PROC_KCORE

আপনি lsofসকেটের কার্নেল ঠিকানা পেতে ব্যবহার করতে পারেন , যা পয়েন্টারের রূপ নেয়, যেমন 0xffff8803e256d9c0। এই সংখ্যাটি আসলে প্রাসঙ্গিক ইন-কার্নেল মেমরি কাঠামোর বা ধরণের ঠিকানা struct unix_sock। সেই কাঠামোর একটি ক্ষেত্র রয়েছে peerযা সকেটের অপর প্রান্তে পয়েন্ট করে। সুতরাং কমান্ড

# gdb /usr/src/linux/vmlinux /proc/kcore
(gdb) p ((struct unix_sock*)0xffff8803e256d9c0)->peer

সংযোগের অন্য প্রান্তের ঠিকানাটি মুদ্রণ করবে। lsof -Uপ্রক্রিয়াটি সনাক্ত করতে এবং অন্য প্রান্তের বর্ণনাকারী নম্বর ফাইল করতে আপনি এই সংখ্যাটির আউটপুট গ্রেপ করতে পারেন ।

কিছু বিতরণ কর্নেল ডিবাগ প্রতীকগুলি একটি পৃথক প্যাকেজ হিসাবে সরবরাহ করে বলে মনে হচ্ছে, যা vmlinuxউপরের কমান্ডের মধ্যে ফাইলের স্থান গ্রহণ করবে ।


এটি আকর্ষণীয় দেখায়, তবে কার্নেলটি পুনরায় সংকলনের প্রয়োজনীয়তা ওভারকিল বলে মনে হচ্ছে। আমি ভাবছি যে এটি সম্ভবত হাতে তৈরি কার্নেল ছাড়াই এবং জিডিবি ব্যবহার না করে কেবল কোকরের মানগুলি দেখার জন্য এবং মানগুলির "ম্যানুয়াল" ডিকোডিংয়ের মাধ্যমে এটি করা সম্ভব হবে।

3
@ ডেপেজ, আপনাকে যা জানার দরকার তা হ'ল কাঠামোর peerসদস্যের অফসেট unix_sock। আমার x86_64 সিস্টেমে, সেই অফসেটটি 656 বাইট, সুতরাং আমি অন্য প্রান্তটি ব্যবহার করে এটি পেতে পারি p ((void**)0xffff8803e256d9c0)[0x52]। আপনার এখনও দরকার CONFIG_PROC_KCORE, স্পষ্টতই।
এমভিজি

11

আসলে, ssথেকে iproute2(থেকে netstat, ifconfig, ইত্যাদি জন্য প্রতিস্থাপন) এই তথ্য প্রদর্শন করতে পারেন।

এখানে ssh-এজেন্ট ইউনিক্স ডোমেন সকেট দেখানোর একটি উদাহরণ sshরয়েছে যার সাথে একটি প্রক্রিয়া সংযুক্ত হয়েছে:

$ sudo ss -a --unix -p
Netid  State      Recv-Q Send-Q Local                             Address:Port          Peer    Address:Port
u_str  ESTAB      0      0      /tmp/ssh-XxnMh2MdLBxo/agent.27402 651026                *       651642                users:(("ssh-agent",pid=27403,fd=4)
u_str  ESTAB      0      0       *                                651642                *       651026                users:(("ssh",pid=2019,fd=4))

হুম। আকর্ষণীয় ... আমি মিস করেছি যে "ঠিকানা: পোর্ট" কলামগুলি মিলতে পারে, যদিও ইউনিক্স ডোমেন সকেটের জন্য "পিয়ার" কলামটি সম্পূর্ণ অকেজো।
স্যামবি

9

ইউনিক্স সকেটগুলিতে সাধারণত জোড়গুলিতে সংখ্যা নির্ধারিত হয় এবং সাধারণত পরপর থাকে। সুতরাং আপনার জন্য জুটি সম্ভবত 1013410 +/- 1 হবে। এই দু'জনের মধ্যে কোনটি বিদ্যমান তা দেখুন এবং অপরাধীর কাছে অনুমান করুন।


8

আমি একটি সরঞ্জাম লিখেছি যা সকেটের পিয়ারের নির্ভরযোগ্যতার জন্য নির্ভরযোগ্যতার সাথে এমভিজির জিডিবি পদ্ধতি ব্যবহার করে , কার্নেল ডিবাগ প্রতীকগুলির প্রয়োজন নেই।

প্রদত্ত সকেটের সাথে প্রক্রিয়াটি সংযুক্ত করতে, এটি ইনোড নম্বরটি পাস করুন:

# socket_peer 1013410
3703 thunderbird 

একবারে ব্যবহারের জন্য সমস্ত প্রক্রিয়াগুলি অনুসন্ধান করতে netstat_unix, এটি নেটট্যাট আউটপুটটিতে একটি কলাম যুক্ত করে:

# netstat_unix
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Peer PID/Program name  Path
unix  3      [ ]         STREAM     CONNECTED     6825     982/Xorg             1497/compiz            /tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     6824     1497/compiz          982/Xorg                 
unix  3      [ ]         SEQPACKET  CONNECTED     207142   3770/chromium-brows  17783/UMA-Session-R       
unix  3      [ ]         STREAM     CONNECTED     204903   1523/pulseaudio      3703/thunderbird       
unix  3      [ ]         STREAM     CONNECTED     204902   3703/thunderbird     1523/pulseaudio           
unix  3      [ ]         STREAM     CONNECTED     204666   1523/pulseaudio      3703/thunderbird       
...

netstat_unix --dumpআপনার যদি এমন আউটপুট দরকার যা পার্স করা সহজ Try বিশদ
জানতে https://github.com/lemonsqueeze/unix_sockets_peers দেখুন ।

তথ্যের জন্য, ইনোড + 1 / -1 হ্যাক নির্ভরযোগ্য নয়। এটি বেশিরভাগ সময় কাজ করে তবে ব্যর্থ হবে বা (আরও খারাপ) যদি আপনার ভাগ্য থেকে দূরে থাকে তবে ভুল সকেটটি ফিরে আসবে।


1

আপনার system.conf সম্পাদনা করুন

এই ফাইলে আপনি ডিবাগিংয়ের উদ্দেশ্যে আরও স্টাফ যুক্ত করতে পারেন।

ফাইলের অবস্থান: /etc/dbus-1/system.conf

ডিবাগিং উদ্দেশ্যে, আপনি আপনার সিস্টেম কোডটি সম্পাদন করতে পারবেন শ্রবণশক্তি অনুমোদনের জন্য:

  1. নীতি বিভাগটি এর দ্বারা প্রতিস্থাপন করুন:

    <policy context="default">

    <!-- Allow everything to be sent -->

    <allow send_destination="*" eavesdrop="true"/>

    <!-- Allow everything to be received -->

    <allow eavesdrop="true"/>

    <!-- Allow anyone to own anything -->

    <allow own="*"/>

    <!-- XXX: Allow all users to connect -->

    <allow user="*"/> </policy>

  2. অন্তর্ভুক্ত লাইনটি সরান: system.d

    <includedir>system.d</includedir>

সূত্র: http://old.nabble.com/dbus-send-error-td29893862.html


ইউনিক্স সকেট সম্পর্কিত আরও কিছু দরকারী জিনিস

বাসে কী হচ্ছে তা সনাক্ত করার সহজ উপায় হ'ল dbus-monitorপ্রোগ্রামটি চালানো , যা ডি-বাস প্যাকেজটি নিয়ে আসে

এছাড়াও আপনি dbus-cleanup-socketsঅবশিষ্ট সকেটগুলি পরিষ্কার করার জন্য ব্যবহার করার চেষ্টা করতে পারেন ।

নিম্নলিখিত কমান্ড আপনাকে দেখায় যে কোন প্রক্রিয়াটি netstatআউটপুটের উপর ভিত্তি করে dbus সকেটে কতবার সংযুক্ত রয়েছে :

sudo netstat -nap | grep dbus | grep CONNECTED | awk '{print $8}' | sort | uniq -c

(উবুন্টুতে পরীক্ষিত)

হার্ডওয়্যার ওয়ে: এই কমান্ডটি ম্যানুয়ালি প্রক্রিয়াগুলি / proc থেকে খুঁজে বের করবে এবং দেখাবে যে সর্বাধিক সংযোগগুলি (সমস্ত ধরণের সকেট) ব্যবহার করা হয়:

ls -lR */fd/* | grep socket | sed -r "s@([0-9{1}]+)/fd/@_\1_@g" | awk -F_ '{print $2}' | uniq -c | sort -n | awk '{print $1" "$2; print system("ps "$2"|tail -n1")}'

উদাহরণ আউটপুট:

(গণনা, পিআইডি এবং পরবর্তী লাইনে প্রক্রিয়া সম্পর্কে বিশদ রয়েছে)

25 3732
 3732 ?        Ss     0:38 /usr/bin/wineserver
89 1970
 1970 ?        Ss     0:02 //bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

(উবুন্টুতে পরীক্ষিত)

আনন্দ কর.


রেফারেন্সের জন্য সম্পর্কিত নিবন্ধগুলি দেখুন:

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