首页 > 解决方案 > 如何在 Win10 / powerhsell 上获得免费/开放的本地端口以进行 ssh 转发

问题描述

我来自 Unix 世界,想ssh -L在 Windows 10 机器上进行 ssh 端口转发。我有一个使用 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
```

标签: pythonwindowspowershellsshport

解决方案


你可以试试这个:

$usedPorts = (Get-NetTCPConnection | select -ExpandProperty LocalPort) + (Get-NetUDPEndpoint | select -ExpandProperty LocalPort)
5000..60000 | where { $usedPorts -notcontains $_ } | select -first 1

Get-NetTCPConnection 和 Get-NetUDPEndpoint 都返回当前连接,我们只需要 LocalPort。下一行从 5000 迭代到 60000 并检查端口号是否未使用。管道的最后一部分返回第一个结果。

编辑

我刚刚发现您还可以使用它来获取当前使用的端口:

$usedPorts = (Get-NetTCPConnection).LocalPort + (Get-NetUDPEndpoint).LocalPort

此语法称为成员枚举,自 PowerShell v3 起可用。您可以在这里阅读更多相关信息:https ://stackoverflow.com/a/48888108/5805327


推荐阅读