Python3 使用 paramiko、os、shutil庫實現自動下載服務器上的文件

方法一:使用 SFTP 絕對地址下載

  • 連接服務器並登錄,將代碼中的中文換成自己的服務器相關內容即可。
# Connect the server
print(">> Connecting the server......")
trans = paramiko.Transport(('服務器地址', 22))
trans.connect(username='root', password='服務器密碼')
sftp = paramiko.SFTPClient.from_transport(trans)

# Download files
print(">> Downloading the file......")
sftp.get('文件的絕對地址--含文件名', '保存到本地的文件名')
sftp.close()
  • 方法一簡單方便,普適性強。

方法二:執行語句切換目錄

# Connect the server
print(">> Connecting the server......")
trans = paramiko.Transport(('服務器地址', 22))
trans.connect(username='root', password='服務器密碼')
sftp = paramiko.SFTPClient.from_transport(trans)
# 實例化SSHClient
client = paramiko.SSHClient()
client._transport = transport
#stdout 爲正確輸出,stderr爲錯誤輸出,同時是有1個變量有值
stdin, stdout, stderr = client.exec_command("cd 文件所在目錄")
# 打印結果
print(stdout.read().decode('utf8'))
# Download files
print(">> Downloading the file......")
sftp.get('服務器上的文件名', '保存到本地的文件名')
sftp.close()
  • 方法二可以執行服務器語句並可以得到執行結果,相當於使用 ssh 遠程連接到服務器進行操作,可以多次並執行多樣的命令,可以有更多的用途。例如:
# 使用 && 執行多條命令
order0 = "cd / && "
order1 = "cd /usr/local/webserver/nginx/backend && "
order2 = "mkdir hello_world"
orders = order0 + order1 + order2
stdin, stdout, stderr = client.exec_command(orders)
print(stdout.read().decode('utf8'))

遇到的問題:

保存到本地指定路徑時,文件需要存入指定文件夾,因此使用 os 庫來創建以日期命名的文件夾並改變當前路徑

# make directory and change dir
today = time.strftime("%Y%m%d", time.localtime())
os.mkdir(today)
os.chdir(today)

但是,由於測試期間不是單詞運行,所以產生了 FileExistsError 即文件夾已存在。爲了防止服務器上存在同名文件夾(並且解決需要多次運行來更新當日數據的情況)代碼更改如下:

# make directory and change dir
try:
    os.mkdir(today)
except FileExistsError as err:
    print(">> Directory " + today + " has already been existed.")
    print(">> Deleting the existed %s......" % today)
    os.rmdir(today)
    print(">> Creating new %s......" % today)
    os.mkdir(today)
os.chdir(today)

結果報錯:刪除的目錄非空。
查詢資料得知,可以使用 Python 內置的 shutil 庫配合 os 庫刪除非空目錄:

# make directory and change dir
try:
    os.mkdir(today)
except FileExistsError as err:
    print(">> Directory " + today + " has already been existed.")
    print(">> Deleting the existed %s......" % today)
    shutil.rmtree(today)
    print(">> Creating new %s......" % today)
    os.mkdir(today)
os.chdir(today)

問題解決,成功。

發佈了13 篇原創文章 · 獲贊 0 · 訪問量 338
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章