【发布时间】:2018-09-26 05:37:54
【问题描述】:
我有以下脚本
test.py
#!/usr/bin/env python2
from subprocess import Popen, PIPE, STDOUT
proc = Popen(['scp', 'test_file', 'user@192.168.120.172:/home/user/data'], stdout=PIPE, stdin=PIPE, stderr=STDOUT)
out, err = proc.communicate(input='userpass\n')
print('stdout: ' + out)
print('stderr: ' + str(err))
这意味着使用给定用户user的登录名将test_file复制到位于10.0.0.2的远程目录/home/user/data中。为此,我必须使用 scp。不允许密钥验证(不要问为什么,事情就是这样,我无法更改)。
即使我将userpass 传递给进程,我仍然会在终端内收到输入密码的提示。我只想在本地机器上运行 test.py,然后远程获取文件而无需任何用户交互。
虽然我没有正确使用communicate(),所以我手动调用了
proc.stdin.write('userpass\n')
proc.stdin.flush()
out, err = proc.communicate()
但没有任何改变,我仍然收到密码提示。
【问题讨论】:
-
可以改用公钥认证吗?这样你就完全不用担心密码了。
-
不,正如我所提到的,
scp是唯一的方法。我也对此感到不安,但事实就是如此。 :DI 知道我可以使用expect/pexepect(但它需要在系统上安装一些软件,我不允许这样做),sshpass(与第一点相同),关键身份验证是不去等等。 -
我不是在问
scp,我是在问你是否可以使用scp支持的公钥认证来代替密码认证。 -
scp 是一种使用 SSH 协议进行连接和身份验证的远程复制方法。您应该可以在此处使用基于密钥的身份验证。您拥有远程主机上用户的密码。究竟是什么让您无法在源计算机上为用户创建密钥对以将公钥添加到远程用户的 .ssh/authorized_keys?公司政策?
-
@Duncan,我是说没有密钥认证。事物的设置方式也将不可用。为了省略这种讨论,我将把它添加到问题中。
标签: python passwords pipe popen scp