婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識(shí)庫 > python 第三方庫paramiko的常用方式

python 第三方庫paramiko的常用方式

熱門標(biāo)簽:申請辦個(gè)400電話號(hào)碼 柳州正規(guī)電銷機(jī)器人收費(fèi) 深圳網(wǎng)絡(luò)外呼系統(tǒng)代理商 騰訊地圖標(biāo)注有什么版本 高德地圖標(biāo)注字母 400電話辦理費(fèi)用收費(fèi) 鎮(zhèn)江人工外呼系統(tǒng)供應(yīng)商 外呼系統(tǒng)前面有錄音播放嗎 千呼ai電話機(jī)器人免費(fèi)

介紹

paramiko是什么可以參考其他人的博客或文章,這里不再贅述,直入正題。

本次測試的版本信息如下:

  • python 3.9
  • paramiko 2.7.2
  • centos 8

三種常用方式

paramiko 的三種常用方式如下:

  • 使用密碼進(jìn)行登錄
  • 使用密鑰免密碼登錄
  • SFTP 傳輸文件

其中最割裂的就是SFTP 傳輸文件,很多文章登陸使用SSHClient類,傳輸文件使用Transport類,我也是這樣用了很長時(shí)間。

如果你也是這么用的,你沒有啥想法嗎?用python就是節(jié)約心智,怎么一個(gè)變形還能出來兩種東西呢,沒有辦法統(tǒng)一嗎?

網(wǎng)上的統(tǒng)一就是實(shí)例化Transport類然后實(shí)例化SSHClient類,再把實(shí)例化的Transport類添加到實(shí)例化SSHClient類。總是有一種別扭的感覺。

重點(diǎn):查看源碼可以發(fā)現(xiàn),SSHClient類直接提供了 SFTP 傳輸文件的實(shí)例化方法,直接用就行了,世界頓時(shí)清爽了很多

使用密碼進(jìn)行登錄

import paramiko

hostname = 'localhost'
port = 22
username = 'aaron'
# 看密碼就知道我是用的redhat系linux系統(tǒng)
password = 'redhat'

# 實(shí)例化SSHClient類
ssh = paramiko.SSHClient()
# 遠(yuǎn)程主機(jī)沒有本地密鑰時(shí)的處理規(guī)則,主要有三個(gè)
# AutoAddPolicy:直接建立連接,不進(jìn)行yes/no的確認(rèn)
# WarningPolicy:直接建立連接,但是會(huì)提示是新連接
# RejectPolicy:拒絕未知的連接,依賴系統(tǒng)密鑰的信息。默認(rèn)選項(xiàng)。
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 連接到服務(wù)器
ssh.connect(hostname, port, username, password)

# 執(zhí)行命令,獲取標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯(cuò)誤輸出,均為流式輸入輸出
# 函數(shù)原型為 exec_command(self, command, bufsize=-1, timeout=None, get_pty=False, environment=None, )
# 理論上可以通過標(biāo)準(zhǔn)輸入,也就是下面的額stdin變量完成連續(xù)輸入
# 同時(shí)參數(shù)中有布爾型參數(shù) get_pty 可以指定是否獲取 tty 通道,這樣阻塞輸入,比如sudo輸入密碼什么的都能做。貌似就可以做成你想要的任何東西。
# 但是以上兩點(diǎn)沒有驗(yàn)證,貌似比較麻煩,我太懶了-_-|||
#
# 另外,exec_command方法每次都是新開一個(gè)通道執(zhí)行命令,執(zhí)行完成后狀態(tài)消失。SSHClient類還提供一個(gè)invoke_shell方法,這個(gè)方法可以連續(xù)輸入命令。
# 這兩個(gè)的區(qū)別主要是 invoke_shell使用SSH shell通道,而exec_command使用SSH exec通道。
# shell通道就是常用的終端軟件登陸的通道,登陸變量都會(huì)進(jìn)行加載比如 ~/bashrc 等
# 而 exec通道 則不進(jìn)行加載登陸文件,相當(dāng)于linux桌面系統(tǒng)上右鍵開terminal一樣。
# 如果你還是不懂,沒關(guān)系,invoke_shell nb就完事了
stdin, stdout, stderr = ssh.exec_command('df')
# 打印輸出
print(stdout.read().decode())
# 不要忘記關(guān)閉連接
ssh.close()

