Python paramiko模塊的使用示例
paramiko模塊提供了ssh及sft進(jìn)行遠(yuǎn)程登錄服務(wù)器執(zhí)行命令和上傳下載文件的功能。這是一個(gè)第三方的軟件包,使用之前需要安裝。
1 基于用戶名和密碼的 sshclient 方式登錄
# 建立一個(gè)sshclient對(duì)象
ssh = paramiko.SSHClient()
# 允許將信任的主機(jī)自動(dòng)加入到host_allow 列表,此方法必須放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 調(diào)用connect方法連接服務(wù)器
ssh.connect(hostname='192.168.2.129', port=22, username='super', password='super')
# 執(zhí)行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 結(jié)果放到stdout中,如果有錯(cuò)誤將放到stderr中
print(stdout.read().decode())
# 關(guān)閉連接
ssh.close()
2 基于用戶名和密碼的 transport 方式登錄
方法1是傳統(tǒng)的連接服務(wù)器、執(zhí)行命令、關(guān)閉的一個(gè)操作,有時(shí)候需要登錄上服務(wù)器執(zhí)行多個(gè)操作,比如執(zhí)行命令、上傳/下載文件,方法1則無(wú)法實(shí)現(xiàn),可以通過(guò)如下方式來(lái)操作
# 實(shí)例化一個(gè)transport對(duì)象
trans = paramiko.Transport(('192.168.2.129', 22))
# 建立連接
trans.connect(username='super', password='super')
# 將sshclient的對(duì)象的transport指定為以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
# 執(zhí)行命令,和傳統(tǒng)方法一樣
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())
# 關(guān)閉連接
trans.close()
3 基于公鑰密鑰的 SSHClient 方式登錄
# 指定本地的RSA私鑰文件,如果建立密鑰對(duì)時(shí)設(shè)置的有密碼,password為設(shè)定的密碼,如無(wú)不用指定password參數(shù)
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)
# 執(zhí)行命令
stdin, stdout, stderr = ssh.exec_command('df -hl')
# 結(jié)果放到stdout中,如果有錯(cuò)誤將放到stderr中
print(stdout.read().decode())
# 關(guān)閉連接
ssh.close()
以上需要確保被訪問(wèn)的服務(wù)器對(duì)應(yīng)用戶.ssh目錄下有authorized_keys文件,也就是將服務(wù)器上生成的公鑰文件保存為authorized_keys。并將私鑰文件作為paramiko的登陸密鑰
4 基于密鑰的 Transport 方式登錄
# 指定本地的RSA私鑰文件,如果建立密鑰對(duì)時(shí)設(shè)置的有密碼,password為設(shè)定的密碼,如無(wú)不用指定password參數(shù)
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的對(duì)象的transport指定為以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
# 執(zhí)行命令,和傳統(tǒng)方法一樣
stdin, stdout, stderr = ssh.exec_command('df -hl')
print(stdout.read().decode())
# 關(guān)閉連接
trans.close()
##### 傳文件 SFTP ###########
# 實(shí)例化一個(gè)trans對(duì)象# 實(shí)例化一個(gè)transport對(duì)象
trans = paramiko.Transport(('192.168.2.129', 22))
# 建立連接
trans.connect(username='super', password='super')
# 實(shí)例化一個(gè) sftp對(duì)象,指定連接的通道
sftp = paramiko.SFTPClient.from_transport(trans)
# 發(fā)送文件
sftp.put(localpath='/tmp/11.txt', remotepath='/tmp/22.txt')
# 下載文件
# sftp.get(remotepath, localpath)
trans.close()
5 實(shí)現(xiàn)輸入命令立馬返回結(jié)果的功能
以上操作都是基本的連接,如果我們想實(shí)現(xiàn)一個(gè)類似xshell工具的功能,登錄以后可以輸入命令回車后就返回結(jié)果:
import paramiko
import os
import select
import sys
# 建立一個(gè)socket
trans = paramiko.Transport(('192.168.2.129', 22))
# 啟動(dòng)一個(gè)客戶端
trans.start_client()
# 如果使用rsa密鑰登錄的話
'''
default_key_file = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
prikey = paramiko.RSAKey.from_private_key_file(default_key_file)
trans.auth_publickey(username='super', key=prikey)
'''
# 如果使用用戶名和密碼登錄
trans.auth_password(username='super', password='super')
# 打開(kāi)一個(gè)通道
channel = trans.open_session()
# 獲取終端
channel.get_pty()
# 激活終端,這樣就可以登錄到終端了,就和我們用類似于xshell登錄系統(tǒng)一樣
channel.invoke_shell()
# 下面就可以執(zhí)行你所有的操作,用select實(shí)現(xiàn)
# 對(duì)輸入終端sys.stdin和 通道進(jìn)行監(jiān)控,
# 當(dāng)用戶在終端輸入命令后,將命令交給channel通道,這個(gè)時(shí)候sys.stdin就發(fā)生變化,select就可以感知
# channel的發(fā)送命令、獲取結(jié)果過(guò)程其實(shí)就是一個(gè)socket的發(fā)送和接受信息的過(guò)程
while True:
readlist, writelist, errlist = select.select([channel, sys.stdin,], [], [])
# 如果是用戶輸入命令了,sys.stdin發(fā)生變化
if sys.stdin in readlist:
# 獲取輸入的內(nèi)容
input_cmd = sys.stdin.read(1)
# 將命令發(fā)送給服務(wù)器
channel.sendall(input_cmd)
# 服務(wù)器返回了結(jié)果,channel通道接受到結(jié)果,發(fā)生變化 select感知到
if channel in readlist:
# 獲取結(jié)果
result = channel.recv(1024)
# 斷開(kāi)連接后退出
if len(result) == 0:
print("\r\n**** EOF **** \r\n")
break
# 輸出到屏幕
sys.stdout.write(result.decode())
sys.stdout.flush()
# 關(guān)閉通道
channel.close()
# 關(guān)閉鏈接
trans.close()
6 支持tab自動(dòng)補(bǔ)全
import paramiko
import os
import select
import sys
import tty
import termios
'''
實(shí)現(xiàn)一個(gè)xshell登錄系統(tǒng)的效果,登錄到系統(tǒng)就不斷輸入命令同時(shí)返回結(jié)果
支持自動(dòng)補(bǔ)全,直接調(diào)用服務(wù)器終端
'''
# 建立一個(gè)socket
trans = paramiko.Transport(('192.168.2.129', 22))
# 啟動(dòng)一個(gè)客戶端
trans.start_client()
# 如果使用rsa密鑰登錄的話
'''
default_key_file = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
prikey = paramiko.RSAKey.from_private_key_file(default_key_file)
trans.auth_publickey(username='super', key=prikey)
'''
# 如果使用用戶名和密碼登錄
trans.auth_password(username='super', password='super')
# 打開(kāi)一個(gè)通道
channel = trans.open_session()
# 獲取終端
channel.get_pty()
# 激活終端,這樣就可以登錄到終端了,就和我們用類似于xshell登錄系統(tǒng)一樣
channel.invoke_shell()
# 獲取原操作終端屬性
oldtty = termios.tcgetattr(sys.stdin)
try:
# 將現(xiàn)在的操作終端屬性設(shè)置為服務(wù)器上的原生終端屬性,可以支持tab了
tty.setraw(sys.stdin)
channel.settimeout(0)
while True:
readlist, writelist, errlist = select.select([channel, sys.stdin,], [], [])
# 如果是用戶輸入命令了,sys.stdin發(fā)生變化
if sys.stdin in readlist:
# 獲取輸入的內(nèi)容,輸入一個(gè)字符發(fā)送1個(gè)字符
input_cmd = sys.stdin.read(1)
# 將命令發(fā)送給服務(wù)器
channel.sendall(input_cmd)
# 服務(wù)器返回了結(jié)果,channel通道接受到結(jié)果,發(fā)生變化 select感知到
if channel in readlist:
# 獲取結(jié)果
result = channel.recv(1024)
# 斷開(kāi)連接后退出
if len(result) == 0:
print("\r\n**** EOF **** \r\n")
break
# 輸出到屏幕
sys.stdout.write(result.decode())
sys.stdout.flush()
finally:
# 執(zhí)行完后將現(xiàn)在的終端屬性恢復(fù)為原操作終端屬性
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
# 關(guān)閉通道
channel.close()
# 關(guān)閉鏈接
trans.close()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 解決Python paramiko 模塊遠(yuǎn)程執(zhí)行ssh 命令 nohup 不生效的問(wèn)題
- 使用Python paramiko模塊利用多線程實(shí)現(xiàn)ssh并發(fā)執(zhí)行操作
- Python paramiko模塊使用解析(實(shí)現(xiàn)ssh)
- Python操作遠(yuǎn)程服務(wù)器 paramiko模塊詳細(xì)介紹
- python使用paramiko模塊通過(guò)ssh2協(xié)議對(duì)交換機(jī)進(jìn)行配置的方法
- Python Paramiko模塊的使用實(shí)際案例
- python的paramiko模塊基本用法詳解
相關(guān)文章
Python中用format函數(shù)格式化字符串的用法
這篇文章主要介紹了Python中用format函數(shù)格式化字符串的用法,格式化字符串是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),本文主要針對(duì)Python2.7.x版本,需要的朋友可以參考下2015-04-04
使用Python實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)相關(guān)操作詳解
這篇文章主要介紹了使用Python實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)相關(guān)操作詳解,pymysql是Python中操作數(shù)據(jù)庫(kù)的第三方模塊,通過(guò)這個(gè)模塊的相關(guān)方法,我們可以連接并且去操作mysql數(shù)據(jù)庫(kù),需要的朋友可以參考下2023-08-08
教你怎么用python selenium實(shí)現(xiàn)自動(dòng)化測(cè)試
今天帶大家學(xué)習(xí)怎么用python selenium實(shí)現(xiàn)自動(dòng)化測(cè)試,文中有非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
基于python實(shí)現(xiàn)模擬數(shù)據(jù)結(jié)構(gòu)模型
這篇文章主要介紹了基于python實(shí)現(xiàn)模擬數(shù)據(jù)結(jié)構(gòu)模型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
python+openCV利用攝像頭實(shí)現(xiàn)人員活動(dòng)檢測(cè)
這篇文章主要為大家詳細(xì)介紹了python+openCV利用攝像頭實(shí)現(xiàn)人員活動(dòng)檢測(cè),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
Python的地形三維可視化Matplotlib和gdal使用實(shí)例
這篇文章主要介紹了Python的地形三維可視化Matplotlib和gdal使用實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12
python創(chuàng)造虛擬環(huán)境方法總結(jié)
在本篇內(nèi)容里我們給大家整理了關(guān)于python創(chuàng)造虛擬環(huán)境的詳細(xì)方法和步驟,需要的朋友們學(xué)習(xí)下。2019-03-03

