Python 進行 SSH 操作,實現本地與服務器的鏈接,進行文件的上傳和下載
2018年5月26日 19:03 閱讀 375 評論 7
我本地和服務器的連接一直使用的是 Xshell 5,而在與服務器進行文件操作的時候使用的是 Xshell 推薦安裝的一個工具 Xftp 5,然而,昨天自己想着從服務器下載備份好的的數據庫文件到本地的時候發現這個文件傳輸工具居然過期不能用了,好氣啊!於是沒辦法(機智如我)只好用 Python 來實現 SSH 的連接,順便從服務器批量下載一些文件,實現自動化。
項目介紹
SSH 使用的庫
首先需要介紹一個 Python 實現 SSH 連接的第三方庫,名字叫做 paramiko,經過一個短暫的熟悉,我發現這個庫基本可以實現 SSH 連接中的一些常用方法,具體使用可以去看一些教程或者官方文檔。
我還是比較喜歡從實際的應用出發來加深對一些新接觸的第三方庫的認知,所以有了這篇文章中涉及到的實際應用案例。
腳本思路
首先來介紹一下我這個簡單的自動化腳本做的事情(由於想實現的事情比較單一且固定,所以直接寫成了幾個函數,寫的比較隨意):
- 首先創建一個配置文件,用來存放登錄服務器的一些參數,例如服務器 host,端口 port,用戶名稱和密碼等。
- 讀取配置文件的信息,返回一個字典以備后續調用
- 使用 SSH 鏈接服務器,並且執行幾個 shell 命令,返回需要下載的文件的絕對地址列表
- 連接 SFTP 批量下載文件到本地
源碼解讀
源碼展示
# -*- coding: utf-8 -*-
import paramiko import os from configparser import ConfigParser # 讀取配置文件獲取服務器的登錄信息 def read_ini(): info = dict() cf = ConfigParser() cf.read('config.ini', encoding='utf-8') keys = cf.options('ssh') for each in keys: info[each] = cf.get('ssh', each) print(info) return info # 連接服務區並執行shell命令返回輸出結果 def ssh_test(host, port, username, password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務器 try: ssh.connect(hostname=host, port=port, username=username, password=password) except Exception as e: print(e) return # 設置一個內部函數,執行shell命令並返回輸出結果 def run_shell(cmd): ssh_in, ssh_out, ssh_error = ssh.exec_command(cmd) result = ssh_out.read() or ssh_error.read() return result.decode().strip() # 獲取指定文件夾的絕對地址 cmd_get_path = 'cd dbs;pwd' db_path = run_shell(cmd_get_path) # 獲取指定文件夾中文件的名稱,並跟上面得到的文件夾絕對地址組合起來 cmd_get_sqls = 'cd dbs;ls' sqls = run_shell(cmd_get_sqls) lis = ['{}/{}'.format(db_path, each) for each in sqls.split('\n')] print(lis) # 關閉連接 ssh.close() return lis # 鏈接服務器進行文件傳輸 def sftp_test(host, port, username, password, from_file, to_file): transport = paramiko.Transport((host, port)) try: transport.connect(username=