使用密鑰免密碼登錄

這里使用密鑰文件,但是為了一般情況,我給密鑰文件設(shè)置了密碼,如果你只是想免密碼,不設(shè)置密碼即可.

在客戶機(jī)上生成密鑰對(duì),將公鑰傳遞給服務(wù)器

ssh-keygen -t rsa # 這里設(shè)置密碼為redhat_rsa,這里是給密鑰設(shè)置密碼,如果想免密,不設(shè)置密碼即可
ssh-copy-id -i ~/.ssh/id_rsa.pub aaron@localhost
import paramiko

hostname = 'localhost'
port = 22
username = 'aaron'
# 這里是密鑰文件的密碼
password = 'redhat_rsa'
# 密鑰文件的位置,可以是列表,paramiko會(huì)把列表里文件順序嘗試,登陸上位置
private_key_path = '/home/aaron/.ssh/id_rsa'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 這里網(wǎng)上很多先設(shè)置pkey傳入,但是直接傳文件路徑也可以,還簡單。
# 我使用的和網(wǎng)上不同,另一個(gè)版本請自行搜索,資料n多
# 如果沒有密鑰,則不需添加password
# look_for_keys默認(rèn)為True,就是會(huì)找你 .ssh 目錄下有沒有合適的密鑰文件
# 也就是說如果密鑰文件存在,但是你傳 key_filename 時(shí)傳錯(cuò)了,不影響,paramiko已經(jīng)替你想好了,這才是正經(jīng) python 應(yīng)有的待遇,舒服!
ssh.connect(hostname, port, username=username, password=password, key_filename=private_key_path, look_for_keys=False)

stdin, stdout, stderr = ssh.exec_command('ip a')
print(stdout.read().decode())
ssh.close()

SFTP 傳輸文件

import paramiko

hostname = 'localhost'
port = 22
username = 'aaron'
password = 'redhat'

# 還是SSHClient登陸,以上兩種方式都可以。
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname, port, username, password)

# 重頭戲,直接使用打開方法即可
sftp = ssh.open_sftp()

# do something
# 從這里到下面的ssh.close()為止都是sftp能做的事情,具體能做啥,請看下一個(gè)代碼段,這里只列舉上傳(put) 下載(get) 文件,這兩個(gè)也比較重要

# 回調(diào)函數(shù),沒想到吧,上傳下載還能有回調(diào)函數(shù)
# 參數(shù)一定,都是傳入的兩個(gè)size,int型數(shù)據(jù)
# size 已傳輸文件累計(jì)大小
# file_size 文件總大小
def callback(size, file_size):
 print(f"目前傳輸文件比例: {size} / {file_size}")

# 上傳文件,參數(shù)都給你們了,看看啥意思就行了
# 主要就是這個(gè)confirm, 如果定義會(huì)檢測一下上傳到服務(wù)器文件大小和本地大小是否一致,默認(rèn)False
stat = sftp.put(localpath='/tmp/s.avi', remotepath='/tmp/a.avi', callback=callback, confirm=True)
print(stat)

# 下載文件,同樣參數(shù)都給你們了,看看啥意思就行了
sftp.get(localpath='/tmp/s.avi', remotepath='/tmp/a.avi', callback=callback)

ssh.close()

stfp 能 do 的 something

# 列出當(dāng)前路徑下有什么文件,默認(rèn)path="."
print(sftp.listdir())

# 列出當(dāng)前路徑下文件屬性,默認(rèn)path="."
attrs = sftp.listdir_attr()
print(attrs)
print("="*20)
# listdir函數(shù)就是遍歷的每個(gè)屬性的filename
print(attrs[0].filename)
print(attrs[0].longname)
print(attrs[0].st_atime)
print(attrs[0].st_mtime)
print(attrs[0].st_gid)
print(attrs[0].st_uid)
print(attrs[0].st_mode)

