轉載自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()