【问题标题】:subprocess.Popen keeps on asking password for ssh-copy-id commandsubprocess.Popen 不断询问 ssh-copy-id 命令的密码
【发布时间】:2019-04-30 11:09:03
【问题描述】:

我经历了多个有类似问题的线程 (Use subprocess to send a password) 并尝试了很多东西,但我仍然无法让它工作。基本上我想将我的 ssh 密钥推送到一堆机器上,我正在尝试使用 subprocess 来做到这一点。但不知何故,subprocess.Popen 无法获取密码,因此卡住了。

以下是我尝试过的一些事情。

from subprocess import Popen, PIPE

p = Popen(['ssh-copy-id', 'testbox1'], stdin=PIPE, stdout=PIPE).communicate(input=b'mypassword')

我还尝试通过写入进程的标准输入通道来提供密码,如下所示

p.stdin.write(b'mypassword')
p.stdin.flush()

我在 python 2.7 和 python 中都试过了,但没有成功。我也尝试在密码后提供换行符,但即使这样也没有用。我不确定我在这里缺少什么。

我知道有人建议为此使用Pexpect,但我更想知道为什么subprocess 无法处理这个问题。

我知道有多个库,例如 Paramikofabric,它们可以轻松处理远程连接,但我认为在这种情况下不能使用它,因为我不是直接 sshing机器,而不是使用我本地机器上的ssh-copy-id 命令

【问题讨论】:

  • 我会先做一些调试。请参阅unix.stackexchange.com/questions/36540/… 以获得一个不错的起点。
  • 你可以试试p.stdin.write(b'mypassword\n')(带有换行符)。但是那些静默的进入方式有时候比较低级,而且是行不通的。检查命令是否没有将密码作为参数(来自 Putty 的plink
  • @Jean-FrançoisFabre 我也尝试过换行,但没有成功。
  • @Rohit 试试这个? serverfault.com/a/306675
  • ssh-copy-id 未从标准输入读取;它正在尝试直接从终端读取。

标签: python ssh subprocess


【解决方案1】:

subprocess 处理似乎有点棘手,因此我不得不pexpect 来解决这个问题,它在第一次运行时就奏效了。

import pexpect
from getpass import getpass

pwd = getpass("password: ")

child = pexpect.spawn('ssh-copy-id testbox1')
child.expect('.*ssword.*:')
child.sendline(pwd)
child.expect(pexpect.EOF, timeout=None)
cmd_show_data = child.before
cmd_output = cmd_show_data.split('\r\n')
for data in cmd_output:
    print data

【讨论】:

  • 好电话。为未来的读者/搜索者编辑了您的问题标题。
猜你喜欢
  • 1970-01-01
  • 2013-08-25
  • 2012-04-19
  • 2018-06-30
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 2013-03-20
相关资源
最近更新 更多