Python Paramiko創(chuàng)建文件目錄并上傳文件詳解
引言
在網(wǎng)絡(luò)運(yùn)維和自動(dòng)化領(lǐng)域,SSH(Secure Shell)協(xié)議是連接和管理遠(yuǎn)程服務(wù)器的常用手段。而Paramiko是一個(gè)用于進(jìn)行SSH2會(huì)話(huà)的Python庫(kù),它支持加密、認(rèn)證和文件傳輸?shù)裙δ?。使用Paramiko,可以方便地實(shí)現(xiàn)遠(yuǎn)程命令執(zhí)行、文件上傳下載等操作。本文旨在詳細(xì)指導(dǎo)新手朋友如何使用Python的Paramiko庫(kù)來(lái)創(chuàng)建遠(yuǎn)程文件目錄并上傳文件。
一、安裝Paramiko
首先,確保你已經(jīng)安裝了Paramiko庫(kù)。如果沒(méi)有安裝,可以通過(guò)pip輕松完成:
pip install paramiko
安裝完成后,在Python腳本中導(dǎo)入所需的模塊:
import paramiko
二、創(chuàng)建SSH連接
在開(kāi)始任何操作之前,需要?jiǎng)?chuàng)建一個(gè)SSH客戶(hù)端實(shí)例,并配置相關(guān)參數(shù)。以下是一個(gè)基本示例:
ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 自動(dòng)添加主機(jī)密鑰
接下來(lái),使用服務(wù)器的IP地址、端口號(hào)、用戶(hù)名和密碼來(lái)連接到遠(yuǎn)程服務(wù)器:
ssh_client.connect(hostname='your_server_ip', port=22, username='your_username', password='your_password')
三、創(chuàng)建遠(yuǎn)程文件目錄
一旦連接成功,你就可以通過(guò)執(zhí)行SSH命令來(lái)創(chuàng)建文件目錄。以下是一個(gè)簡(jiǎn)單的示例,展示如何創(chuàng)建一個(gè)名為my_directory的新目錄:
command = "mkdir my_directory" stdin, stdout, stderr = ssh_client.exec_command(command) print("Directory created:", stdout.read().decode())
另外,你也可以通過(guò)SFTP會(huì)話(huà)來(lái)創(chuàng)建目錄,Paramiko提供了一個(gè)SFTP客戶(hù)端,可以很方便地進(jìn)行文件傳輸和目錄管理。以下是一個(gè)通過(guò)SFTP創(chuàng)建目錄的示例:
sftp_client = ssh_client.open_sftp() try: remote_path = '/path/to/your/folder/subfolder' sftp_client.makedirs(remote_path) # 這里會(huì)自動(dòng)創(chuàng)建多級(jí)目錄 except IOError as e: print(f"Error creating remote directory: {e}") finally: sftp_client.close() ssh_client.close()
四、上傳文件
要上傳文件,可以使用Paramiko的SFTPClient類(lèi)的put()方法。該方法接受兩個(gè)參數(shù):本地文件路徑和遠(yuǎn)程文件路徑。以下示例將本地文件/tmp/file.txt上傳到遠(yuǎn)程服務(wù)器的/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()
在實(shí)際操作過(guò)程中,可能會(huì)遇到各種異常,比如文件不存在、權(quán)限問(wèn)題等。因此,合理地處理異常是非常重要的。
五、下載文件
要下載文件,可以使用Paramiko的SFTPClient類(lèi)的get()方法。該方法接受兩個(gè)參數(shù):遠(yuǎn)程文件路徑和本地文件路徑。以下示例將遠(yuǎn)程服務(wù)器的/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類(lèi)的put()方法來(lái)逐個(gè)上傳文件,也可以使用put_recursive()方法來(lái)遞歸上傳文件夾。以下示例將本地文件夾/tmp/folder遞歸上傳到遠(yuǎn)程服務(wù)器的/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類(lèi)的get()方法來(lái)逐個(gè)下載文件,也可以使用get_recursive()方法來(lái)遞歸下載文件夾。以下示例將遠(yuǎn)程服務(wù)器的/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/')
七、異常處理和高級(jí)功能
在實(shí)際操作過(guò)程中,可能會(huì)遇到各種異常,比如文件不存在、權(quán)限問(wèn)題等。因此,合理地處理異常是非常重要的。此外,在某些場(chǎng)景下,網(wǎng)絡(luò)不穩(wěn)定或者文件較大時(shí),斷點(diǎn)續(xù)傳和錯(cuò)誤重試功能就顯得尤為重要。
你可以通過(guò)設(shè)置put方法的resumable參數(shù)為T(mén)rue來(lái)實(shí)現(xiàn)斷點(diǎn)續(xù)傳(需要注意的是,Paramiko本身并不直接支持?jǐn)帱c(diǎn)續(xù)傳,這里僅作為一個(gè)可能的擴(kuò)展思路),并通過(guò)循環(huán)和異常處理來(lái)實(shí)現(xiàn)錯(cuò)誤重試。
以下是一個(gè)帶有錯(cuò)誤重試機(jī)制的上傳文件示例:
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é)
通過(guò)本文的指導(dǎo),你現(xiàn)在應(yīng)該能夠使用Python的Paramiko庫(kù)來(lái)創(chuàng)建遠(yuǎn)程文件目錄并上傳文件。這些技能不僅能夠提高你的工作效率,還能夠讓你在自動(dòng)化運(yùn)維的道路上更進(jìn)一步。記得在實(shí)際操作中多加練習(xí),以便更好地掌握這些有用的工具。
此外,敏感信息如服務(wù)器地址、用戶(hù)名和密碼應(yīng)妥善保管,不應(yīng)在公開(kāi)場(chǎng)合泄露。
到此這篇關(guān)于Python Paramiko創(chuàng)建文件目錄并上傳文件詳解的文章就介紹到這了,更多相關(guān)Python Paramiko創(chuàng)建文件目錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python學(xué)習(xí)教程之Numpy和Pandas的使用
最近要對(duì)一系列數(shù)據(jù)做同比比較,需要用到numpy和pandas來(lái)計(jì)算,下面這篇文章主要給大家介紹了關(guān)于python學(xué)習(xí)教程之Numpy和Pandas使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒。2017-09-09python 利用jieba.analyse進(jìn)行 關(guān)鍵詞提取
這篇文章主要介紹了python 利用jieba.analyse進(jìn)行關(guān)鍵詞提取的方法,幫助大家更好的利用python,感興趣的朋友可以了解下2020-12-12python面向?qū)ο蟀鎸W(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python面向?qū)ο蟀鎸W(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06快速掌握python權(quán)限功能設(shè)計(jì)實(shí)戰(zhàn)指南
在處理權(quán)限控制時(shí),裝飾器能幫助我們以一種統(tǒng)一且簡(jiǎn)潔的方式管理不同用戶(hù)對(duì)系統(tǒng)資源的訪(fǎng)問(wèn)權(quán)限,本文將通過(guò)幾個(gè)簡(jiǎn)單的示例逐步展示如何利用Python裝飾器實(shí)現(xiàn)從基礎(chǔ)到復(fù)雜的權(quán)限控制功能2024-01-01python實(shí)現(xiàn)IOU計(jì)算案例
這篇文章主要介紹了python實(shí)現(xiàn)IOU計(jì)算案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python可視化神器pyecharts繪制折線(xiàn)圖詳情
這篇文章主要介紹了Python可視化神器pyecharts繪制折線(xiàn)圖詳情,折線(xiàn)圖和柱狀圖一樣是我們?nèi)粘?梢暬疃嗟囊粋€(gè)圖例,當(dāng)然它的優(yōu)勢(shì)和適用場(chǎng)景相信大家肯定不陌生,要想快速的得出趨勢(shì),抓住趨勢(shì)二字,就會(huì)很快的想到要用折線(xiàn)圖來(lái)表示了2022-07-07