PowerShell SSH脚本能否从comenzi.txt逐行读取执行命令?
功能实现可行性
完全可以实现逐行读取comenzi.txt内命令批量执行的需求,现有基于Posh-SSH的脚本框架不需要重构,仅需补全文件读取逻辑、规避SSH远程执行的上下文特性问题即可。
核心注意事项
- 前置依赖:所有用到的
New-SSHSession、Invoke-SSHCommand都是Posh-SSH模块提供的命令,运行前请先通过Install-Module Posh-SSH -Scope CurrentUser完成模块安装,否则会报命令不存在的错误。 - 执行特性提醒:Windows端OpenSSH远程执行默认是无状态独立会话,每一次单独调用
Invoke-SSHCommand发起的指令,都会在独立的shell进程中运行,前一次指令的工作目录切换、环境变量修改结果不会传递给下一次指令。你当前comenzi.txt里包含大量cd路径跳转逻辑,如果直接逐行单独发送指令,会出现跳转路径不生效、程序找不到的问题。
修正后可直接运行的脚本
# 1. 读取主机列表、待执行命令列表,自动过滤空行避免无效报错 $hostList = Get-Content -Path .\hostsss.txt | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } $commandList = Get-Content -Path .\comenzi.txt | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } $User = "user" $Password = "Pass" # 2. 准备加密连接凭据 $secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force $Credentials = New-Object System.Management.Automation.PSCredential($User, $secpasswd) # 3. 清理旧的SSH主机信任记录,避免连接报错 Get-SSHTrustedHost | Remove-SSHTrustedHost # 4. 遍历所有主机创建连接、执行批量命令 foreach ($hostName in $hostList) { # 建立当前主机的SSH会话 $session = New-SSHSession -ComputerName $hostName -Credential $Credentials -AcceptKey:$true # 拼接所有命令为同一条cmd执行串,用&连接保证所有命令在同一个cmd进程内顺序执行,保留cd跳转的上下文逻辑 $combinedCommand = "cmd /c `"$($commandList -join ' & ')`"" # 发送执行命令 $execResult = Invoke-SSHCommand -Index $session.SessionId -Command $combinedCommand # 打印执行结果 Write-Host "主机 $hostName 执行输出:" Write-Host $execResult.Output # 执行完成后主动关闭会话,避免残留连接占用资源 $session | Remove-SSHSession }
方案逻辑说明
- 文件读取逻辑:通过
Get-Content逐行读取comenzi.txt和hostsss.txt的内容,自动跳过空行,避免向SSH会话发送空指令触发无意义报错 - 上下文适配:将所有读取到的命令用
&拼接为单条指令,强制在同一个cmd进程内运行,完全匹配你comenzi.txt中cd跳转的逻辑预期,不会出现路径不生效、程序找不到的问题 - 多主机适配:补充循环逻辑适配hostsss.txt中存储多台待操作主机的场景,实现批量操作
- 资源回收:执行完成后主动移除SSH会话,避免残留的无效连接占用服务器资源
可选调整方案
如果确实需要逐行单独获取每条命令的执行输出,而不追求cd路径的上下文继承,可以把命令执行部分的拼接逻辑替换为逐行循环发送指令:
foreach ($singleCmd in $commandList) { $execResult = Invoke-SSHCommand -Index $session.SessionId -Command $singleCmd Write-Host "执行指令:$singleCmd 输出:" Write-Host $execResult.Output }
注意:这种逐行发送的方式下,所有cd命令的跳转效果不会被后续命令继承,仅适合执行无上下文依赖的独立操作。
内容的提问来源于stack exchange,提问作者user12428212
相关产品推荐
相关产品推荐

