【问题标题】:Subprocess.run doesn't work on ssh-copy-idSubprocess.run 不适用于 ssh-copy-id
【发布时间】:2020-12-20 05:58:13
【问题描述】:

我想使用 ssh-copy-id 自动向远程服务器发送证书。我为此选择了python子进程库,但不知何故它不会将密码发送到终端。

我知道我可以使用 sshpass 或 paramiko 来做到这一点,但我不想选择它,除非我必须这样做。你能帮我解决这个问题吗?我的代码如下。

from subprocess import run,PIPE

send_cert = run(['ssh-copy-id', '-i', '~/.ssh/id_rsa.pub','pardus'], stdout=PIPE, input=input_cert, encoding='utf-8')
input_cert = '1'

pardus 是我的远程主机名。您可以替换 user@IP 。

【问题讨论】:

    标签: python ssh subprocess


    【解决方案1】:

    ~ 被 shell 替换为主目录,但你不是通过 shell 执行命令,所以它是按字面意思解释的。

    您可以使用os.path.expanduser() 函数来执行此替换。

    import os
    from subprocess import run,PIPE
    
    send_cert = run(['ssh-copy-id', '-i', os.path.expanduser('~/.ssh/id_rsa.pub'),'pardus'], stdout=PIPE, input=input_cert, encoding='utf-8')
    

    【讨论】:

    • @flakes 不,这是正确的。您将公钥发送到远程主机,私钥会保留。手册页说如果文件名不以.pub 结尾,它会添加它。
    • 我的错。我只是想正常的ssh 而不是ssh-copy-id
    • @ZekiAhmetBayar 你在调用函数后设置input_cert。您需要先设置它。
    • @Barmar 正如你所说,我先定义它。我在问题中添加了一张照片。你可以从那里看到问题。我没有收到任何错误,只是无法将密码发送到命令行。
    • ssh-copy-id 可能会尝试从终端读取密码,而不是标准输入。因此,您无法使用 input= 向其提供密码
    【解决方案2】:

    我解决了。

        send_pass = 'PASSWORD' + '\n'
        send_cert = 'ssh-copy-id -i ' + 'CERT_PATH' + ' ' + 'USER@HOSTNAME'
    
        child = pexpect.spawn(send_cert,encoding='utf-8')
        child.expect('password:')
        child.sendline(send_pass)
        time.sleep(2)
    

    谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 2015-01-11
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多