PowerShell 5.1从Windows远程连Linux执行命令拉取文件方案咨询
可行实现方案
PowerShell 5.1 原生不支持 PowerShell Remoting over SSH,该特性为 PowerShell 7 及以上版本的新增功能,因此你无法使用 New-PSSession、Invoke-Command 走SSH协议连接Linux主机,直接使用系统已安装的OpenSSH原生工具链即可满足所有需求,具体实现步骤如下:
前置准备(可选,推荐)
配置SSH免密登录,避免脚本执行过程中需要人工输入密码:
- 在Windows本地PowerShell执行
ssh-keygen一路回车生成SSH密钥对,默认保存路径为C:\Users\你的用户名\.ssh\id_rsa.pub - 执行
ssh user@linuxmachine "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < C:\Users\你的用户名\.ssh\id_rsa.pub将公钥上传到Linux主机的授权列表中
核心实现步骤
第一步:远程执行命令生成文件
直接通过原生ssh命令后接需要执行的远程命令即可,示例如下:# 示例:在Linux主机执行磁盘统计命令,结果写入/tmp/disk_report.log ssh user@linuxmachine "df -h > /tmp/disk_report.log" # 可通过$LASTEXITCODE判断命令是否执行成功,0为成功,非0为失败 if ($LASTEXITCODE -ne 0) { Write-Error "远程命令执行失败" exit 1 }如需执行多条命令,用分号分隔即可:
ssh user@linuxmachine "cd /opt/project; sh build.sh > build_result.log"第二步:将生成的文件传输回Windows本地
使用OpenSSH自带的scp命令实现文件拉取,示例如下:# 示例:将Linux上的/tmp/disk_report.log拉取到Windows本地D:\logs目录下 scp user@linuxmachine:/tmp/disk_report.log D:\logs\ if ($LASTEXITCODE -ne 0) { Write-Error "文件传输失败" exit 1 }
完整脚本示例
# 自定义变量配置 $linuxUser = "root" $linuxHost = "192.168.3.25" $remoteFile = "/tmp/service_status.log" $localPath = "D:\Operation_Logs\service_status_$(Get-Date -Format 'yyyyMMddHHmm').log" # 远程执行命令生成文件 ssh "${linuxUser}@${linuxHost}" "systemctl status --type=service > ${remoteFile}" if ($LASTEXITCODE -ne 0) { Write-Error "远程采集服务状态失败" exit 1 } # 拉取文件到本地 scp "${linuxUser}@${linuxHost}:${remoteFile}" $localPath if ($LASTEXITCODE -ne 0) { Write-Error "拉取日志文件失败" exit 1 } Write-Host "执行成功,文件已保存至:$localPath"
注意事项
- 如果路径包含空格,需要用引号包裹对应路径
- 如需执行超级权限命令,免密配置后可直接在命令前加
sudo,同时需要在Linux主机的/etc/sudoers中对应用户配置NOPASSWD权限
内容的提问来源于stack exchange,提问作者jgpadilla04
相关产品推荐
相关产品推荐

