ssh -L (erreur: bind: adresse déjà utilisée)

48

Assez simple, je sais que cela m'est déjà arrivé auparavant. Impossible de trouver une bonne réponse à AU.

J'exécutais une session ssh avec des ports liés:

ssh -L 3000:<server_name>:22

Je viens de perdre ma connexion. Lorsque j'essaie de vous reconnecter à l'aide de la même commande, le message d'erreur suivant s'affiche:

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

Comment réinitialiser ssh sur ma machine pour permettre au port d'être lié à nouveau? La réinitialisation de la machine locale fonctionne.

kbuilds
la source

Réponses:

66

Ne pourriez-vous pas tuer ce qui utilise ce port?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901pour trouver ce qui utilise le port 5901.

Passer le tout kill -9pour tuer ce qui utilisait le port 5901.

Remplacez-le par le port que vous souhaitez ouvrir à nouveau.

utilisateur974407
la source
Oui, vous pouvez remplacer le numéro de port par le port bloqué. Je vais marquer ceci comme la réponse.
kbuilds
Si vous êtes prudent et / ou oublieux comme moi, vous voudrez peut-être courir seul et découvrir le processus avant de le tuer. lsof -ti:5901renverra un numéro de processus, que vous passerez ensuite àkill -9
oct
3
Et si rien n'utilise le port 5901 (ou le port local que vous spécifiez)?
Michael
Essayez sudosi le processus ne vient paslsof
riche remer
2
Il n'y a aucune raison pour kill -9que le programme ne réponde pas complètement . Tuer un processus avec le signal n ° 9 (SIGKILL) le termine immédiatement sans lui donner la possibilité de vider les mémoires tampons, de fermer les descripteurs de fichiers et des sockets, de supprimer les fichiers temporaires, etc., ce que le processus peut faire si vous utilisez kill(par défaut, SIGTERM) , suivi de kill -1(SIGHUP; hangup) et de kill -2(SIGINT; ce que Ctrl + C envoie) si cela ne fonctionne pas et enfin kill -9 si rien d'autre ne fonctionne .
TheDudeAbides
12

Je suppose que vous avez encore quelque chose connecté au port local 3000.

Vous pouvez le trouver avec

netstat -tulpn | grep 3000 

et ensuite en disposer. Par exemple dans ma machine:

[:~] % 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

identifie correctement le processus en attente et connecté sur le port 5900 (serveur vnc).

Une autre commande utile est

fuser 3000/tcp 

... vous devrez peut-être tous les exécuter sudosi vous ne possédez pas le processus d'ouverture du port.

Rmano
la source
Merci d'avoir répondu. Je vais devoir creuser pour voir si je peux recréer le problème. La seule application possible qui aurait pu écouter sur le port 3000 était l'ancienne session ssh qui était déconnectée. Le processus était géré par mon utilisateur. J'ai donc supposé que je serais capable de l'exécuter killall sshet de le faire mourir. Devinez que ce n'est pas le cas
kbuilds
Merci pour le rappel à utiliser sudo- c'est ce qui me manquait.
ACV
5

J'ai pu recréer et corriger le problème en procédant comme suit:

  • Ouvrez quelque chose qui va lister vos processus ( ps -ae)
  • Tuer le processus appelé sh( kill <proc_number>)

Puis rouvrez la connexion ssh

Alternativement, j'ai eu du succès avec:

killall ssh

Dans le terminal sur la machine locale

kbuilds
la source
2

un autre concurrent: ss

il peut être utilisé comme ceci: ss -ltp | grep 3000pour trouver le programme qui écoute sur le port 3000

mnagel
la source