ssh -L(错误:绑定:地址已在使用中)


48

很简单,我知道这以前发生在我身上。在AU上找不到合适的答案。

我正在使用绑定的端口运行ssh会话:

ssh -L 3000:<server_name>:22

我刚失去联系。当我尝试使用相同的命令重新连接时,出现以下错误:

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

如何在机器上重置ssh以允许再次绑定端口?重置本地计算机工作。

Answers:


66

您不能杀死使用该端口的任何东西吗?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901找到正在使用port的东西5901

将整个事情传递kill -9给杀死使用port的任何对象5901

替换为您要再次打开的端口。


是的,您可以将端口号更改为被阻止的任何端口。我将其标记为答案。
kbuilds 2015年

如果您像我一样谨慎和/或健忘,则可能希望自己运行lsof并在杀死进程之前找出进程。lsof -ti:5901将返回一个进程号,然后您将其传递给kill -9
octern,2016年

3
如果什么都不使用端口5901(或您指定的任何本地端口)怎么办?
迈克尔

尝试sudo是否未完成此过程lsof
丰富的内容,请于18-10-29

2
kill -9除非程序完全没有响应,否则没有理由。使用信号#9(SIGKILL)杀死进程会立即终止该进程,而不会给进程提供刷新缓冲区,关闭文件句柄和套接字,删除临时文件等的机会,如果您使用该进程可以做所有这些事情kill(默认为SIGTERM) ,然后是kill -1(SIGHUP; hangup)和kill -2(SIGINT; Ctrl + C发送的内容),如果那不起作用,最后kill -9 如果没有其他作用
TheDudeAbides

12

我想您仍然有一些连接到本地端口3000。

你可以找到它

netstat -tulpn | grep 3000 

然后处理它。例如在我的机器上:

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

正确识别正在等待并在端口5900(vnc服务器)上连接的进程。

另一个有用的命令是

fuser 3000/tcp 

... sudo如果您不拥有打开端口的进程,则可能需要与它们一起运行。


感谢您的回答。我将不得不深入研究它是否可以重现该问题。可能一直在端口3000上监听的唯一应用程序是已断开连接的旧ssh会话。我的用户拥有该进程,因此我假设我将能够运行killall ssh并使其死亡。猜测并非如此
kbuilds 2014年

感谢您使用提醒sudo-这就是我所缺少的。
ACV '02

5

通过执行以下操作,我可以重新创建并修复它:

  • 打开将列出您的进程的内容(ps -ae
  • 终止名为shkill <proc_number>)的进程

然后重新打开ssh连接

另外,我在以下方面也取得了成功:

killall ssh

在本地机器的终端上


2

还有一个竞争者: ss

可以这样使用:ss -ltp | grep 3000查找在端口3000上侦听的程序

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.