Zvo*_*ran 11 python ssh command subprocess
我正在使用此代码在远程服务器上执行命令.
import subprocess
import sys
COMMAND="ls"
ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
error = ssh.stderr.readlines()
print >>sys.stderr, "ERROR: %s" % error
else:
print result
Run Code Online (Sandbox Code Playgroud)
当我尝试执行此脚本时,我会收到密码提示.有什么方法可以避免它,例如,我可以以某种方式在脚本中输入密码吗?此外,密码应以某种方式加密,以便有权访问该脚本的人无法看到它.
为什么要把事情搞得这么复杂呢?这是我的建议:
1) 在 ~/.ssh/config 文件中创建 ssh 配置部分:
Host myserver
HostName 50.50.50.12 (fill in with your server's ip)
Port xxxx (optional)
User me (your username for server)
Run Code Online (Sandbox Code Playgroud)
2) 如果您已经生成了 ssh 密钥对,请立即执行(使用 ssh-keygen)。然后上传:
$ ssh-copy-id myserver
Run Code Online (Sandbox Code Playgroud)
3)现在您可以通过 ssh 使用子进程。例如,为了捕获输出,我调用:
result = subprocess.check_output(['ssh', 'myserver', 'cat', 'somefile'])
Run Code Online (Sandbox Code Playgroud)
简单、可靠,并且唯一需要密码的时候就是将公钥复制到服务器时。
顺便说一句,使用这些步骤您的代码可能也能正常工作。
一种方法是创建一个公钥,将其放在服务器上,然后执行ssh -i /path/to/pub/key user@host或使用paramiko,如下所示:
import paramiko
import getpass
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
p = getpass.getpass()
ssh.connect('hostname', username='user', password=p)
stdin, stdout, stderr = ssh.exec_command('ls')
print stdout.readlines()
ssh.close()
Run Code Online (Sandbox Code Playgroud)