python - 如何在 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
```
解决方案
你可以试试这个:
$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
推荐阅读
- heroku - 部署时Python套接字服务器不工作
- flutter - 如果在 Flutter android 中使用 webview 页面时互联网连接丢失,则显示消息“无互联网”
- cordova - 如何在从 PC 转移的 Mac 上运行 Ionic 应用程序
- javascript - 如何从对象中删除属性但保留其值?
- android - 删除图像会留下甚至不存在的空占位符 (Android Studio)
- numpy - 在 Spyder 的变量资源管理器中加载整个列表
- git - 在推送到 github 之前,我是否需要 git checkout 从 svn 转换创建的远程分支
- google-maps - form.currentstate.validate() 失败 - Flutter
- ios - 在动态 UITableView 中使用多个 UIPickerView
- node.js - 在使用 node 和 puppeteer 获得页面响应后,如何找到某个是否存在?