python之ssh連接


paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連接。跟常用軟件xshell 、xftp功能一樣,但是可以連接多台服務器,進行復雜的操作。

paramiko是一個第三方模塊,使用之前需要先安裝pip install paramiko

paramiko主要包含核心組件,一個是SSHClient類,另一個是SFTPClient類

一、SSHClient類的主要函數:

1、Connect方法

Connect實現了遠程SSH的連接並校驗。

Connect(self,hostname,port,username,password,pkey,key_filename,timeout,allow_agent,look_for_keys ,compress)

參數含義:

Hostname  str :主機ip

Port  int :端口

Username  str:用戶名

Password  str :密碼

Pkey  pkey: 秘鑰

Timeout  float: 超時時間

Allow_agent  boool :當為flase時,禁用連到ssh代理

Look_for_keys  bool : flase時,禁用在~/.ssh中搜索秘鑰文件

Compress    bool : true時打開壓縮。

2、exec_command方法

遠程命令執行的方法

exec_command(self,command,bufsize=-1)

參數:

Command  str :命令串

Bufsize  int:文件緩沖區大小,默認-1沒有限制

3、load_system_host_keys

加載本地公秘鑰校驗文件,默認為~/.ssh/known_hosts

 load_system_host_keys(self,filename)

fielname  str :制定遠程主機公鑰記錄文件

4、set_missing_host_key_policy

連接主機沒有本地主機秘鑰或者HostKeys對象時策略,目前支持三種:AutoAddPolicy,RejectPolicy,WarningPolicy

AutoAddPolicy:自動添加主機名以及主機秘鑰

RejectPolicy(默認):自動拒絕未知的主機名和秘鑰

WarningPolicy: 用於記錄一個未知主機秘鑰的Python警告

ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
簡單實例

1 基於用戶名和密碼的 sshclient 方式登錄

# 建立一個sshclient對象
ssh = paramiko.SSHClient()
# 允許將信任的主機自動加入到host_allow 列表,此方法必須放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 調用connect方法連接服務器
ssh.connect(hostname='192.168.2.129', port=22, username='super', password='super')
# 執行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 結果放到stdout中,如果有錯誤將放到stderr中
print(stdout.read().decode())
# 關閉連接
ssh.close()
2 基於用戶名和密碼的 transport 方式登錄
方法1是傳統的連接服務器、執行命令、關閉的一個操作,有時候需要登錄上服務器執行多個操作,比如執行命令、上傳/下載文件,方法1則無法實現,可以通過如下方式來操作

# 實例化一個transport對象
trans = paramiko.Transport(('192.168.2.129', 22))
# 建立連接
trans.connect(username='super', password='super')

# 將sshclient的對象的transport指定為以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
# 執行命令,和傳統方法一樣
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 關閉連接
trans.close()

3 基於公鑰密鑰的 SSHClient 方式登錄

# 指定本地的RSA私鑰文件,如果建立密鑰對時設置的有密碼,password為設定的密碼,如無不用指定password參數
pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
# 建立連接
ssh = paramiko.SSHClient()
ssh.connect(hostname='192.168.2.129',
port=22,
username='super',
pkey=pkey)
# 執行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 結果放到stdout中,如果有錯誤將放到stderr中
print(stdout.read().decode())
# 關閉連接
ssh.close()
以上需要確保被訪問的服務器對應用戶.ssh目錄下有authorized_keys文件,也就是將服務器上生成的公鑰文件保存為authorized_keys。並將私鑰文件作為paramiko的登陸密鑰
4 基於密鑰的 Transport 方式登錄

# 指定本地的RSA私鑰文件,如果建立密鑰對時設置的有密碼,password為設定的密碼,如無不用指定password參數
pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
# 建立連接
trans = paramiko.Transport(('192.168.2.129', 22))
trans.connect(username='super', pkey=pkey)

# 將sshclient的對象的transport指定為以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans

# 執行命令,和傳統方法一樣
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())

# 關閉連接
trans.close()
二、SFTPClient類——實現遠程操作文件

1、from_transport方法

創建一個已經連通的sftp客戶端通道

2、put函數

上傳文件到服務器

Put(self,localpath,remotepath,callback=none,confirm=none)

Localpath  str : 上傳文件本地源

Remotepath  str : 遠程路徑

Callback(function(int,int)) 獲取已經接受的字節數以及總傳輸字節數。

Confirm  bool : 文件上傳完畢后是否調用start()函數,以便確認文件大小。

3、get方法

從遠程主機端下載文件同put

4、其他方法

Mkdir 創建目錄 sftp.mkdr(‘/home/user’,0755)

Remove 刪除主機端指定目錄 sftp.remove(‘/home/user’)

Rename 從命名服務端的文件或者目錄 sftp.rename(“/home/test.sh”,”/home/newtest.sh”)

Listdir  獲取遠程SFTP服務器端指定的目錄列表,返回list形式  sftp.listdir(“/home”)

Stat 獲取遠程主機指定文件信息 sftp.stat(“/home/test.sh”)

簡單案例:

基於用戶名密碼上傳下載:


1 import paramiko
2
3 transport = paramiko.Transport(('hostname',22))
4 transport.connect(username='wupeiqi',password='123')
5
6 sftp = paramiko.SFTPClient.from_transport(transport)
7 # 將location.py 上傳至服務器 /tmp/test.py
8 sftp.put('/tmp/location.py', '/tmp/test.py')
9 # 將remove_path 下載到本地 local_path
10 sftp.get('remove_path', 'local_path')
11
12 transport.close()

基於公鑰密鑰上傳下載:


1 import paramiko
2
3 private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
4
5 transport = paramiko.Transport(('hostname', 22))
6 transport.connect(username='wupeiqi', pkey=private_key )
7
8 sftp = paramiko.SFTPClient.from_transport(transport)
9 # 將location.py 上傳至服務器 /tmp/test.py
10 sftp.put('/tmp/location.py', '/tmp/test.py')
11 # 將remove_path 下載到本地 local_path
12 sftp.get('remove_path', 'local_path')
13
14 transport.close()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM