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

相当简单,我知道这在以前发生过。在 AU 上找不到一个好的答案。
我正在运行一个绑定了端口的 ssh 会话:
ssh -L 3000:<server_name>:22

我刚刚失去了连接。当我尝试使用相同的命令重新连接时,出现以下错误:
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000

如何重置我的机器上的ssh,以允许端口再次绑定?重置本地机器即可。

4个回答

你能不能直接杀掉占用那个端口的进程?
 lsof -ti:5901 | xargs kill -9

使用命令 lsof -ti:5901 查找正在使用端口 5901 的进程。
将整个结果传递给 kill -9 命令,以终止占用端口 5901 的进程。
根据需要替换为要重新打开的端口。

是的,你可以将端口号更改为被阻止的任何端口。我会将此标记为答案。 - kbuilds
如果你像我一样谨慎或者健忘,你可能希望先单独运行lsof命令,弄清楚要终止的进程是什么。lsof -ti:5901会返回一个进程号,然后你可以将该进程号传递给kill -9命令来终止进程。 - octern
4如果没有任何东西使用端口5901(或者您指定的本地端口),会怎么样? - Michael
如果使用 lsof 命令无法找到进程,请尝试使用 sudo 命令。 - rich remer
2即使使用sudo,我也看不到任何进程。 - Joseph Garvin
8除非程序完全无响应,否则没有理由使用kill -9命令。使用信号#9(SIGKILL)终止进程会立即关闭它,而不给进程刷新缓冲区、关闭文件句柄和套接字、删除临时文件等的机会。如果你使用kill(默认为SIGTERM)命令,然后是kill -1(SIGHUP;挂起)和kill -2(SIGINT;相当于Ctrl+C发送的信号),进程是可以执行这些操作的。只有在其他方法都无效的情况下,才需要使用kill -9命令。 - TheDudeAbides
确实,使用kill -9命令可能会导致进程意外退出。 - Boson Bear

我猜你还有一些与本地端口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
谢谢你提醒我使用sudo - 这就是我所忽略的。 - ACV

我能够通过以下步骤重新创建并修复它:
  • 打开一个可以列出进程的工具(ps -ae
  • 终止名为sh的进程(kill <proc_number>
然后重新打开SSH连接。
另外,我也尝试过以下方法,并取得了成功:
killall ssh

在本地机器的终端上

一个更多的竞争者:ss 可以像这样使用:ss -ltp | grep 3000 来查找监听在端口3000上的程序