我有一个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'
非常感谢任何帮助!
答案 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。