如何通过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
相关产品推荐
相关产品推荐

