Windows

在 Windows PowerShell 7 .ps1 腳本中 SSH 後遠端執行 Shell/Linux 命令

  • May 27, 2021

我試圖找到最簡單、最直接的方式在.ps1PowerShell 腳本中的 SSH 之後在 Linux 伺服器上執行命令,在 Windows 10 上執行 PowerShell 7。

我有一個通過 SCP/PuTTY 上傳 zip 文件的過程,完成後,我的腳本 SSH 進入伺服器,然後我需要執行幾個 Linux 命令來解壓縮文件並執行 Docker 建構/組合。

# param1: destination server ip
$ip=$args[0]
# param2: path on the server
$path=$args[1]
# param3: username
$un=$args[2]
# param4: password # TODO: figure out how to hide
$pw=$args[3]
# source path

if (!$pw) { throw "Password can't be null." }

$src = "../"
# construct archival name
$DateTime = (Get-Date -Format "yyyyMMddHHmmss")
$zip = "..\deploy_archive\deploy-$DateTime.zip"
# Create archive
mkdir -Force ..\deploy_archive
# exclusion rules. 
$files = Get-ChildItem -Path $src -Exclude @("node_modules", "deploy_archive")
# Compress
Compress-Archive -Path $files -DestinationPath $zip -CompressionLevel Fastest
# Report status
Write-Output "`nZipped archive: $($zip)"
# PuTTY SCP file transfer command
$Cmd = ("pscp -l {0} -pw {1} -batch {2} {3}:{4}" -f $un,$pw,$zip,$ip,$path)
Write-Output "cmd: $Cmd"
Invoke-Expression "& $( $Cmd )"
# Report success
Write-Output ("`nUploaded to  {0}:{1}" -f $ip,$path)
# Connect via SSH
ssh ("{0}@{1}" -f $un,$ip)

# ...NOW DO STUFF ON THE REMOTE SERVER
# ...like unzip and run Docker build

我可以添加一個老式的 ssh 命令,例如:

ssh username@some.ip.add.ress

然後它會詢問我的密碼並成功連接,但之後我添加的腳本直到我退出 SSH 會話後才會執行。

如果我使用:

# SSH-Sessions -ComputerName $ip -Username $un -Password $pw

我得到:

> [some.ip.add.ress] The background process reported an error with the
> following message: The SSH client session has ended with error
> message: subsystem request failed on channel 0.

uname -a在伺服器上給了我:

Linux azrahznval0002 3.10.0-1160.15.2.el7.x86_64 #1 SMP Thu Jan 21 16:15:07 EST 2021 x86_64 x86_64 x86_64 GNU/Linux

我在提出相關問題的 StackOverflow 上找到了解決方案和部分答案。我沒想到會在那裡找到它……但是您可以在命令中內聯執行命令ssh,這很直覺,並且考慮到在大多數情況下您希望如何執行此類操作,這很明顯。

我怎麼是第一個在這裡發布解決方案的人,大聲笑?每個人都應該知道這一點。

仍然想知道為什麼我的 SSH-Sessions 命令不起作用,但這可能是伺服器上的東西……

引用自:https://serverfault.com/questions/1064795