如何在 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 起可用。 您可以在这里阅读更多相关信息: