如何在 Win 10 / powershell 上获取 free/open 本地端口用于 ssh 转发
How to get a free/open local port on Win10 / powerhsell for ssh forwarding
我来自 Unix 世界,想在 Windows 10 机器上进行 ssh 端口转发 ssh -L
。
我有一个 python 单线的工作解决方案。
现在我想问 Powershell 用户如何在 pure powershell
上优雅地执行此操作
$LOCALPORT=$(python -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()")
为了给你一些框架,它会 运行 在这样的脚本中:
$USER="USERNAME"
$REMOTEHOST="REMOTEHOST"
$LOCALIP=$(Get-NetAdapter -Name "WiFi" | Get-NetIPAddress).IPv4Address
$LOCALPORT=$(python -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()")
$REMOTEIP=ssh $USER@$REMOTEHOST "cat `$HOME/var/ip|cut -d`':`' -f1"
$REMOTEPORT=ssh $USER@$REMOTEHOST "cat `$HOME/var/ip|cut -d`':`' -f2"
Start-Job ssh -L $LOCALIP`:$LOCALPORT`:$REMOTEIP`:$REMOTEPORT $USER@$REMOTEHOST -N -v -v -v
sleep 5
```
你可以试试这个:
$usedPorts = (Get-NetTCPConnection | select -ExpandProperty LocalPort) + (Get-NetUDPEndpoint | select -ExpandProperty LocalPort)
5000..60000 | where { $usedPorts -notcontains $_ } | select -first 1
Get-NetTCPConnection 和 Get-NetUDPEndpoint 都是 return 当前连接,我们只需要 LocalPort。
下一行从 5000 迭代到 60000 并检查端口号是否未被使用。管道的最后一部分 return 是第一个结果。
编辑
我刚刚发现您还可以使用它来获取当前使用的端口:
$usedPorts = (Get-NetTCPConnection).LocalPort + (Get-NetUDPEndpoint).LocalPort
此语法称为成员枚举,自 PowerShell v3 起可用。
您可以在这里阅读更多相关信息:
我来自 Unix 世界,想在 Windows 10 机器上进行 ssh 端口转发 ssh -L
。
我有一个 python 单线的工作解决方案。
现在我想问 Powershell 用户如何在 pure powershell
$LOCALPORT=$(python -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()")
为了给你一些框架,它会 运行 在这样的脚本中:
$USER="USERNAME"
$REMOTEHOST="REMOTEHOST"
$LOCALIP=$(Get-NetAdapter -Name "WiFi" | Get-NetIPAddress).IPv4Address
$LOCALPORT=$(python -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()")
$REMOTEIP=ssh $USER@$REMOTEHOST "cat `$HOME/var/ip|cut -d`':`' -f1"
$REMOTEPORT=ssh $USER@$REMOTEHOST "cat `$HOME/var/ip|cut -d`':`' -f2"
Start-Job ssh -L $LOCALIP`:$LOCALPORT`:$REMOTEIP`:$REMOTEPORT $USER@$REMOTEHOST -N -v -v -v
sleep 5
```
你可以试试这个:
$usedPorts = (Get-NetTCPConnection | select -ExpandProperty LocalPort) + (Get-NetUDPEndpoint | select -ExpandProperty LocalPort)
5000..60000 | where { $usedPorts -notcontains $_ } | select -first 1
Get-NetTCPConnection 和 Get-NetUDPEndpoint 都是 return 当前连接,我们只需要 LocalPort。 下一行从 5000 迭代到 60000 并检查端口号是否未被使用。管道的最后一部分 return 是第一个结果。
编辑
我刚刚发现您还可以使用它来获取当前使用的端口:
$usedPorts = (Get-NetTCPConnection).LocalPort + (Get-NetUDPEndpoint).LocalPort
此语法称为成员枚举,自 PowerShell v3 起可用。 您可以在这里阅读更多相关信息: