我正在尝试编写一行 PowerShell 代码,通过 SSH 推送 PSExec 命令,从 Linux 计算机远程运行程序到 Windows 计算机。如果我手动查询会话 ID 并将其硬编码,它可以工作,但 ID 会发生变化,所以我想动态地提取它。
当前命令是这样的:
ssh [email protected] "psexec '\\\\192.168.1.3' -i Invoke-Command -ScriptBlock {query session | grep user | grep -o [0-9]} -s $prgm"
不幸的是,当我运行脚本时,收到以下错误:
The system cannot find the file specified.
Starting Invoke-Command on 192.168.1.3....1.3...
PsExec could not start Invoke-Command on 192.168.1.3:
Binary file C:\Users\user\Desktop\Games\StepMania\Program\StepMania.exe matches
文件路径归因于脚本中较早的代码。它尝试将脚本参数与从文本文件中提取的 Windows 机器上的路径进行匹配。如果您认为有必要,我可以粘贴整个脚本。
答案1
我还没有尝试使用 PSExec,但是获取已启动进程的当前 pid 很简单,只需这样做...
$process = Start-Process -FilePath "notepad" -PassThru
"Process Id is $($process.Id)"
另请注意,PowerShell 有一个默认变量,用于保存当前进程 ID。
$pid
但是,这里有一个回复说,你可以通过这种方式通过 psexec 获得报酬,更不用说通过 SSH 连接到似乎是 Linux 的目标了。请注意,这仍然是 Windows 与 Windows 机器之间的对话,而不是通过 SSH 会话连接到似乎是 Linux 机器的东西。
& psexec -s -d -i $SessionID \\$PCname $Program $FilePath\$FileName |
Select-String 'process ID (\d+)' |
ForEach-Object {$_.Matches.Groups[1].Value}
答案2
ssh [email protected] "psexec '\\\\192.168.1.3' powershell.exe -Command \"&{query session | grep user | grep -o [0-9]}\" -s $prgm"
不太确定您在 SSH 上使用 -s 'lowercase' 参数的原因...因为它不接受该参数中的值...您的意思是 -S 'uppercase' 吗?
在这种情况下
ssh -S $prgm [email protected] "psexec '\\\\192.168.1.3' powershell.exe -Command \"&{query session | grep user | grep -o [0-9]}\""
如果您指的是 PsExec 的 -s 开关,那么它也不支持将任何值传递给参数......