2015-09-16 71 views
0

SSH Python脚本,我能够在命令行通过腻子

C:\>cd "C:\Program Files\ExtraPuTTY\Bin" 

C:\Program Files\ExtraPuTTY\Bin>putty.exe -ssh [email protected] 22 

这可以帮助我通过腻子打开SSH会话给下面的命令。

虽然我无法在Python脚本中重现它们。

cwd="C://Program Files//ExtraPuTTY//Bin" 
COMMAND="ls" 
ssh = Popen(['putty.exe -ssh','%s'%HOST, COMMAND,cwd],shell=True,stdout=f,stderr=f) 

,我看到的是

错误“putty.exe -ssh””不被识别为一个内部或外部命令,可操作的程序或批处理文件

回答

1

你有通过cwd作为cwd参数Popen

Popen(['putty.exe -ssh'...], shell=True, stdout=f, stderr=f, cwd=cwd) 

而您应该使用Plink而不是PuTTY来自动执行远程命令。该的Plink接受其命令行命令(腻子未):

Popen(['plink.exe -ssh [email protected] ls'], shell=True, stdout=f, stderr=f, cwd=cwd) 
+1

不使用list参数和'壳= TRUE';这是误导。 'shell = True'在这里是不必要的,你可以将完整路径传递给'plink.exe'。 – jfs

1

putty download page,下载并安装plink,并确保其在windows path$PATH变量)

然后,这蟒片断应该工作:

import subprocess 
cmd='plink -ssh {}@{} -pw {}'.format(user,server,password) 
sp = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True) 
sp.stdin.write(stdin) 
sp.stdin.close() 
stdout= sp.stdout.read() 
stderr=sp.stderr.read() 
sp.wait() 

stdin是由终端的用户输入的命令,stdoutstderr是服务器OUTP UT。

填写您的凭据在user="root"server="172.20.0.102 22"也许password的ssh连接

+0

设置SSH密钥要比将密码作为命令指向可执行文件要好得多。 – robert

+0

我同意。由于'plink'还支持命令行密码auth,因此我将此选项添加到代码段中。 –

+0

如果Windows上的管道有一个有限的缓冲区(如在Unix上),则您的代码可能会死锁。如果你想将输入作为字符串传递或者得到stdout,stderr作为字符串,那么你应该使用'.communicate()'方法。 – jfs