【发布时间】: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 无法处理这个问题。
我知道有多个库,例如 Paramiko 和 fabric,它们可以轻松处理远程连接,但我认为在这种情况下不能使用它,因为我不是直接 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