Python操作遠(yuǎn)程服務(wù)器 paramiko模塊詳細(xì)介紹
前言
paramiko模塊是基于Python實現(xiàn)的SSH遠(yuǎn)程安全連接,可以提供在遠(yuǎn)程服務(wù)器上執(zhí)行命令、上傳文件到服務(wù)器或者從指定服務(wù)器下載文件的功能。
paramiko模塊安裝方法
paramiko模塊不是python自帶的標(biāo)準(zhǔn)庫,需要自行下載安裝,建議使用pip自動安裝。方法如下:
(1)配置pip命令和鏡像源路徑。如果已配置,跳過。
(2)執(zhí)行pip install paramiko進(jìn)行安裝。出現(xiàn)successful字樣表示安裝完成。
paramiko常用函數(shù)介紹
SSHclient類
(1)ssh遠(yuǎn)程連接服務(wù)器,格式為:connect(hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, ...)。其中hostname表示主機(jī)IP,port表示ssh服務(wù)端口號,默認(rèn)是22,username和password表示登錄用戶名和密碼,timeout表示設(shè)置連接超時時長。
(2)遠(yuǎn)程主機(jī)沒有本地主機(jī)密鑰或HostKeys對象時的連接方法。格式為:set_missing_host_key_policy(policy)。其中policy
參數(shù)常見取值有3種,分別如下:
- AutoAddPolicy:自動添加主機(jī)名及主機(jī)密鑰到本地的known_hosts,不依賴load_system_host_key的配置。即新建立ssh連接時不需要再輸入yes或no進(jìn)行確認(rèn)。最為常用。
- WarningPolicy 用于記錄一個未知的主機(jī)密鑰的python警告。并接受,功能上和AutoAddPolicy類似,但是會提示是新連接。
- RejectPolicy 自動拒絕未知的主機(jī)名和密鑰,依賴load_system_host_key的配置。此為默認(rèn)選項
(3)遠(yuǎn)程執(zhí)行命令,函數(shù)格式:exec_command(command, bufsize=-1, timeout=None, get_pty=False, environment=None),該命令的輸入與輸出流為標(biāo)準(zhǔn)輸入、標(biāo)出輸出、標(biāo)準(zhǔn)錯誤輸出。
(4)在遠(yuǎn)程服務(wù)器上生成新的交互式shell。函數(shù)格式為:invoke_shell(term='vt100', width=80, height=24, width_pixels=0, height_pixels=0, environment=None)。
上述只是介紹了SSHclient類常用的幾個函數(shù)。SSHclient類函數(shù)詳細(xì)介紹參考SSHClient
SFTPClient類
(1)創(chuàng)建一個已連通的SFTP客戶端通道,格式為:from_transport(cls,t)
(2)將本地文件上傳到服務(wù)器,格式為:put(localpath, remotepath, callback=None, confirm=True)
(3)從服務(wù)器下載文件到本地,格式為:get(remotepath, localpath, callback=None)
(4)在服務(wù)器上創(chuàng)建目錄,格式為:mkdir()
(5)在服務(wù)器上刪除目錄,格式為:remove()
(6)在服務(wù)器上重命名目錄,格式為:rename()
(7) 查看服務(wù)器文件狀態(tài),格式為:stat()
(8)列出服務(wù)器目錄下的文件,格式為:listdir()
paramiko常用場景
(1)在遠(yuǎn)程服務(wù)器執(zhí)行命令,并獲取命執(zhí)行命令輸出結(jié)果
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!')
stdin, stdout, stderr = ssh.exec_command('df -k')
print stdout.read()
ssh.close()
(2)在遠(yuǎn)程服務(wù)器執(zhí)行命令,并獲取執(zhí)行命令的結(jié)果碼
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!')
stdin, stdout, stderr = ssh.exec_command('df -k')
channel = stdout.channel
ret = channel.recv_exit_status()
if ret == 0:
print stdout.read()
else:
print stderr.read()
(3)在遠(yuǎn)程服務(wù)器執(zhí)行命令,需要生成子進(jìn)程并交互執(zhí)行命令
import paramiko,time
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='192.168.0.1', port=22, username='root', password='Aa12345!')
interact = conn.invoke_shell()
stdin, stdout, stderr = ssh.exec_command('df -k')
interact = conn.invoke_shell()
interact.send("sed -i '/192.168.0.2/d' /root/.ssh/known_hosts" + '\n')
time.sleep(1)
interact.send('ssh root@172.16.128.2' + '\n')
time.sleep(2)
interact.send('yes' + '\n')
time.sleep(2)
interact.send('Aa12345!' + '\n')
time.sleep(2)
interact.send('df -k!' + '\n')
result = interact.recv(65535)
print result
(4)上傳文件到遠(yuǎn)程服務(wù)器
import paramiko
scp = paramiko.Transport(('192.168.0.1',22))
scp.connect(username='root',password='Aa12345!')
sftp=paramiko.SFTPClient.from_transport(scp)
local_path = "D:\\temp\\cc.txt"
remote_path = "/tmp/cc.txt"
sftp.put(local_path, remote_path)
scp.close()
(5)從遠(yuǎn)程服務(wù)器下載文件
import paramiko
scp = paramiko.Transport(('192.168.0.1',22))
scp.connect(username='root',password='Aa12345!')
sftp=paramiko.SFTPClient.from_transport(scp)
remote_path = "/tmp/aaaa.txt"
local_path = "D:\\temp\\aaaa.txt"
sftp.get(remote_path, local_path)
scp.close()
paramiko使用完整實例
import paramiko
def ssh_con(ip, username, password):
try:
con = paramiko.SSHClient()
con.set_missing_host_key_policy(paramiko.AutoAddPolicy())
con.connect(ip=ip, username=username, password=password, timeout=5)
except:
return None
else:
return con
def exec_cmd(conn, cmd):
interact = conn.invoke_shell()
interact.send(cmd)
result = interact.recv(65535)
return result
def exec_cmd2(conn,cmd):
stdin, stdout, stderr = conn.exec_command(cmd)
channel = stdout.channel
ret = channel.recv_exit_status()
if ret == 0:
return (ret, stdout.read())
else:
return (ret, stderr.read())
if __name__ == '__main__':
ip = '192.168.0.1'
user = 'root'
passwd = 'root'
con = ssh_con(ip, user, passwd)
if not con:
print "Connect %s fail,please check." % (ip,)
cmd = 'df -k'
ret, result = exec_cmd2(con,cmd)
print result
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程
這篇文章主要介紹了簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程,使用yield生成器函數(shù)進(jìn)行多進(jìn)程編程是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要知識,需要的朋友可以參考下2015-05-05
詳解Python如何實現(xiàn)Excel數(shù)據(jù)讀取和寫入
這篇文章主要為大家詳細(xì)介紹了python如何實現(xiàn)對EXCEL數(shù)據(jù)進(jìn)行讀取和寫入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
Python實現(xiàn)基于Fasttext的商品評論數(shù)據(jù)分類的操作流程
這篇文章主要介紹了Python實現(xiàn)基于Fasttext的商品評論數(shù)據(jù)分類,今天使用的fasttext更像是一個集成的庫,把向量化和分類一起做掉了,這個對于使用層面來講就更方便了一些,需要的朋友可以參考下2022-06-06
Python虛擬環(huán)境virtualenv是如何使用的
今天給大家?guī)淼氖顷P(guān)于Python虛擬環(huán)境的相關(guān)知識,文章圍繞著Python虛擬環(huán)境virtualenv是如何使用的展開,文中有非常詳細(xì)的解釋及代碼示例,需要的朋友可以參考下2021-06-06

