1. 程式人生 > 程式設計 >Python如何使用paramiko模組連線linux

Python如何使用paramiko模組連線linux

python程式需要連線linux時,需要使用密碼或者祕鑰驗證以登入os進行命令操作或者檔案傳輸,python中實現此功能的模組為paramiko;下面是該模組的基礎用法

下面是通過密碼進行linux登入執行命令和檔案傳輸示例

import paramiko
#python程式需要批量管理linux時需要藉助paramilo模組登入linux執行命令或者傳輸檔案,下面是最簡單的登入主機執行命令
ssh_client = paramiko.SSHClient() #建立連線物件
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允許連線不在know_hosts檔案中的主機,首次登陸其它機器時會用到
ssh_client.connect(hostname="192.168.226.128",port=22,username="root",password="123456") #使用使用者名稱密碼連線主機
stdin,stdout,stderr = ssh_client.exec_command("df -h") #執行命令獲取結果
#獲取命令結果
res,err = stdout.read(),stderr.read()
result = res if res else err  ##這裡我們使用三元運算
print(result.decode(encoding="utf-8"))
ssh_client.close() #關閉ssh


#下面是傳輸檔案
transport = paramiko.Transport(("192.168.226.128",22))
transport.connect(username="root",password="123456")
my_sftp = paramiko.SFTPClient.from_transport(transport)
my_sftp.put("__init__.py","/root/123.tst") #__init__.py是本地檔名,其它目錄需要寫絕對路徑形式, /root/123.tst上傳到128的root目錄且命名為123.tst
my_sftp.get("/root/hello.py","hello_get.py") #將遠端的hello.py 下載到本地當前目錄且重新命名為hello_get.py
transport.close()

程式碼中出現明文密碼是不安全也不符合程式設計規範的,為了更加安全我們可使用祕鑰來進行登入。

首先兩臺linux機器進行如下操作後就可以實現192.168.226.128免密登入192.168.226.129

1、正常條件下128主機ssh連線129機器整個過程如下,需要資料密碼

Python如何使用paramiko模組連線linux

2、輸入ssh-keygen後,所有命令直接回車,在登入使用者家目錄下.ssh目錄下會生成id_rsa和id_rsa.pub兩個檔案,其中id_rsa是私鑰id_rsa.pub是公鑰

Python如何使用paramiko模組連線linux

3、ssh-copy-id命令可以將本地公鑰拷貝到129主機的root使用者家目錄下的authorized_keys檔案裡

Python如何使用paramiko模組連線linux

Python如何使用paramiko模組連線linux

3、此時128就可以免密登入129了,但是129不能免密登入128;如果需要則129需要進行與128相同的操作。可以免密是128的id_rsa與129對應使用者的authorized_keys檔案內的公鑰能夠校驗成功

Python如何使用paramiko模組連線linux

4、對應的如果當前只進行上述操作,此時win機器可以通過128的id_rsa實現免密登入129機器,具體實現如下

import paramiko
#python程式需要批量管理linux時需要藉助paramilo模組登入linux執行命令或者傳輸檔案,下面是最簡單的登入主機執行命令
private_key = paramiko.RSAKey.from_private_key_file("id_rsa")
ssh = paramiko.SSHClient() #建立連線物件
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #允許連線不在know_hosts檔案中的主機
ssh.connect(hostname="192.168.226.129",pkey=private_key) #使用使用者名稱密碼連線主機
stdin,stderr = ssh.exec_command("df -h") #執行命令獲取結果
#獲取命令結果
res,stderr.read()
result = res if res else err  ##這裡我們使用三元運算
print(result.decode(encoding="utf-8"))
ssh.close() #關閉ssh


#下面是傳輸檔案
transport = paramiko.Transport(("192.168.226.129",pkey=private_key)
my_sftp = paramiko.SFTPClient.from_transport(transport)
my_sftp.put("__init__.py","/root/123.tst")
my_sftp.get("/root/hello.py","hello_get129.py")
transport.close()

注意:

1、此時雖然有128的私鑰,但是無法免密登入128,登入時會報認證失敗,paramiko.ssh_exception.AuthenticationException: Authentication failed;此時還只能通過密碼登入128或者通過將129生成的公鑰拷貝給128使用129私鑰登入128。

2、不能使用128的公鑰來登入129,此時win機器模擬的是128免密登入129當然需要使用128的私鑰了,否則無法和129本地檔案內128的公鑰無法配對;使用公鑰登入129 會報不合法的私鑰檔案paramiko.ssh_exception.SSHException: not a valid RSA private key file

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。