空端口中的端口转发。但“无法监听端口”并且端口已满

空端口中的端口转发。但“无法监听端口”并且端口已满

步骤 1. 检查端口

netstat -tnlpa
(No info could be read for "-p": geteuid()=1000 but you should be root.)  
Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 127.0.0.1:6443          0.0.0.0:*               LISTEN      -  
tcp6       0      0 :::8080                 :::*                    LISTEN      -  

步骤 2. 尝试 SSH

ssh -N -f -L 8888:localhost:8888 -p 5000 [email protected]
> No response.  

步骤 3. 重试 SSH

ssh -N -f -L 8888:localhost:8888 -p 5000 [email protected]
bind [127.0.0.1]:8888: Address already in use  
channel_setup_fwd_listener_tcpip: cannot listen to port: 8888  
Could not request local forwarding.  

步骤 4. 检查端口

netstat -tnlpa 
(Not all processes could be identified, non-owned process info  
 will not be shown, you would have to be root to see it all.)  
Active Internet connections (servers and established)  
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name  
tcp        0      0 127.0.0.1:6443          0.0.0.0:*               LISTEN      -  
tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN      228/ssh  
tcp        0      0 172.23.246.199:46180    20.194.107.22:5000      ESTABLISHED 228/ssh  
tcp        0      0 172.23.246.199:46182    20.194.107.22:5000      ESTABLISHED 230/ssh  
tcp6       0      0 :::8080                 :::*                    LISTEN      -  
tcp6       0      0 ::1:8888                :::*                    LISTEN      228/ssh  

本地:WSL2 LTS 20.04
服务器:AzureVM LTS 18.0X


由于我的英语水平和计算机科学知识较差,我很抱歉没有解释得足够多。
如果我们需要更多信息,我会回复。

答案1

为第一个命令(无响应)提供的选项的效果是,当命令成功时,没有反馈:

  • -N:不要运行任何远程命令,这在仅转发端口时很有用。
  • -f:当身份验证阶段(如果有)结束时,ssh 命令将转到后台。

因此,第一个命令没有可见的结果,但确实按预期工作:设置隧道以转发端口 8888,而没有其他内容(可见)。

第二个命令仅部分成功:它仍然在后台运行第二个远程 SSH 连接,但无法转发再次相同的端口:之前的命令已经完成了。因此,它对此进行了抱怨。这种不创建隧道并且不允许任何命令的SSH命令只是浪费资源。


哪些方面还可以做得更好?这取决于目标。但是为了防止浪费资源,可以简单地做的是通过使用附加选项来强制无法建立所请求隧道的 SSH 命令完全失败-o ExitOnForwardFailure=yes::

指定如果 ssh(1) 无法设置所有请求的动态、隧道、本地和远程端口转发,是否应终止连接,[...]

所以最后你应该运行一次,但是除了收到错误消息之外,多次尝试并不是一个真正的问题:

ssh -N -f -o ExitOnForwardFailure=yes -L 8888:localhost:8888 -p 5000 [email protected]

在此命令成功之前,应首先终止先前运行的 ssh 命令(OP 运行了至少其中两个):其中一个命令实际上绑定到端口 8888,并将阻止此命令成功。

在 Linux 上,可以使用以下命令找到它们的 PID ss

ss -tnp dst == destination.com and dport == 5000

这样他们就可以用命令杀死kill

相关内容