我的服务器运行带有freeSSHd的Windows 7以允许ssh连接。我试图使用paramiko远程执行该服务器上的程序MyProgram.exe。以下是执行其工作的代码的相关部分。不过,还需要改进。
import paramiko
import time
cmds = 'xcopy file1 backup\\file1 & xcopy file2 backup\\file2 & MyProgram.exe file1 file2'
final_cmds = 'cmd.exe /c "' + final_cmds + '"'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ipaddr = socket.gethostbyname(hostname)
ssh.connect(ipaddr, port=port, username=username, password=password)
transport = ssh.get_transport()
channel = transport.open_session()
channel.setblocking(1)
channel.settimeout(None)
channel.set_combine_stderr(1)
channel.exec_command(final_cmds)
while True:
try:
if channel.exit_status_ready():
if channel.recv_ready():
output = channel.recv(1024)
break
except:
print 'Exception'
break
time.sleep(2)
ssh.close()
上述代码的问题是它在服务器端打开一个新的cmd窗口。我想在后台运行cmd.exe或至少最小化,但如果我更改行
final_cmds = 'cmd.exe /c "' + final_cmds + '"'
进入
final_cmds = 'start /b cmd.exe /c "' + final_cmds + '"'
或
final_cmds = 'start /min cmd.exe /c "' + final_cmds + '"'
甚至
final_cmds = 'start cmd.exe /c "' + final_cmds + '"'
我收到错误:“无法在远程系统上执行命令或shell:无法执行进程。”有什么想法吗?
由于
答案 0 :(得分:0)
start /min
无法正常工作,因为Paramiko在调用execute_command时未启动cmd.exe。
它类似于从“运行”窗口运行命令时获得的内容(Windows Key + R)
因此许多命令不起作用,例如start,类型和回声。
最简单的方法是编写或传输脚本并在目标中运行它。
final_cmds = 'cmd.exe /c echo ' + final_cmds + '> runme.bat & runme.bat'
[...]
channel.exec_command(final_cmds)
这样你可以在任何命令之前使用start /min
来“隐藏”它。
此外,如果您需要转义某些字符,例如>
和&
,然后将它们回显到脚本中:
final_cmds.replace('>','^>')