# 就是 listdir_attr 的迭代器版本
attrs = sftp.listdir_iter()
print("="*20)
for i in attrs:
 print(i.filename)
 print(i.longname)
 print(i.st_atime)
 print(i.st_mtime)
 print(i.st_gid)
 print(i.st_uid)
 print(i.st_mode)

# 和內(nèi)置open用法基本相同,只不過是打開外部文件
with sftp.open("a.txt", "w") as f:
 f.write("aaa")

# 刪除文件,只能刪除文件,刪除目錄使用rmdir函數(shù)。文件不存在則報(bào)錯(cuò)。
sftp.remove("/home/aaron/a.txt")

# 文件改名,類似于move
sftp.rename("/home/aaron/as.txt", "/tmp/soon.txt",)

# 符合posix標(biāo)準(zhǔn)的改名,沒有測試
sftp.posix_rename("/home/aaron/as.txt", "/tmp/soon.txt",)

# 新建目錄
sftp.mkdir("/home/aaron/as")

# 刪除目錄,類似rmdir,刪除的必須為空目錄
sftp.rmdir("/home/aaron/as")

# 返回單個(gè)文件的attr信息,如果是軟連接則直接返回真實(shí)文件信息
stat = sftp.stat("/tmp/soon.txt")
print(stat)

# 測試和stat差不多,如果是軟鏈接則返回軟鏈接文件信息
stat = sftp.lstat("/tmp/soon.txt")
print(stat)

# 修改權(quán)限,權(quán)限為八進(jìn)制數(shù),需要把權(quán)限換算為十進(jìn)制數(shù)。比如下面的例子就是權(quán)限333
sftp.chmod("/tmp/soon.txt", 219)

# 修改屬主和屬組,屬主和屬組為gid和uid表示。需要有權(quán)限。
sftp.chown("/tmp/soon.txt", 0, 0)

# 設(shè)置atime和mtime,如果傳入None,則設(shè)置為當(dāng)前時(shí)間。否則必須傳入兩個(gè)元素的元組或數(shù)組,分別為 (atime, mtime)
sftp.utime("/tmp/soon.txt", None)
import time
sftp.utime("/tmp/soon.txt", (time.time(), time.time()))

# 讀取軟鏈接指定的目標(biāo)
print(sftp.readlink("/etc/rc.local"))

# 讀取軟連接制定目標(biāo)的絕對(duì)路徑
print(sftp.normalize("/etc/rc.local"))

# 切換工作路徑。SFTP沒有工作路徑的概念,但是paramiko進(jìn)行了模擬。如果設(shè)置了路徑,所有的相對(duì)路徑都是根據(jù)這個(gè)路徑來的。如果想要切換回去傳入None即可。
sftp.chdir("/tmp")

# 獲取當(dāng)前的工作路徑。如果沒有使用chdir切換過,則會(huì)返回None
print(sftp.getcwd())

terminal demo

自己一直想做一個(gè)類似xshell的東西,尤其是mac本的iterm或者iterm2是啥垃圾,還被吹的不行不行的,是沒用過好東西嗎。

但是每次執(zhí)行exec_command都會(huì)從家目錄開始,無法切換目錄,十分不方便。一直沒有啥進(jìn)展,知道遇到了 invoke_shell ,一切看起來都有了些可能。

import time
from threading import Thread

import paramiko


