Python脚本,在可用时使用私钥或用户名密码

时间:2017-06-09 19:29:59

标签: python paramiko

我有一个python脚本,它使用paramiko来获取一些文件。该脚本调用yaml配置文件以获取每个客户端的凭据。我现在需要为新客户端使用私钥(我可以单独使用它)但我无法使用提供的密钥和用户名/密码的脚本。如何提供脚本使用私钥(如果提供)或用户名/密码登录sftp?现在,当运行脚本时,私钥中没有任何内容,脚本会失败。

import paramiko, StringIO
import logging
import os
import yaml

try:
     cfg=yaml.load(open("config.yml"))["local"]
     paramiko.util.log_to_file('sftpin.log')
     sftp = paramiko.Transport(cfg["host"], cfg["port"])
     key_string = cfg["key"]
     not_really_a_file = StringIO.StringIO(key_string)
     private_key = paramiko.RSAKey.from_private_key(not_really_a_file, 
        password=cfg["key_passwd"])
     sftp.connect(username=cfg["user"], password=cfg["pass"] 
        pkey=private_key)
     sftp = paramiko.SFTPClient.from_transport(sftp)
     print 'Connecting'
     files = sftp.listdir(cfg["remote_outbox"])
     print 'Listing Contents'
     print files
     print 'Getting Files'
     for f in files:
        sftp.get(cfg["remote_outbox"]+f, cfg["local_inbox"]+f)
    print 'Job Completed'
finally: 
    try: 
       sftp.close()
    except NameError:
    print 'SFTP is not defined'

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

嘿Danny尝试关注片段。注意:config.yml中的键值是RSA私钥文件的完整路径(例如:/home/user/.ssh/id_rsa)。

import paramiko
import StringIO
import yaml


try:
    cfg=yaml.load(open("config.yml"))["local"]
    paramiko.util.log_to_file('sftpin.log')
    sftp = paramiko.Transport(cfg["host"], cfg["port"])
    key_string = cfg["key"]

    private_key = None

    if key_string is not None:
        f = open(key_string, 'r')
        s = f.read()
        not_really_a_file = StringIO.StringIO(s)

        private_key = paramiko.RSAKey.from_private_key(not_really_a_file,
                                                    password=cfg["key_passwd"])

    sftp.connect(username=cfg["user"],
                 password=cfg["pass"],
                 pkey=private_key)

    sftp = paramiko.SFTPClient.from_transport(sftp)

    print 'Connecting'
    files = sftp.listdir(cfg["remote_outbox"])
    print 'Listing Contents'
    print files
    print 'Getting Files'

    for f in files:
        remote = "%s%s" %(cfg["remote_outbox"], f)
        local = "%s%s" %(cfg["local_inbox"], f)

        try:
            sftp.get(remote, local)
        except IOError:
            print "Failed to copy %s" % remote

    print 'Job Completed'

finally:
    sftp.close()

关心KG。