Paramiko SFTP - 如何避免指定完整本地文件名?

0 投票
1 回答
2327 浏览
提问于 2025-04-17 00:19

我有一些Python代码,使用Paramiko从远程服务器获取构建文件:

def setup_sftp_session(self, host='server.com', port=22, username='puppy'):
    self.transport = paramiko.Transport((host, port))
    privatekeyfile = os.path.expanduser('~/.ssh/id_dsa')
    try:
        ssh_key = paramiko.DSSKey.from_private_key_file(privatekeyfile)
    except IOError, e:
        self.logger.error('Unable to find SSH keyfile: %s' % str(e))
        sys.exit(1)
    try:
        self.transport.connect(username = username, pkey = ssh_key)
    except paramiko.AuthenticationException, e:
        self.logger.error("Unable to logon - are you sure you've added the pubkey to the server?: %s" % str(e))
        sys.exit(1)
    self.sftp = paramiko.SFTPClient.from_transport(self.transport)
    self.sftp.chdir('/some/location/buildfiles')

def get_file(self, remote_filename):
    try:
        self.sftp.get(remote_filename, 'I just want to save it in the local cwd')
    except IOError, e:
        self.logger.error('Unable to find copy remote file %s' % str(e))

def close_sftp_session(self):
    self.sftp.close()
    self.transport.close()

我想把每个文件都下载到当前的本地工作目录里。

不过,Paramiko似乎没有这个选项——你必须指定完整的本地保存路径。你甚至不能只指定一个目录(比如"./"或者"/home/victorhooi/files"),必须包括文件名的完整路径。

有没有什么办法可以解决这个问题?如果每次都要指定本地文件名,那就太麻烦了,应该只需要复制远程的文件名就好。

另外,我在setup_sftp_session中处理异常的方式,用exit(1)这样做,是不是一个好习惯,还是有更好的方法?

谢谢,
Victor

1 个回答

1

你需要插入

os.path.join(os.getcwd(), remote_filename)

在一个函数里调用 exit() 并不是个好主意。也许你想重复使用这段代码,并在出现异常时采取一些措施。如果你一直保留 exit() 的调用,那你就没办法处理了。我建议修改这个函数,让它在成功时返回 True,失败时返回 False。这样调用这个函数的人就可以决定接下来该怎么做。

另一种方法是不去捕获异常。这样调用者就需要自己处理这些异常,并且可以获得关于失败情况的完整信息(包括错误堆栈跟踪)。

撰写回答