ssh -L (error: bind: Alamat sudah digunakan)

48

Cukup sederhana, saya tahu bahwa ini pernah terjadi pada saya sebelumnya. Tidak dapat menemukan jawaban yang baik pada AU.

Saya menjalankan sesi ssh dengan port terikat:

ssh -L 3000:<server_name>:22

Saya baru saja kehilangan koneksi saya. Ketika saya mencoba menghubungkan kembali menggunakan perintah yang sama, saya mendapatkan kesalahan berikut:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000

Bagaimana cara mereset ssh pada mesin saya untuk memungkinkan port terikat lagi? Menyetel ulang mesin lokal berfungsi.

kbuilds
sumber

Jawaban:

66

Tidak bisakah Anda membunuh apa pun yang menggunakan port itu?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901untuk menemukan apa pun yang menggunakan port 5901.

Sampaikan semuanya kill -9untuk membunuh apa pun yang menggunakan port 5901.

Ganti dengan port yang ingin Anda buka kembali.

pengguna974407
sumber
Ya, Anda bisa mengubah nomor port ke port apa pun yang diblokir. Saya akan menandai ini sebagai jawabannya.
kbuilds
Jika Anda berhati-hati dan / atau pelupa seperti saya, Anda mungkin ingin menjalankannya sendiri dan mencari tahu apa prosesnya sebelum membunuhnya. lsof -ti:5901akan mengembalikan nomor proses, yang kemudian Anda berikan kekill -9
octern
3
bagaimana jika tidak ada yang menggunakan port 5901 (atau port lokal apa pun yang Anda tentukan)?
Michael
Coba sudojika prosesnya tidak muncullsof
kaya remer
2
Tidak ada alasan untuk kill -9kecuali program ini benar - benar tidak responsif. Membunuh suatu proses dengan sinyal # 9 (SIGKILL) segera menghentikannya tanpa memberi kesempatan pada proses untuk membersihkan buffer, menutup filehandle dan soket, menghapus file sementara, dll., Yang semuanya dapat dilakukan prosesnya jika Anda menggunakan kill(default ke SIGTERM) , diikuti oleh kill -1(SIGHUP; hangup) dan kill -2(SIGINT; apa yang dikirimkan Ctrl + C) jika itu tidak berhasil, dan akhirnya kill -9 jika tidak ada yang berfungsi .
TheDudeAbides
12

Saya kira Anda masih memiliki sesuatu yang terhubung ke port 3000 lokal.

Anda dapat menemukannya dengan

netstat -tulpn | grep 3000 

dan kemudian membuangnya. Misalnya di mesin saya:

[:~] % netstat -tulpn | grep 5900
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      2547/vino-server
tcp6       0      0 :::5900                 :::*                    LISTEN      2547/vino-server

mengidentifikasi proses menunggu dan terhubung dengan benar pada port 5900 (vnc server).

Perintah lain yang bermanfaat adalah

fuser 3000/tcp 

... semuanya mungkin perlu dijalankan sudojika Anda tidak memiliki proses yang membuka porta.

Rmano
sumber
Terima kasih atas jawabannya. Saya harus menggali ke dalamnya untuk melihat apakah saya dapat membuat ulang masalah. Satu-satunya aplikasi yang mungkin bisa mendengarkan pada port 3000 adalah sesi ssh lama yang terputus. Pengguna saya memiliki prosesnya, jadi saya berasumsi saya akan dapat menjalankan killall sshdan membuatnya mati. Kira bukan itu masalahnya
kbuilds
Terima kasih atas pengingat yang digunakan sudo- itulah yang saya lewatkan.
ACV
5

Saya dapat membuat ulang dan memperbaikinya dengan melakukan hal berikut:

  • Buka sesuatu yang akan mencantumkan proses Anda ( ps -ae)
  • Bunuh proses yang disebut sh( kill <proc_number>)

Kemudian buka kembali koneksi ssh

Atau, saya telah sukses dengan:

killall ssh

Di terminal pada mesin lokal

kbuilds
sumber
2

satu lagi pesaing: ss

dapat digunakan seperti ini: ss -ltp | grep 3000untuk menemukan program mendengarkan pada port 3000

mnagel
sumber