【发布时间】:2021-01-02 09:12:30
【问题描述】:
我正在使用下面的这个 powershell 脚本,我将我在网上找到的代码拼凑在一起,它在大多数情况下都有效。它只需要使用 if 条件在主机上尝试两个可用的 ssh 端口,然后在成功后启动 mstsc.exe。我想解决一些问题:
- 为什么 -NoNewWindow 参数在第一个实例中起作用,但在 else 块中不起作用?
- 为什么我必须依靠 Start-Sleep 在 ssh.exe 进入后台后运行任何行。如果我不使用 Start-Sleep,似乎 mstsc.exe 进程启动得太早或根本没有启动,因为它正在等待 ssh.exe 完成。如果您将 -v 添加到 ssh,您会看到它确实以“分叉到后台”完成,这已经完成但技术上尚未完成。
是否有任何类似于使用 & 的 Linux bash 解决方法?
谢谢!
$server = "152.306.2.20"
$port1 = 443
$port2 = 222
$user = Read-Host -Prompt 'Enter your username'
Write-Host "Trying $port1 ..."
$connection = New-Object System.Net.Sockets.TcpClient ($server, $port1)
if ($connection.Connected) {
Write-Host "Port 222 available, establishing SSH connection with xrdp tunnel"
Start-Process -NoNewWindow ssh.exe -ArgumentList "-p $port1", '-Nf', "-l $user", '-L 3929:127.0.0.1:3929', "$server"
Start-Sleep -s 10
Write-Host "Opening remote desktop on localhost:3929"
Start-Sleep -s 2
Start-Process mstsc.exe -ArgumentList "/v:127.0.0.1:3929"
}
else {
Write-Host "Port 222 unavailable, establishing SSH connection with xrdp tunnel on alternate port"
Start-Process -NoNewWindow ssh.exe -ArgumentList "-p $port2", '-Nf', "-l $user", '-L 3929:127.0.0.1:3929', "$server"
Start-Sleep -s 10
Write-Host "Opening remote desktop on localhost:3929"
Start-Sleep -s 2
Start-Process mstsc.exe -ArgumentList "/v:127.0.0.1:3929"
}
【问题讨论】:
-
为什么不直接使用
Start-Process -NoNewWindow而不是ssh.exe -p $port1 -Nf -l $user -L 3929:127.0.0.1:3929 $server? -
这是我最初的,但是在它进入后台后它从未进入下一行。我玩弄 -Wait 并没有得到我想要的,所以我想如果我使用 Start-Process 和所有这些参数,我可能会有更多的控制权。它仍然不能完全按照我想要的方式工作,所以我求助于使用 Start-Sleep 来加载 mstsc.exe。 OpenSSH 说 -N 将其置于后台,但它永远不会像在 Linux 中那样被置于后台。 Powershell 仍然等待指令结束,然后再转到下一行并启动 mstsc.exe。
标签: powershell openssh