舉個工作中常見的例子,現有這樣的需求:需要使用mac客戶端,遠程連接到Linux服務器,查看上面的文件大小,通常使用的方法是如下幾種:
如果需求又增加一條,要從服務器上下載文件,該怎麼辦? 那常用的辦法可能會是:
會發現一個共性,常見的解決方案,對遠程服務器必要的配置。那如果需要多幾十台或者幾百台Linux服務器進行一樣的操作呢? 這種執行效率必然低。
paramiko的誕生就可以很好解決上述問題。paramiko僅需要在本地上安裝python以及PyCrypto,對於連接多台服務器,進行復雜及重復的操作的操作特別有幫助。
paramiko是用python語言寫的一個第三方庫,支持加密認證的方式,遵循SSH2協議,可以進行遠程服務器的連接。
能夠跨平台運行的語言,支持多平台,如Linux、MacOS、Windows等。因此,如果需要使用SSH從一個平台連接到另外一個平台,進行一系列的操作時,paramiko是一個不錯的選擇。
安裝第三方庫,一般會使用pip命令行安裝。由於網絡原因,使用國內鏡像源會提升下載安裝速度。
pycrypto,由於paramiko模塊內部依賴pycrypto,所以先下載安裝pycrypto。
安裝命令如下:
pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com pycrypto
pip install -i https://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com paramiko
下面是三種使用paramiko連接到Linux服務器的代碼。
使用口令方式連接
代碼片段:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("123.56.xx.xx",22,"root", "口令")
#上面的第二行代碼的作用是允許連接不在know_hosts文件中的主機。
print(ssh.exec_command("ps"))
使用賬號 + 密碼方式連接
代碼片段:
import paramiko
t = paramiko.Transport(("127.0.0.1",22))
t.connect(username = "xxxx", password = "xxxxx")
print(t.sys.platform)
使用秘鑰連接,需要兩台機器互相提前信任。
客戶端的"id_rsa.pub"文件加入到被連接的服務器的"authorized_keys"文件中。
如果沒有的,需要手動創建,放到".ssh"文件目錄下。
代碼片段:
import paramiko
SSH_PRIVATE_KEY = '/Users/xinxi/.ssh/id_rsa' # 本地密鑰文件路徑
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
key = paramiko.RSAKey.from_private_key_file(SSH_PRIVATE_KEY)
ssh.connect(hostname='123.56.xx.xx', port=22, username='root', pkey=key)
我比較推薦用第三種方式,因為現在一般公司級測試環境服務器,運維部門是不提供服務器的密碼,會統一使用"跳板機"登陸服務器,所以只能使用秘鑰連接方式。
可以打印出當前目錄文件, exec_command中可以放"Linux命令"。
stdin, stdout, stderr = ssh.exec_command("ls")
# 獲取命令結果
result = stdout.read()
# 打印輸出
print(result.decode())
日常工作中,會切換到某個目錄下,再進行多個連續命令。
paramiko對於執行多條指令,需要使用;分割。
stdin, stdout, stderr = ssh.exec_command("cd /data;pwd;ls")
# 獲取命令結果
result = stdout.read()
# 打印輸出
print(result.decode())
獲取SFTP實例,調用put方法,本地文件和遠程文件。
# 獲取SFTP實例
sftp = paramiko.SFTPClient.from_transport(tran)
# 設置上傳的本地/遠程文件路徑
localpath = "/Users/xinxi/Desktop/scp_test.py"
remotepath = "/data/test1.py"
# 執行上傳動作
sftp.put(localpath, remotepath)
# 關閉鏈接
tran.close()
獲取SFTP實例,調用get方法,遠程文件和本地文件。
# 獲取SFTP實例
sftp = paramiko.SFTPClient.from_transport(tran)
# 設置上傳的本地/遠程文件路徑
localpath = "/Users/xinxi/Desktop/scp_test.py"
remotepath = "/data/test1.py"
# 執行下載動作
sftp.get(remotepath, localpath)
# 關閉鏈接
tran.close()
paramiko對於和多台服務器執行shell交互命令,是一個不錯的解決方案。另外在測試過程中經常會遇到需要將本地的自動化測試報告上傳到遠程服務器上,或者需要將服務器上的自動化測試報告拉到本地進行操作。
paramiko提供的易用性、便利性,極大提高工作效率~