我正在嘗試編寫一行 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 機器之間的對話,而不是與 Linux 機器之間的 SSH 會話。
& 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 '小寫' 參數是什麼...因為它不接受該參數中的值...您的意思是 -S '大寫' 嗎?
在這種情況下
ssh -S $prgm [email protected] "psexec '\\\\192.168.1.3' powershell.exe -Command \"&{query session | grep user | grep -o [0-9]}\""
如果您的意思是 PsExec 的 -s 開關也不支援將任何值傳遞給參數...