我在试着从paramiko ssh运行一个批处理脚本。
批处理脚本如下所示:
start cmd.exe /k "cd C:\\Users\\Administrator\\iometer\\ && C:\\Users\\Administrator\\iometer\\IOmeter.exe /c C:\\Users\\Administrator\\iometer\\new_config.icf /r C:\\Users\\Administrator\\iometer\\iometer_result_v.csv"
如果我在本地运行批处理脚本,它可以工作,但是当我从paramiko
exec_command()
触发相同的批处理脚本时,它不会启动IOMeter.exe
应用程序。
,
exec_command()
本身运行整个批处理脚本命令,甚至没有在远程计算机中启动应用程序.。
发布于 2022-11-18 06:49:15
问题是,如果我们在paramiko中使用exec_command运行任何批处理脚本,它会执行命令并立即终止会话和由该exec_command会话打开的所有依赖会话(或子会话)。
要解决此问题,可以从powershell触发相同的批处理脚本,并在末尾添加等待。或者创建一个PowerShell脚本(temp.ps1)并添加命令,将批处理脚本作为一个进程运行。
示例批处理文件如下所示(为了安全考虑,我在这里使用记事本,但实际上我正在运行一个工具,它在不同磁盘上并行运行IO压力,并将输出记录到文件中)
start cmd.exe /k \"cd C:\\Users\\Administrator\\automate && C:\\Users\\Administrator\\automate\\notepad.exe &exit"
start cmd.exe /k \"cd C:\\Users\\Administrator\\automate && C:\\Users\\Administrator\\automate\\notepad.exe &exit"
start cmd.exe /k \"cd C:\\Users\\Administrator\\automate && C:\\Users\\Administrator\\automate\\notepad.exe &exit"
示例powershell脚本如下所示:
start-process 'cmd.exe' -ArgumentList "/c C:\\Users\\Administrator\\automate\\temp_batch.bat &exit" -Wait
总之,我们有一个批处理脚本和一个powershell,将批处理脚本作为一个进程运行。在python中,只需使用paramiko exec_command运行这个powershell脚本。
cmd = "powershell -file C:\\Users\\Administrator\\automate\\temp3.ps1"
示例python脚本如下所示:
import paramiko
hostname = 'x.x.x.x'
port = 22
username = 'user'
password = 'pwd'
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname,port,username,password)
cmd = "powershell -file C:\\Users\\Administrator\\diskio\\temp3.ps1"
stdin,stdout,stderr=ssh.exec_command(cmd)
outlines=stdout.readlines()
result=''.join(outlines)
print (result)
print(stderr.readlines())
ssh.close()
https://stackoverflow.com/questions/74476660
复制相似问题