Bagaimana saya mengetahui lebih banyak tentang file socket di / proc / fd?

33

Mencari di / proc / $ mypid / fd /, saya melihat file-file ini

lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 0 -> /dev/pts/36 (deleted)
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 3 -> socket:[1424055856]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 4 -> socket:[1424055868]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 5 -> socket:[1424055882]

Karena saya memiliki akses ke kode, saya tahu soket ini terikat pada koneksi TCP (satu adalah koneksi ke port 5672 pada beberapa mesin, yang lain adalah koneksi ke port 3306 pada beberapa mesin lain), tetapi saya ingin tahu soket mana yang terikat pada koneksi mana. Bagaimana saya bisa melakukan itu?

Secara umum, bagaimana saya bisa bertanya pada OS apa yang ada di ujung soket?

benhsu
sumber
1
Gunakan socat....
heemayl
Lihat juga Siapa yang punya ujung soket unix ini?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

40

Perintah lsof

Pilihan yang bagus mungkin lsof. Sebagai man lsofpernyataan, sangat berguna untuk mendapatkan informasi tentang open files such as Internet sockets or Unix Domain sockets.


Menggunakannya

Pada awalnya, dapatkan gambaran umum tentang /proc/$PID/fd/dan nomor soket yang tercantum.
Misalnya, socket:[14240]mungkin menarik bagi Anda.

Kemudian gunakan lsof -i -a -p $PIDuntuk mencetak daftar semua $PIDpenggunaan file jaringan .

  • -i menghasilkan daftar file jaringan milik pengguna atau proses

  • -a menggabungkan secara logis atau parameter yang diberikan AND

  • -p $PID pilih info hanya tentang proses Anda

Output khas untuk browser saya yang menjalankan dengan PID 2543mungkin:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
browser 2543 pidi   55u  IPv4  14240      0t0  TCP  pidi.router.lan:55038->stackoverflow.com:https (ESTABLISHED)

dan lebih banyak garis yang serupa.

Besar! Sekarang perhatikan DEVICEkolom ini lebih dekat. Ini cocok dengan soket kami yang sebelumnya terdaftar dari /proc/$PID/fd/!
Dan berkat NAMEbagian ini kita dapat mengatakan apa ujung soket kita.

Dalam menjalankan dunia nyata Anda mungkin mendapatkan jumlah output yang baik, tetapi cukup filter atau grepuntuk soket menarik Anda.

Saya cukup yakin orang bisa menggabungkan semua perintah, tetapi itu sudah cukup untuk membantu Anda memulai.

pidi
sumber
Terima kasih! Terpilih dan diterima. Saya melihat soket muncul di lsof sebagai "unix 0xffff88002704d380 0t0 1423733559 socket", bagaimana cara menggali apa 0xffff88002704d380 itu?
benhsu
1
"unix 0xfff ..." sepertinya alamat memori kernel dari struktur unix_sock. Struktur ini berisi pointer ke titik akhir soket Anda. Lihatlah grep -rni ffff88002704d380 /proc. suatu tempat di bawah / proc / mungkin berbohong jawaban catAnda , grep file Anda ditemukan. Tapi jangan jelaskan ini ... Mungkin salah besar di sini.
pidi
lsofmembaca informasi lain tentang soket dari /proc/net/tcp, /proc/net/tcp6, /proc/net/udp, dan sebagainya tergantung pada jenis socket.
Jesin