You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Paramiko在Windows Server 2016远程执行bat/Python脚本?

Windows Server 2016下Paramiko远程执行Bat脚本无响应问题排查

问题场景

已在Windows Server 2016配置SSH服务,使用Paramiko远程执行Bat脚本时无反应,但脚本手动运行正常。

所用Paramiko代码

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ip', username='root', password='pass')
ssh_stdin, ssh_stdout, ssh_stder = ssh.exec_command('C:/Users/Administrator/Desktop/main/videos/uniq.bat')

待执行的Bat脚本内容

FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO ffmpeg -i "%%G" -vf noise=alls=1:allf=t "%%~nG_1.mp4"

问题原因及解决办法

1. SSH会话默认工作目录不匹配

Bat脚本中dir /b *.mp4是基于当前工作目录查找文件,而Paramiko连接SSH后默认工作目录通常是用户主目录(如C:\Users\Administrator),并非Bat脚本所在目录,导致找不到MP4文件,脚本无实际执行动作。

解决: 执行命令前先切换到Bat所在目录,再调用脚本:

command = 'cd /d "C:/Users/Administrator/Desktop/main/videos" && cmd /c uniq.bat'
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(command)

2. 未通过cmd /c触发Bat执行

Windows下SSH会话直接调用Bat文件路径,可能无法正确触发命令解释器执行脚本,需明确通过cmd /c来启动Bat。

解决: 命令中加入cmd /c(上述修改已包含)。

3. SSH用户错误

Windows系统默认无root用户,代码中填写的username='root'会导致连接后权限异常或无法正确访问文件。

解决: 替换为Windows实际的管理员用户名(如Administrator):

ssh.connect('ip', username='Administrator', password='pass')

4. FFmpeg不在SSH会话环境变量中

手动运行脚本时使用的是当前用户的环境变量,但SSH会话的环境变量可能未包含FFmpeg的路径,导致脚本找不到ffmpeg命令。

解决:

  • 方法1:在Bat脚本中写FFmpeg的绝对路径,例如:
    FOR /F "tokens=*" %%G IN ('dir /b *.mp4') DO "C:/path/to/ffmpeg.exe" -i "%%G" -vf noise=alls=1:allf=t "%%~nG_1.mp4"
    
  • 方法2:在执行命令时临时添加环境变量:
    command = 'set PATH=%PATH%;C:/path/to/ffmpeg_dir && cd /d "C:/Users/Administrator/Desktop/main/videos" && cmd /c uniq.bat'
    

5. 未捕获执行输出排查问题

原代码未读取stdout和stderr,无法得知脚本执行时的错误信息(如文件找不到、命令不存在等)。

解决: 执行后读取输出内容:

# 读取输出和错误(Windows默认编码为GBK,需对应解码)
print("执行输出:", ssh_stdout.read().decode('gbk'))
print("错误信息:", ssh_stderr.read().decode('gbk'))

内容的提问来源于stack exchange,提问作者le ra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:57:27