首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用subprocess.Popen通过SSH或SCP发送密码

使用subprocess.Popen通过SSH或SCP发送密码
EN

Stack Overflow用户
提问于 2013-03-01 21:13:00
回答 7查看 70.4K关注 0票数 14

我试图使用scp (安全副本)命令运行subprocess.Popen。登录要求我发送密码:

代码语言:javascript
复制
from subprocess import Popen, PIPE

proc = Popen(['scp', "user@10.0.1.12:/foo/bar/somefile.txt", "."], stdin = PIPE)
proc.stdin.write(b'mypassword')
proc.stdin.flush()

这将立即返回一个错误:

代码语言:javascript
复制
user@10.0.1.12's password:
Permission denied, please try again.

我确定密码是正确的。我很容易通过手动调用shell上的scp来验证它。那为什么这个不起作用?

注意,有许多类似的问题,询问subprocess.Popen并发送密码用于自动SSH或FTP登录:

如何通过python脚本在linux中设置用户密码?

使用子进程发送密码

这些问题的答案不起作用和/或不适用,因为我使用的是Python 3。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-01 21:28:39

链接的第二个答案建议您使用普雷普 (这通常是与期望输入的命令行程序交互的正确方式)。

票数 7
EN

Stack Overflow用户

发布于 2013-03-01 22:05:24

下面是一个使用ssh密码使用pexpect的函数

代码语言:javascript
复制
import pexpect
import tempfile

def ssh(host, cmd, user, password, timeout=30, bg_run=False):                                                                                                 
    """SSH'es to a host using the supplied credentials and executes a command.                                                                                                 
    Throws an exception if the command doesn't return 0.                                                                                                                       
    bgrun: run command in the background"""                                                                                                                                    
                                                                                                                                                                               
    fname = tempfile.mktemp()                                                                                                                                                  
    fout = open(fname, 'w')                                                                                                                                                    
                                                                                                                                                                               
    options = '-q -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oPubkeyAuthentication=no'                                                                         
    if bg_run:                                                                                                                                                         
        options += ' -f'                                                                                                                                                       
    ssh_cmd = 'ssh %s@%s %s "%s"' % (user, host, options, cmd)                                                                                                                 
    child = pexpect.spawn(ssh_cmd, timeout=timeout)  #spawnu for Python 3                                                                                                                          
    child.expect(['[pP]assword: '])                                                                                                                                                                                                                                                                                               
    child.sendline(password)                                                                                                                                                   
    child.logfile = fout                                                                                                                                                       
    child.expect(pexpect.EOF)                                                                                                                                                  
    child.close()                                                                                                                                                              
    fout.close()                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                        
    fin = open(fname, 'r')                                                                                                                                                     
    stdout = fin.read()                                                                                                                                                        
    fin.close()                                                                                                                                                                
                                                                                                                                                                               
    if 0 != child.exitstatus:                                                                                                                                                  
        raise Exception(stdout)                                                                                                                                                
                                                                                                                                                                               
    return stdout

类似的东西应该可以使用scp

票数 13
EN

Stack Overflow用户

发布于 2017-10-05 22:14:47

OpenSSH scp实用程序调用ssh程序使SSH连接到远程主机,ssh进程处理身份验证。ssh实用程序不接受命令行或其标准输入中的密码。我认为这是OpenSSH开发人员故意做出的决定,因为他们认为人们应该使用更安全的机制,比如基于密钥的身份验证。调用ssh的任何解决方案都将遵循以下方法之一:

  1. 使用SSH密钥进行身份验证,而不是密码。
  2. 使用刀柄期望或类似工具自动响应密码提示。
  3. 使用(滥用) SSH_ASKPASS特性,通过调用另一个命令(描述这里这里 )或在某些应答这里中获取密码,以获得ssh的密码。
  4. 让SSH服务器管理员启用基于主机的认证并使用它。请注意,基于主机的身份验证只适用于某些网络环境。参见附加注释这里这里
  5. 使用perl、python、java或您喜欢的语言编写自己的ssh客户机。大多数现代编程语言都可以使用ssh客户端库,您可以完全控制客户机如何获取密码。
  6. 下载ssh源代码并构建一个修改后的ssh版本,该版本以您希望的方式工作。
  7. 使用不同的ssh客户端。这里有免费和商业的其他ssh客户端。其中一个可能比OpenSSH客户端更适合您的需求。

在这种情况下,考虑到您已经在从python脚本调用scp,似乎其中之一是最合理的方法:

  1. 使用python模块帕普调用scp并将密码提供给它。
  2. 使用python实现帕拉米科来执行这个ssh任务,而不是调用外部程序。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15166973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档