You need to enable JavaScript to run this app. PowerShell SSH脚本能否从comenzi.txt逐行读取执行命令?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 19:27:05