转载自https://www.cnblogs.com/zhangchen5/p/16064335.html
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 上传文件只支持绝对路径 , 最后我实验出来是支持 相对路径 的。
OSError: Failure
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()