【问题标题】:Response to cmd [duplicate]对 cmd 的响应 [重复]
【发布时间】: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 的答案。

标签: python rsync popen


【解决方案1】:

您可以使用RSYNC_PASSWORD 环境变量或使用--password-file 选项。环境变量解决方案是:

import os

def syncdevice(ip, password):
    env = os.environ.copy()
    env["RSYNC_PASSWORD"] = password
    session = Popen(['rsync', '-a', f'user@{ip}:/mnt/usr /home/d400/ftp/{year}/{mounth}/{ip}/'],
        stdin=PIPE, stdout=PIPE, shell=True, universal_newlines=True,
        env=env)
    return session

syncdevice('192.168.0.1', password)

(注意:您对命令的引用似乎关闭了,它应该是列表中的每个标记)

【讨论】:

  • NameError: name 'RSYNC_PASSWORD' is not defined。它在一个守护进程上,我没有这个选项。
  • 这应该作为字符串用引号括起来。固定。
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
相关资源
最近更新 更多