Python Paramiko SFTP获取文件及文件时间戳/状态

3
# create SSHClient instance
ssh = paramiko.SSHClient()

list = []

# AutoAddPolicy automatically adding the hostname and new host key
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.load_system_host_keys()
ssh.connect(hostname, port, username, password)
stdin, stdout, stderr = ssh.exec_command("cd *path*; ls")

for i in stdout:
    list.append(i)

sftp = ssh.open_sftp()

for i in list:
    tempremote = ("*path*" + i).replace('\n', '')
    templocal = ("*path*" + i).replace('\n', '')

    try:
        #Get the file from the remote server to local directory
        sftp.get(tempremote, templocal)
    except Exception as e:
        print(e)

远程服务器文件修改日期状态:2018年6月10日10:00:17

本地文件修改日期状态:当前日期时间

但是我发现在复制文件后,修改日期被改变了。

有没有办法同时将远程文件的状态和内容一起复制到本地文件中呢?


1
为什么要使用 shell 的 ls 命令来检索文件列表?使用 SFTP:SFTPClient.listdir - Martin Prikryl
2个回答

10

在传输文件时,Paramiko确实不会保留时间戳。

下载后,您必须显式调用os.utime


请注意,pysftp(内部使用Paramiko)支持使用其pysftp.Connection.get()方法保留时间戳。
您可以重复使用他们的实现(我简化了代码):
sftpattrs = sftp.stat(tempremote)
os.utime(templocal, (sftpattrs.st_atime, sftpattrs.st_mtime))

同样适用于上传

1
谢谢,这正是我在函数中所需要的。因为我需要修改日期来处理我的文件。 - Jack Lim

1
似乎没有办法在paramiko SFTP模块中复制文件状态。这是有道理的,因为复制远程文件的状态(除了时间)并没有必要(例如,用户/组ID在本地计算机上没有意义)。您可以只复制文件,然后使用SFTP客户端的stat或lstat方法获取atime / mtime / ctime,并使用os.utime将它们设置在本地文件上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接