paramiko 文件传输失败 Sftp put 方法 踩坑点
阅读原文时间:2023年07月08日阅读:1
Traceback (most recent call last):
  File "D:\PythonPoject\linuxtool\config\1.py", line 16, in <module>
    sftp.put('01-network-manager-all.yaml', '/home/yibai/02-network-manager-all.yaml', print("上传完成!"))
  File "D:\PythonPoject\lib\site-packages\paramiko\sftp_client.py", line 757, in put
    file_size = os.stat(localpath).st_size
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: '01-network-manager-all.yaml'

这个报错是因为windos的路径不同

报不到文件,如果是window环境的话 需要用 "\\" 来转义,翻了很多帖子说window下 sftp 上传文件只支持绝对路径 , 最后我实验出来是支持 相对路径 的。

raise IOError(text)

OSError: Failure 报错是因为我没有写目标路径的文件名字光想着放在路径下面就行了

sftp.put(r'config\01-network-manager-all.yaml', '/home/yibai/', print("上传完成!"))

下面报错

Traceback (most recent call last):
  File "D:\PythonPoject\linuxtool\config\1.py", line 16, in <module>
上传完成!
    sftp.put(r'config\01-network-manager-all.yaml', '/home/yibai/', print("上传完成!"))
  File "D:\PythonPoject\lib\site-packages\paramiko\sftp_client.py", line 759, in put
    return self.putfo(fl, remotepath, file_size, callback, confirm)
  File "D:\PythonPoject\lib\site-packages\paramiko\sftp_client.py", line 714, in putfo
    with self.file(remotepath, "wb") as fr:
  File "D:\PythonPoject\lib\site-packages\paramiko\sftp_client.py", line 372, in open
    t, msg = self._request(CMD_OPEN, filename, imode, attrblock)
  File "D:\PythonPoject\lib\site-packages\paramiko\sftp_client.py", line 822, in _request
    return self._read_response(num)
  File "D:\PythonPoject\lib\site-packages\paramiko\sftp_client.py", line 874, in _read_response
    self._convert_status(msg)
  File "D:\PythonPoject\lib\site-packages\paramiko\sftp_client.py", line 907, in _convert_status
    raise IOError(text)
OSError: Failure

进程已结束,退出代码为 1


put(localpath, remotepath, callback=None, confirm=True)
将一个本地文件(localpath)复制到SFTP服务器上,作为remotepath。任何由操作引起的异常都会被传递过去。这个方法主要是作为一种方便提供的。

参数。
localpath (str) - 要复制的本地文件
remotepath (str) - SFTP服务器上的目标路径。注意,应该包括文件名。只指定一个目录可能会导致错误。
callback (callable) - 可选的回调函数(形式:func(int, int)),接受到目前为止所传输的字节和要传输的总字节数
confirm (bool) - 事后是否对文件做stat()以确认文件的大小
返回。
一个SFTPAttributes对象,包含关于给定文件的属性

发现其实官方文档已经写出来了 remotepath(str) 必须包括文件名 不要只写 路径 这个文件名你可以随意取可以起到重命名的效果。

put(localpath, remotepath, callback=None, confirm=True)

sftp.put('config\\01.yaml', '/home/yibai/01.yaml', print("上传完成!"))
sftp.put('config\\01.yaml', '/home/yibai/02.yaml', print("上传完成!"))

其实也可以用 r'' 这样就不用转义了

sftp.put(r'config\01.yaml', '/home/yibai/01.yaml', print("上传完成!"))

实例:

import paramiko

transport = paramiko.Transport(("192.168.253.128",22))
transport.connect(username = "root", password = "12345678")
sftp = paramiko.SFTPClient.from_transport(transport)
# 从远程服务器下载文件
# 远程服务器文件路径为/data/paramiko.txt
# sftp.get('/home/yibai/2.txt', '2.txt', print("下载完成!"))
# 从本地上传文件到远程服务器
sftp.put('config\\01.yaml', '/home/yibai/02.yaml', print("上传完成!"))
# 可以对其重命名 ,如果存在文件就覆盖
sftp.put(r'config\01-.yaml', '/home/yibai/02-network.yaml', print("上传完成!"))

也可以使用 os.path.join() 函数对其拼接

sftp.put(os.path.join('D:\\', '22222.txt'), os.path.join('/home/yibai/Desktop', '22222.txt'), print("上传完成!"))
# localpath 代表取D:\\22222.txt  remotepath 会变成 Desktop/22222.txt
# 所以remotepath目标路径可以不用 os.path.join()

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章