远程服务器上的子进程

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)

当我尝试执行此脚本时,我会收到密码提示.有什么方法可以避免它,例如,我可以以某种方式在脚本中输入密码吗?此外,密码应以某种方式加密,以便有权访问该脚本的人无法看到它.

Sco*_*ott 5

为什么要把事情搞得这么复杂呢?这是我的建议:

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)

简单、可靠,并且唯一需要密码的时候就是将公钥复制到服务器时。

顺便说一句,使用这些步骤您的代码可能也能正常工作。


hei*_*nst 4

一种方法是创建一个公钥,将其放在服务器上,然后执行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)