【发布时间】:2020-11-13 04:32:58
【问题描述】:
有大量旧的 linux 设备。我正在尝试编写一个程序来自动复制其配置。 shh 公钥身份验证不起作用,但 rsync 在那里。我无法向开幕会议发送密码。我正在尝试使用 Popen,但我似乎无法将标准输入发送到进程。 在这种情况下,安全性并不重要,因为网络是孤立的。
def syncdevice(ip):
session = Popen([f'rsync -a user@{ip}:/mnt/usr /home/d400/ftp/{year}/{mounth}/{ip}/'], stdin=PIPE, stdout=PIPE, shell=True, universal_newlines=True)
return session
syncdevice('192.168.0.1')
session.stdin.write('password\n')
我尝试了其他功能,例如“communicate()”,但也没有效果。
【问题讨论】:
-
表现良好的软件直接从 TTY 读取密码,而不是从标准输入,因此没有任何东西试图读取您在标准输入上发送的密码。
-
无论如何,底层协议是什么?这是 rsync-over-ssh,还是直接通过未加密的 TCP 进行 rsync?
-
顺便说一下,你最好相信
year和month变量中传递的值——因为你使用shell=True一年$(rm -rf ~)可以删除文件你的本地机器。使用shell=False并使用显式参数列表而不是字符串更安全。 -
@CharlesDuffy 这是 rsync-over-ssh
-
查看链接副本上建议
sshpass的答案。