# 接收消息并打印的函數(shù)
# 返回的消息會(huì)分成好幾段,如果只是發(fā)送命令后直接打印是打印不全的,這里直接循環(huán)檢測緩沖區(qū),有結(jié)果就打印。
def recv_and_print(channel):
 # 定義全局變量,recv_func_flag 此接收函數(shù)退出標(biāo)志,cmd 當(dāng)前執(zhí)行命令
 global recv_func_flag, cmd
 while recv_func_flag:
 # 如果此次命令是exit并且退出完成,則設(shè)置退出標(biāo)志
 if cmd == "exit" and channel.exit_status_ready():
  # 打印退出狀態(tài),為int型數(shù)字
  print(f"此次退出狀態(tài):{channel.recv_exit_status()}")
  # 退出標(biāo)志置為假
  recv_func_flag = False
 # 吐過緩沖區(qū)有數(shù)據(jù)
 if channel.recv_ready():
  # 接收數(shù)據(jù)
  response = channel.recv(1024).decode().strip()
  # 需要注意的是接收的數(shù)據(jù)會(huì)把傳入的命令也返回一遍,這里我們只保留自己打在屏幕上的,不要傳回的,所以傳回的數(shù)據(jù)如果和命令相同則不打印,略過
  if response != cmd:
  print(response, end="")

 print("接收函數(shù)退出......")


# 定義全局變量
recv_func_flag = True
cmd = ""

# ssh登陸,老一套東西
hostname = 'localhost'
port = 22
username = 'aaron'
password = 'redhat010;'

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname, port, username, password)

# 獲取invoke_shell
invoke_shell = ssh.invoke_shell()
# 接收函數(shù)使用另一個(gè)線程運(yùn)行,因?yàn)楹彤?dāng)前主線程一同退出,所以不需要join方法
t = Thread(target=recv_and_print, args=(invoke_shell,))
t.start()

# 主線程退出標(biāo)志
flag = True
while flag:
 # 輸入命令
 cmd = input()
 # 輸入命令必須有回車才會(huì)執(zhí)行,這里我發(fā)送的是linux命令,\r之后能執(zhí)行命令,如果系統(tǒng)不同,需要測試\r\n等回車字符
 invoke_shell.send(f"{cmd}\r")
 # 如果命令是exit則退出循環(huán)
 if cmd == "exit":
 flag = False

# 檢測接收函數(shù)已經(jīng)退出,這里停止0.5s是因?yàn)橥顺雒畎l(fā)送給服務(wù)器,服務(wù)器會(huì)返回注銷的信息,之后檢測接收函數(shù)才會(huì)完全退出,認(rèn)為設(shè)置了一個(gè)等待時(shí)間,這個(gè)時(shí)間因?yàn)槭潜緳C(jī),設(shè)置的相對(duì)不長,如果是其他主機(jī),需要根據(jù)網(wǎng)絡(luò)以及超時(shí)情況進(jìn)行設(shè)置
while recv_func_flag:
 time.sleep(0.5)

# 別忘了關(guān)閉ssh
ssh.close()

這個(gè)demo直接運(yùn)行然后輸入命令即可,就像是使用terminal直接登陸一樣。

ll等定義的alias也是能使用的。

但是雙擊tab ctrl+c 等沒有實(shí)現(xiàn),留待諸君完善吧

這個(gè)demo目前還有一些問題。時(shí)間原因也懶得解決了,以后用到的時(shí)候再深入探究吧。

  • 換行總是有問題,時(shí)好時(shí)壞,感覺每次發(fā)送數(shù)據(jù)有時(shí)命令、結(jié)果、信息提示符有時(shí)合并發(fā)送,有時(shí)分開發(fā)送,沒有啥必然規(guī)律。也許和linux發(fā)行版有關(guān)?和tcp通信有關(guān)?目前原因不明(具體現(xiàn)象請自行測試)
  • 顯示信息使用了 print(response, end="") 退出時(shí)也使用相同的顯示命令,到時(shí)系統(tǒng)注銷的顯示信息和函數(shù)的提示信息"接收函數(shù)退出......"拼接在一起了(對(duì)啊,提示信息之前我可以加個(gè)回車啊,哎呀,不再測試了,太累了)
  • su命令也可以正常執(zhí)行,輸入密碼啥的不影響,但是密碼會(huì)明文顯示。。。。。
  • 接上條,su退出成問題,su退出使用exit,整個(gè)函數(shù)就退出了。算了,不修復(fù)了/-_-\

