Python Paramiko創(chuàng)建文件目錄并上傳文件詳解
引言
在網(wǎng)絡運維和自動化領(lǐng)域,SSH(Secure Shell)協(xié)議是連接和管理遠程服務器的常用手段。而Paramiko是一個用于進行SSH2會話的Python庫,它支持加密、認證和文件傳輸?shù)裙δ?。使用Paramiko,可以方便地實現(xiàn)遠程命令執(zhí)行、文件上傳下載等操作。本文旨在詳細指導新手朋友如何使用Python的Paramiko庫來創(chuàng)建遠程文件目錄并上傳文件。
一、安裝Paramiko
首先,確保你已經(jīng)安裝了Paramiko庫。如果沒有安裝,可以通過pip輕松完成:
pip install paramiko
安裝完成后,在Python腳本中導入所需的模塊:
import paramiko
二、創(chuàng)建SSH連接
在開始任何操作之前,需要創(chuàng)建一個SSH客戶端實例,并配置相關(guān)參數(shù)。以下是一個基本示例:
ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自動添加主機密鑰
接下來,使用服務器的IP地址、端口號、用戶名和密碼來連接到遠程服務器:
ssh_client.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')
三、創(chuàng)建遠程文件目錄
一旦連接成功,你就可以通過執(zhí)行SSH命令來創(chuàng)建文件目錄。以下是一個簡單的示例,展示如何創(chuàng)建一個名為my_directory的新目錄:
command = "mkdir my_directory"
stdin, stdout, stderr = ssh_client.exec_command(command)
print("Directory created:", stdout.read().decode())
另外,你也可以通過SFTP會話來創(chuàng)建目錄,Paramiko提供了一個SFTP客戶端,可以很方便地進行文件傳輸和目錄管理。以下是一個通過SFTP創(chuàng)建目錄的示例:
sftp_client = ssh_client.open_sftp()
try:
remote_path = '/path/to/your/folder/subfolder'
sftp_client.makedirs(remote_path) # 這里會自動創(chuàng)建多級目錄
except IOError as e:
print(f"Error creating remote directory: {e}")
finally:
sftp_client.close()
ssh_client.close()
四、上傳文件
要上傳文件,可以使用Paramiko的SFTPClient類的put()方法。該方法接受兩個參數(shù):本地文件路徑和遠程文件路徑。以下示例將本地文件/tmp/file.txt上傳到遠程服務器的/home/user/目錄:
sftp_client = ssh_client.open_sftp()
try:
local_file_path = '/tmp/file.txt'
remote_file_path = '/home/user/file.txt'
sftp_client.put(local_file_path, remote_file_path)
print('File uploaded successfully')
except FileNotFoundError:
print("Local file not found!")
except PermissionError:
print("No permission to upload the file!")
except Exception as e:
print("An error occurred:", str(e))
finally:
sftp_client.close()
ssh_client.close()
在實際操作過程中,可能會遇到各種異常,比如文件不存在、權(quán)限問題等。因此,合理地處理異常是非常重要的。
五、下載文件
要下載文件,可以使用Paramiko的SFTPClient類的get()方法。該方法接受兩個參數(shù):遠程文件路徑和本地文件路徑。以下示例將遠程服務器的/home/user/file.txt文件下載到本地的/tmp/目錄:
sftp_client = ssh_client.open_sftp()
try:
remote_file_path = '/home/user/file.txt'
local_file_path = '/tmp/file.txt'
sftp_client.get(remote_file_path, local_file_path)
print('File downloaded successfully')
except FileNotFoundError:
print("Remote file not found!")
except PermissionError:
print("No permission to download the file!")
except Exception as e:
print("An error occurred:", str(e))
finally:
sftp_client.close()
ssh_client.close()
六、上傳和下載文件夾
要上傳文件夾,可以使用Paramiko的SFTPClient類的put()方法來逐個上傳文件,也可以使用put_recursive()方法來遞歸上傳文件夾。以下示例將本地文件夾/tmp/folder遞歸上傳到遠程服務器的/home/user/目錄:
import os
def upload_folder(local_folder_path, remote_folder_path):
sftp_client = ssh_client.open_sftp()
try:
for root, dirs, files in os.walk(local_folder_path):
remote_current_path = remote_folder_path + root[len(local_folder_path):].strip(os.sep)
if not sftp_client.listdir(remote_current_path):
sftp_client.makedirs(remote_current_path)
for file in files:
local_file_path = os.path.join(root, file)
remote_file_path = os.path.join(remote_current_path, file)
sftp_client.put(local_file_path, remote_file_path)
print('Folder uploaded successfully')
except Exception as e:
print("An error occurred:", str(e))
finally:
sftp_client.close()
ssh_client.close()
upload_folder('/tmp/folder', '/home/user/')要下載文件夾,可以使用Paramiko的SFTPClient類的get()方法來逐個下載文件,也可以使用get_recursive()方法來遞歸下載文件夾。以下示例將遠程服務器的/home/user/folder文件夾遞歸下載到本地的/tmp/目錄:
import os
def download_folder(remote_folder_path, local_folder_path):
sftp_client = ssh_client.open_sftp()
try:
if not os.path.exists(local_folder_path):
os.makedirs(local_folder_path)
for filename in sftp_client.listdir(remote_folder_path):
remote_file_path = os.path.join(remote_folder_path, filename)
local_file_path = os.path.join(local_folder_path, filename)
if sftp_client.stat(remote_file_path).st_mode & 0o170000 == 0o040000: # 如果是文件夾
download_folder(remote_file_path, local_file_path)
else:
sftp_client.get(remote_file_path, local_file_path)
print('Folder downloaded successfully')
except Exception as e:
print("An error occurred:", str(e))
finally:
sftp_client.close()
ssh_client.close()
download_folder('/home/user/folder', '/tmp/')七、異常處理和高級功能
在實際操作過程中,可能會遇到各種異常,比如文件不存在、權(quán)限問題等。因此,合理地處理異常是非常重要的。此外,在某些場景下,網(wǎng)絡不穩(wěn)定或者文件較大時,斷點續(xù)傳和錯誤重試功能就顯得尤為重要。
你可以通過設(shè)置put方法的resumable參數(shù)為True來實現(xiàn)斷點續(xù)傳(需要注意的是,Paramiko本身并不直接支持斷點續(xù)傳,這里僅作為一個可能的擴展思路),并通過循環(huán)和異常處理來實現(xiàn)錯誤重試。
以下是一個帶有錯誤重試機制的上傳文件示例:
import time
def upload_file_with_retry(local_file_path, remote_file_path, retries=3, delay=2):
sftp_client = ssh_client.open_sftp()
attempt = 0
while attempt < retries:
try:
sftp_client.put(local_file_path, remote_file_path)
print('File uploaded successfully')
return
except Exception as e:
print(f"Attempt {attempt + 1} failed: {str(e)}")
attempt += 1
if attempt < retries:
time.sleep(delay)
finally:
sftp_client.close()
ssh_client.close()
print('Failed to upload file after retries')
upload_file_with_retry('/tmp/file.txt', '/home/user/file.txt')八、總結(jié)
通過本文的指導,你現(xiàn)在應該能夠使用Python的Paramiko庫來創(chuàng)建遠程文件目錄并上傳文件。這些技能不僅能夠提高你的工作效率,還能夠讓你在自動化運維的道路上更進一步。記得在實際操作中多加練習,以便更好地掌握這些有用的工具。
此外,敏感信息如服務器地址、用戶名和密碼應妥善保管,不應在公開場合泄露。
到此這篇關(guān)于Python Paramiko創(chuàng)建文件目錄并上傳文件詳解的文章就介紹到這了,更多相關(guān)Python Paramiko創(chuàng)建文件目錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux下Pycharm、Anaconda環(huán)境配置及使用踩坑
這篇文章主要介紹了Linux下Pycharm、Anaconda環(huán)境配置及使用踩坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
分享一下Python 開發(fā)者節(jié)省時間的10個方法
在這篇文章,我想強調(diào)一些 Python 可以節(jié)約時間并最大限度地提高生產(chǎn)力的方面。在做準備時,我咨詢了幾個 Pythonists,他們最節(jié)省時間的技巧是什么?答案在這里2015-10-10
Python內(nèi)置函數(shù)Type()函數(shù)一個有趣的用法
這篇文章主要介紹了Python內(nèi)置函數(shù)Type()函數(shù)一個有趣的用法,本文講解的是個人發(fā)現(xiàn)在的一個有趣的用法,注意這種寫法會導致代碼很難讀,需要的朋友可以參考下2015-02-02
python使用opencv在Windows下調(diào)用攝像頭實現(xiàn)解析
這篇文章主要介紹了python使用opencv在Windows下調(diào)用攝像頭實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11
用smtplib和email封裝python發(fā)送郵件模塊類分享
本文針對發(fā)郵件相關(guān)的操作進行了封裝,包括發(fā)送文本、HTML、帶附件的郵件,使用Python發(fā)郵件,主要用到smtplib和email兩個模塊,需要的朋友可以參考下2014-02-02
python將三維數(shù)組展開成二維數(shù)組的實現(xiàn)
今天小編就為大家分享一篇python將三維數(shù)組展開成二維數(shù)組的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
Python中函數(shù)帶括號和不帶括號的區(qū)別及說明
這篇文章主要介紹了Python中函數(shù)帶括號和不帶括號的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11

