Tentukan proses menggunakan port, tanpa sudo

11

Saya ingin mengetahui proses mana (khususnya, id proses) yang menggunakan port yang diberikan. Satu menangkapnya adalah, saya tidak ingin menggunakan sudo, saya juga tidak login sebagai root. Proses yang saya ingin ini berfungsi dijalankan oleh pengguna yang sama yang ingin saya temukan proses id - jadi saya akan berpikir ini sederhana.

Keduanya lsofdan netstattidak akan memberi tahu saya id proses kecuali saya menjalankannya menggunakan sudo - mereka akan memberi tahu saya bahwa port sedang digunakan.

Sebagai beberapa konteks tambahan - Saya memiliki berbagai aplikasi yang semuanya terhubung melalui SSH ke server yang saya kelola, dan membuat port reverse ke depan. Setelah itu diatur, server saya melakukan beberapa pemrosesan menggunakan port yang diteruskan, dan kemudian koneksi dapat dimatikan. Jika saya dapat memetakan port tertentu (setiap aplikasi memiliki sendiri) untuk memproses, ini adalah skrip sederhana. Ada saran?

Ngomong-ngomong, ini ada di kotak Ubuntu - tapi saya kira solusi apa pun akan menjadi standar di sebagian besar distro Linux.

menepuk
sumber

Jawaban:

7

The --programpilihan untuk menunjukkan netstat Anda PID dan nama proses Anda sendiri. Opsi ini hadir dan bekerja pada RHEL 6 di netstat 1.42 dari net-tools 1.60.

Saya memverifikasi yang netstat -an --tcp --programmenunjukkan saya PID dari proses saya.

Paweł Brodacki
sumber
1
Saya pikir Anda maksud -an. netstat -pantjuga berfungsi dan lebih mudah diingat.
Eduardo Ivanec
Ya, "-" berlebihan merayap masuk. Dan saya suka mnemonik.
Paweł Brodacki
Saya khawatir ini tidak bekerja di Ubuntu - karena tidak menunjukkan proses dalam beberapa kasus tanpa root - dan sepertinya forward SSH adalah salah satu dari kasus-kasus itu.
pat
Pawel: sekarang OP akhirnya mendapatkan konkret dengan kasus penggunaannya (lihat komentar di rantai saya), saya mendorong Anda untuk mencobanya lagi. Saya lakukan, pada kotak CentOS 5 (juga netstat 1,42 dari net-tools 1,60), dan gagal seperti yang dikatakannya. Saya akan tertarik dengan pengalaman Anda.
MadHatter
3

Saran Pawel tampaknya bekerja dengan baik untuk saya, tetapi sebagai alternatif, inilah saya mendengarkan dari shell1:

[madhatta@risby ~]$ nc -l  localhost 3456

dan inilah saya melihatnya dengan lsofdari shell2:

[madhatta@risby tmp]$ lsof -i tcp:3456
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
nc      18109 madhatta    3u  IPv4 69205153      0t0  TCP localhost.localdomain:vat (LISTEN)

Sunting : Anda menulis di komentar itu

Maju SSH harus berperilaku berbeda - meskipun proses ini dimiliki oleh pengguna yang sama, saya tidak bisa melihatnya terdaftar di semua keluaran lsof kecuali saya menjalankannya sebagai root / sudo.

tetapi ini tidak demikian bagi saya. Setelah menggunakan ssh untuk meneruskan port lokal 8001, dengan ssh vpn.example.com -L 8001:rt.int:80, saya kemudian menemukan:

[madhatta@risby ~]$ lsof -n -i tcp:8001
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh     5375 madhatta    8u  IPv6 381234      0t0  TCP [::1]:vcom-tunnel (LISTEN)
ssh     5375 madhatta    9u  IPv4 381235      0t0  TCP 127.0.0.1:vcom-tunnel (LISTEN)

Bisakah Anda menunjukkan kepada kami beberapa contoh output Anda, lebih disukai tidak terlalu banyak dihapus?

MadHatter
sumber
1
Sepertinya SSH ke depan harus berperilaku berbeda - meskipun proses ini dimiliki oleh pengguna yang sama, saya tidak bisa melihatnya terdaftar di lsofoutput kecuali saya menjalankannya sebagai root / sudo.
pat
Saya tidak mendapatkan output lsof sama sekali pada port yang diteruskan ketika dijalankan sebagai pengguna. Jika saya menjalankannya dengan sudo, maka saya melihat output seperti apa yang Anda tambahkan ke jawaban Anda. Satu-satunya perbedaan penting adalah saya melihat nomor port yang sebenarnya bukan vcom-tunnel.
tepuk
Juga, ini adalah forward jarak jauh, bukan forward lokal - mungkin itulah sumber perbedaannya? Atau apakah Anda menguji dengan remote forward?
tepuk
Dengan remote forward maksud Anda "dari server AI ssh ke server B, meneruskan port xxx dari server B kembali ke server A"? Jika demikian, mengapa Anda berharap untuk mengambil sesuatu dengan netstat / lsof di server A? Tidak ada pendengar baru di server A yang dibuat oleh ini, jadi tidak ada penetapan port pada server A yang terlibat (simpan secara sementara).
MadHatter
SSH dari A ke B, port forward dari port X on B ke port Y on C (yang ada di dalam firewall A - maka kebutuhan untuk maju), menggunakan lsof / netstat pada B untuk port X.
pat