首页 > 解决方案 > 让 Powershell 将 Start-Process ssh.exe 置于后台

问题描述

我正在使用下面的这个 powershell 脚本,我将我在网上找到的代码拼凑在一起,它在大多数情况下都有效。它只需要使用 if 条件在主机上尝试两个可用的 ssh 端口,然后在成功后启动 mstsc.exe。我想解决一些问题:

  1. 为什么 -NoNewWindow 参数在第一个实例中起作用,但在 else 块中不起作用?
  2. 为什么我必须依靠 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"
}

标签: powershellopenssh

解决方案


Woops 问题 #1 只是因为我是从 Powershell 编辑器运行的,所以这不是问题。问题 #2 仍未解决。


推荐阅读