到此這篇關(guān)于python 第三方庫paramiko的文章就介紹到這了,更多相關(guān)python 第三方庫paramiko內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python標(biāo)準(zhǔn)庫與第三方庫詳解
  • Python新手學(xué)習(xí)標(biāo)準(zhǔn)庫模塊命名
  • Python標(biāo)準(zhǔn)庫:內(nèi)置函數(shù)max(iterable, *[, key, default])說明
  • Python3標(biāo)準(zhǔn)庫之threading進(jìn)程中管理并發(fā)操作方法
  • Python3標(biāo)準(zhǔn)庫之dbm UNIX鍵-值數(shù)據(jù)庫問題
  • 淺析python標(biāo)準(zhǔn)庫中的glob
  • Python第三方庫安裝緩慢的解決方法
  • 使用豆瓣源來安裝python中的第三方庫方法
  • Python基礎(chǔ)之標(biāo)準(zhǔn)庫和常用的第三方庫案例教程

標(biāo)簽:郴州 海南 合肥 烏蘭察布 平頂山 烏蘭察布 哈爾濱 大慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python 第三方庫paramiko的常用方式》,本文關(guān)鍵詞  python,第三方,庫,paramiko,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python 第三方庫paramiko的常用方式》相關(guān)的同類信息!
  • 本頁收集關(guān)于python 第三方庫paramiko的常用方式的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧洲精品在线观看| 九九精品一区二区| 亚洲天堂精品视频| 国产日产亚洲精品系列| 欧美成人三级电影在线| 欧美成人官网二区| 欧美精品一区二区在线观看| 亚洲精品一区二区三区影院| 精品动漫一区二区三区在线观看| 久久综合久久综合亚洲| 久久精品人人做人人爽人人| 久久久久久综合| 亚洲国产精品传媒在线观看| 中文字幕+乱码+中文字幕一区| 国产偷国产偷精品高清尤物| 国产女同互慰高潮91漫画| 国产精品视频一二三| 亚洲欧美中日韩| 亚洲在线一区二区三区| 亚洲国产精品人人做人人爽| 亚洲va国产天堂va久久en| 日韩av一区二区三区四区| 美女视频黄a大片欧美| 激情综合一区二区三区| 成人小视频免费观看| 色呦呦一区二区三区| 欧美日韩日日摸| 欧美不卡一区二区三区四区| 2021国产精品久久精品| 最新日韩av在线| 日精品一区二区| 成人中文字幕在线| 欧美麻豆精品久久久久久| 久久女同性恋中文字幕| 一区二区视频在线| 精品一区二区日韩| www.66久久| 日韩精品一区二区三区在线观看| 久久久久久麻豆| 亚洲午夜国产一区99re久久| 精品亚洲成a人| 91网站最新地址| 精品国产伦一区二区三区观看体验| 国产精品久久久久一区| 蜜臀久久99精品久久久久宅男| 成人黄色电影在线| 欧美一区二视频| 亚洲美女电影在线| 国产.欧美.日韩| 日韩欧美在线网站| 亚洲成人一区在线| www.亚洲在线| 国产午夜久久久久| 青青草原综合久久大伊人精品优势| 国产精品1024久久| 日韩欧美第一区| 性欧美大战久久久久久久久| 成人激情小说乱人伦| 精品福利一区二区三区免费视频| 亚洲一区二区偷拍精品| 成人国产精品免费观看| 国产日产亚洲精品系列| 国产一区二区精品久久99| 91精品国产综合久久久久久久| 亚洲色图欧美激情| 波多野结衣在线一区| 久久综合av免费| 精品一区免费av| 日韩精品一区二区三区视频播放 | 色综合天天狠狠| 日韩精品最新网址| 丝袜美腿亚洲一区| 欧美三级视频在线| 亚洲一区二区三区不卡国产欧美| 91丨九色丨蝌蚪丨老版| 亚洲欧洲美洲综合色网| 不卡电影一区二区三区| 中文字幕不卡一区| 99re这里只有精品视频首页| 国产精品污www在线观看| 国产成人亚洲综合a∨婷婷图片| 精品国产三级电影在线观看| 韩国精品一区二区| 精品88久久久久88久久久| 国产一区二区按摩在线观看| 精品99一区二区| 国产一区在线观看视频| 2023国产精华国产精品| 国产黑丝在线一区二区三区| 欧美激情资源网| 福利视频网站一区二区三区| 亚洲视频在线观看三级| 色狠狠色狠狠综合| 日本中文字幕不卡| 国产午夜精品理论片a级大结局 | 亚洲欧洲国产日韩| 91官网在线观看| 图片区日韩欧美亚洲| 9191成人精品久久| 国产一区二区福利视频| 国产精品免费人成网站| 在线观看日韩一区| 久久精品99国产精品| 综合网在线视频| 欧美一区二区三区在线看| 国产乱一区二区| 亚洲黄网站在线观看| 欧美一卡2卡三卡4卡5免费| 国产成人在线免费| 亚洲最新视频在线播放| 欧美精品一区二区不卡 | 日韩女优av电影| 国产精品77777竹菊影视小说| 亚洲色图视频网站| 精品国产人成亚洲区| 色久综合一二码| 国产黄人亚洲片| 日韩不卡一二三区| 亚洲女同ⅹxx女同tv| 久久综合九色综合97_久久久| 欧洲激情一区二区| 成人免费看黄yyy456| 免费人成在线不卡| 亚洲综合激情另类小说区| 欧美精品一区二区三区蜜臀 | 青娱乐精品在线视频| 亚洲日本乱码在线观看| 久久久影院官网| 欧美日韩高清一区二区三区| 成人免费视频网站在线观看| 天堂久久久久va久久久久| 亚洲精选视频在线| 亚洲国产精品黑人久久久| 精品动漫一区二区三区在线观看| 欧美无砖砖区免费| 日本高清不卡一区| 91看片淫黄大片一级在线观看| 国产精品一区二区无线| 免费不卡在线视频| 日韩高清在线一区| 五月综合激情日本mⅴ| 一区二区三区91| 亚洲日本va午夜在线电影| 国产夜色精品一区二区av| 欧美一区二区三区视频在线| 色天使久久综合网天天| 99久久国产综合精品色伊| 国产成人av在线影院| 精品一二三四区| 激情综合色播激情啊| 老司机精品视频一区二区三区| 依依成人综合视频| 午夜亚洲国产au精品一区二区| 亚洲综合一区二区| 亚洲在线观看免费| 亚洲不卡一区二区三区| 亚洲宅男天堂在线观看无病毒| 亚洲人成网站色在线观看| 亚洲欧洲日产国码二区| 夜夜嗨av一区二区三区网页| 亚洲一级二级在线| 日本在线不卡视频一二三区| 老司机免费视频一区二区三区| 久久99精品久久久久久国产越南| 另类调教123区| 国产成人丝袜美腿| 91蜜桃免费观看视频| 欧美午夜精品理论片a级按摩| 欧美乱妇15p| 精品处破学生在线二十三| 国产精品第五页| 亚洲第一激情av| 国产一区二区久久| 97国产一区二区| 9191久久久久久久久久久| 久久蜜桃av一区精品变态类天堂 | 91亚洲精品久久久蜜桃网站| 欧美亚洲日本国产| 精品嫩草影院久久| 日韩美女视频一区二区| 香蕉成人伊视频在线观看| 狠狠色丁香婷综合久久| 成人性视频免费网站| 欧美浪妇xxxx高跟鞋交| 国产欧美一区二区在线观看| 一级中文字幕一区二区| 麻豆视频观看网址久久| 成人三级伦理片| 欧美一区二区在线看| 欧美国产日韩在线观看| 亚洲.国产.中文慕字在线| 福利一区二区在线| 欧美精品在欧美一区二区少妇| 欧美精品一区二区三区蜜桃| 亚洲精品视频自拍| 国产suv精品一区二区883| 91精品婷婷国产综合久久性色| 国产日韩欧美一区二区三区乱码| 一区二区欧美视频| 国产91在线|亚洲|