成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

python 第三方庫paramiko的常用方式

瀏覽:161日期:2022-06-27 13:55:10
介紹

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

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

python 3.9 paramiko 2.7.2 centos 8三種常用方式

paramiko 的三種常用方式如下:

使用密碼進行登錄 使用密鑰免密碼登錄 SFTP 傳輸文件

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

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

網上的統一就是實例化Transport類然后實例化SSHClient類,再把實例化的Transport類添加到實例化SSHClient類。總是有一種別扭的感覺。

重點:查看源碼可以發現,SSHClient類直接提供了 SFTP 傳輸文件的實例化方法,直接用就行了,世界頓時清爽了很多

使用密碼進行登錄

import paramikohostname = ’localhost’port = 22username = ’aaron’# 看密碼就知道我是用的redhat系linux系統password = ’redhat’# 實例化SSHClient類ssh = paramiko.SSHClient()# 遠程主機沒有本地密鑰時的處理規則,主要有三個# AutoAddPolicy:直接建立連接,不進行yes/no的確認# WarningPolicy:直接建立連接,但是會提示是新連接# RejectPolicy:拒絕未知的連接,依賴系統密鑰的信息。默認選項。ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 連接到服務器ssh.connect(hostname, port, username, password)# 執行命令,獲取標準輸入、標準輸出、標準錯誤輸出,均為流式輸入輸出# 函數原型為 exec_command(self, command, bufsize=-1, timeout=None, get_pty=False, environment=None, )# 理論上可以通過標準輸入,也就是下面的額stdin變量完成連續輸入# 同時參數中有布爾型參數 get_pty 可以指定是否獲取 tty 通道,這樣阻塞輸入,比如sudo輸入密碼什么的都能做。貌似就可以做成你想要的任何東西。# 但是以上兩點沒有驗證,貌似比較麻煩,我太懶了-_-|||## 另外,exec_command方法每次都是新開一個通道執行命令,執行完成后狀態消失。SSHClient類還提供一個invoke_shell方法,這個方法可以連續輸入命令。# 這兩個的區別主要是 invoke_shell使用SSH shell通道,而exec_command使用SSH exec通道。# shell通道就是常用的終端軟件登陸的通道,登陸變量都會進行加載比如 ~/bashrc 等# 而 exec通道 則不進行加載登陸文件,相當于linux桌面系統上右鍵開terminal一樣。# 如果你還是不懂,沒關系,invoke_shell nb就完事了stdin, stdout, stderr = ssh.exec_command(’df’)# 打印輸出print(stdout.read().decode())# 不要忘記關閉連接ssh.close()使用密鑰免密碼登錄

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

在客戶機上生成密鑰對,將公鑰傳遞給服務器

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

import paramikohostname = ’localhost’port = 22username = ’aaron’# 這里是密鑰文件的密碼password = ’redhat_rsa’# 密鑰文件的位置,可以是列表,paramiko會把列表里文件順序嘗試,登陸上位置private_key_path = ’/home/aaron/.ssh/id_rsa’ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 這里網上很多先設置pkey傳入,但是直接傳文件路徑也可以,還簡單。# 我使用的和網上不同,另一個版本請自行搜索,資料n多# 如果沒有密鑰,則不需添加password# look_for_keys默認為True,就是會找你 .ssh 目錄下有沒有合適的密鑰文件# 也就是說如果密鑰文件存在,但是你傳 key_filename 時傳錯了,不影響,paramiko已經替你想好了,這才是正經 python 應有的待遇,舒服!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 paramikohostname = ’localhost’port = 22username = ’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能做的事情,具體能做啥,請看下一個代碼段,這里只列舉上傳(put) 下載(get) 文件,這兩個也比較重要# 回調函數,沒想到吧,上傳下載還能有回調函數# 參數一定,都是傳入的兩個size,int型數據# size 已傳輸文件累計大小# file_size 文件總大小def callback(size, file_size): print(f'目前傳輸文件比例: {size} / {file_size}')# 上傳文件,參數都給你們了,看看啥意思就行了# 主要就是這個confirm, 如果定義會檢測一下上傳到服務器文件大小和本地大小是否一致,默認Falsestat = sftp.put(localpath=’/tmp/s.avi’, remotepath=’/tmp/a.avi’, callback=callback, confirm=True)print(stat)# 下載文件,同樣參數都給你們了,看看啥意思就行了sftp.get(localpath=’/tmp/s.avi’, remotepath=’/tmp/a.avi’, callback=callback)ssh.close()

stfp 能 do 的 something

# 列出當前路徑下有什么文件,默認path='.'print(sftp.listdir())# 列出當前路徑下文件屬性,默認path='.'attrs = sftp.listdir_attr()print(attrs)print('='*20)# listdir函數就是遍歷的每個屬性的filenameprint(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)# 和內置open用法基本相同,只不過是打開外部文件with sftp.open('a.txt', 'w') as f: f.write('aaa')# 刪除文件,只能刪除文件,刪除目錄使用rmdir函數。文件不存在則報錯。sftp.remove('/home/aaron/a.txt')# 文件改名,類似于movesftp.rename('/home/aaron/as.txt', '/tmp/soon.txt',)# 符合posix標準的改名,沒有測試sftp.posix_rename('/home/aaron/as.txt', '/tmp/soon.txt',)# 新建目錄sftp.mkdir('/home/aaron/as')# 刪除目錄,類似rmdir,刪除的必須為空目錄sftp.rmdir('/home/aaron/as')# 返回單個文件的attr信息,如果是軟連接則直接返回真實文件信息stat = sftp.stat('/tmp/soon.txt')print(stat)# 測試和stat差不多,如果是軟鏈接則返回軟鏈接文件信息stat = sftp.lstat('/tmp/soon.txt')print(stat)# 修改權限,權限為八進制數,需要把權限換算為十進制數。比如下面的例子就是權限333sftp.chmod('/tmp/soon.txt', 219)# 修改屬主和屬組,屬主和屬組為gid和uid表示。需要有權限。sftp.chown('/tmp/soon.txt', 0, 0)# 設置atime和mtime,如果傳入None,則設置為當前時間。否則必須傳入兩個元素的元組或數組,分別為 (atime, mtime)sftp.utime('/tmp/soon.txt', None)import timesftp.utime('/tmp/soon.txt', (time.time(), time.time()))# 讀取軟鏈接指定的目標print(sftp.readlink('/etc/rc.local'))# 讀取軟連接制定目標的絕對路徑print(sftp.normalize('/etc/rc.local'))# 切換工作路徑。SFTP沒有工作路徑的概念,但是paramiko進行了模擬。如果設置了路徑,所有的相對路徑都是根據這個路徑來的。如果想要切換回去傳入None即可。sftp.chdir('/tmp')# 獲取當前的工作路徑。如果沒有使用chdir切換過,則會返回Noneprint(sftp.getcwd())terminal demo

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

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

import timefrom threading import Threadimport paramiko# 接收消息并打印的函數# 返回的消息會分成好幾段,如果只是發送命令后直接打印是打印不全的,這里直接循環檢測緩沖區,有結果就打印。def recv_and_print(channel): # 定義全局變量,recv_func_flag 此接收函數退出標志,cmd 當前執行命令 global recv_func_flag, cmd while recv_func_flag: # 如果此次命令是exit并且退出完成,則設置退出標志 if cmd == 'exit' and channel.exit_status_ready(): # 打印退出狀態,為int型數字 print(f'此次退出狀態:{channel.recv_exit_status()}') # 退出標志置為假 recv_func_flag = False # 吐過緩沖區有數據 if channel.recv_ready(): # 接收數據 response = channel.recv(1024).decode().strip() # 需要注意的是接收的數據會把傳入的命令也返回一遍,這里我們只保留自己打在屏幕上的,不要傳回的,所以傳回的數據如果和命令相同則不打印,略過 if response != cmd: print(response, end='') print('接收函數退出......')# 定義全局變量recv_func_flag = Truecmd = ''# ssh登陸,老一套東西hostname = ’localhost’port = 22username = ’aaron’password = ’redhat010;’ssh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname, port, username, password)# 獲取invoke_shellinvoke_shell = ssh.invoke_shell()# 接收函數使用另一個線程運行,因為和當前主線程一同退出,所以不需要join方法t = Thread(target=recv_and_print, args=(invoke_shell,))t.start()# 主線程退出標志flag = Truewhile flag: # 輸入命令 cmd = input() # 輸入命令必須有回車才會執行,這里我發送的是linux命令,r之后能執行命令,如果系統不同,需要測試rn等回車字符 invoke_shell.send(f'{cmd}r') # 如果命令是exit則退出循環 if cmd == 'exit': flag = False# 檢測接收函數已經退出,這里停止0.5s是因為退出命令發送給服務器,服務器會返回注銷的信息,之后檢測接收函數才會完全退出,認為設置了一個等待時間,這個時間因為是本機,設置的相對不長,如果是其他主機,需要根據網絡以及超時情況進行設置while recv_func_flag: time.sleep(0.5)# 別忘了關閉sshssh.close()

這個demo直接運行然后輸入命令即可,就像是使用terminal直接登陸一樣。

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

但是雙擊tab ctrl+c 等沒有實現,留待諸君完善吧

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

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

到此這篇關于python 第三方庫paramiko的文章就介紹到這了,更多相關python 第三方庫paramiko內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久国产精品毛片| 日韩精品一区国产麻豆| 欧美精品国产精品| 日韩在线卡一卡二| 国产亚洲欧洲| 国产农村妇女毛片精品久久麻豆| 国产精品一区二区久激情瑜伽| 色噜噜狠狠色综合中国| 一区二区三区美女| 亚洲黄色成人| 亚洲蜜桃精久久久久久久| 国产精品九九| 国产偷国产偷亚洲高清人白洁| 成人精品鲁一区一区二区| 91精品午夜视频| 国产精品伊人色| 欧美乱熟臀69xxxxxx| 老司机午夜精品99久久| 欧美亚洲国产一区在线观看网站| 日本美女视频一区二区| 免费在线亚洲| 一区二区三区在线免费视频| 欧美日韩综合精品| 亚洲国产精品二十页| 国产在线精品二区| 国产精品免费丝袜| 亚洲承认在线| 亚洲一区二区三区精品在线| 午夜一级久久| 日本不卡在线视频| 日本韩国欧美在线| 免费在线观看成人| 欧美日韩一区二区三区在线看| 精品一区二区在线看| 7777精品伊人久久久大香线蕉最新版| 九九九精品视频| 欧美性色综合网| 国产在线国偷精品产拍免费yy| 欧美精品在线一区二区| 国产99一区视频免费| 欧美成人猛片aaaaaaa| 丁香婷婷综合激情五月色| 久久综合九色综合欧美就去吻| 欧美freesex交免费视频| 国产欧美一区二区在线观看| 国模精品一区二区三区| 亚洲精品视频一区| 亚洲欧美成人| 另类小说综合欧美亚洲| 欧美一区二区视频网站| 成人精品小蝌蚪| 久久久www成人免费毛片麻豆 | 欧美激情偷拍| 亚洲另类中文字| 日本二三区不卡| 国产福利精品一区二区| 久久久www免费人成精品| 日韩亚洲欧美精品| 日本三级韩国三级欧美三级| 欧美人成免费网站| 99在线精品免费| 亚洲色图都市小说| 欧美亚洲综合久久| 91在线视频在线| 亚洲一区二区三区四区在线免费观看| 欧美手机在线视频| 99r国产精品| 亚洲人被黑人高潮完整版| 久久免费黄色| 懂色av一区二区三区蜜臀| 中文字幕在线观看不卡| 色吧成人激情小说| av亚洲精华国产精华精华 | 欧美亚州韩日在线看免费版国语版| 国产精品自在在线| 日本一区二区三区高清不卡| 国产精品三上| 国产成人精品亚洲日本在线桃色 | 女人天堂亚洲aⅴ在线观看| 亚洲欧美日韩中文播放| 欧美色精品天天在线观看视频| 99riav一区二区三区| 亚洲成人精品影院| 欧美一级理论性理论a| 亚洲国产欧美不卡在线观看| 日本中文字幕一区| 欧美不卡一区二区三区四区| 99re热精品| 国产一区二区在线电影| 国产精品久久久久久久浪潮网站| 久久久久中文| 本田岬高潮一区二区三区| 一区二区三区成人| 日韩三级在线免费观看| 国产精品一国产精品k频道56| 国产麻豆精品久久一二三| 中文字幕精品—区二区四季| 久久久蜜桃一区二区人| 国产91色综合久久免费分享| 欧美日韩色一区| 久久综合丝袜日本网| 伊人久久成人| 国产自产视频一区二区三区| 国产精品电影一区二区| 91成人免费在线| 欧美精品大片| 麻豆成人在线观看| 国产精品国产自产拍高清av| 欧美视频完全免费看| 极品av少妇一区二区| 国产一区二区三区蝌蚪| 1024成人网色www| 日韩午夜精品电影| 香蕉国产精品偷在线观看不卡| 国产iv一区二区三区| 亚洲精品你懂的| 91精品国产91综合久久蜜臀| 国产一区成人| 91色在线porny| 精品一区二区三区视频| 国产精品久久久久久亚洲毛片| 在线播放国产精品二区一二区四区| 黄色国产精品| 粉嫩绯色av一区二区在线观看| 亚洲va欧美va国产va天堂影院| 国产婷婷色一区二区三区| 欧美日韩性生活| 国产日韩免费| 欧美福利一区二区三区| 国产综合色在线视频区| 亚洲高清中文字幕| 久久先锋影音av| 在线视频亚洲一区| 影音先锋亚洲电影| 成人一二三区视频| 视频一区免费在线观看| 国产精品久线观看视频| 欧美r级电影在线观看| 欧美综合天天夜夜久久| 亚洲国产欧美国产综合一区| 99久久99久久精品国产片果冻| 精品无人码麻豆乱码1区2区 | 欧美连裤袜在线视频| 久久精品二区亚洲w码| 一区二区三区蜜桃| 中文字幕免费观看一区| 日韩欧美国产wwwww| 欧美偷拍一区二区| 美女视频一区免费观看| 在线欧美亚洲| 国产精品啊啊啊| 99re在线精品| 不卡的av在线播放| 国产·精品毛片| 国产一区二区不卡在线| 奇米影视一区二区三区小说| 亚洲一区二区视频在线| 亚洲人成影院在线观看| 2024国产精品| 日韩精品一区二区三区在线播放 | 国产精品资源在线看| 免费日韩伦理电影| 同产精品九九九| 亚洲一区二区在线免费观看视频| 一区二区中文视频| 中文字幕不卡的av| 久久久99精品久久| 日韩免费电影网站| 欧美一区二区二区| 在线不卡免费欧美| 欧美精品乱人伦久久久久久| 91电影在线观看| 久久激情视频| 香蕉av777xxx色综合一区| 国产精品一区在线观看| 国产日韩一区二区三区| 99香蕉国产精品偷在线观看 | 一区二区日韩av| 一区二区视频在线| 国产精品电影一区二区| 国产精品国产三级国产aⅴ无密码| 欧美国产视频在线| 国产欧美日韩亚州综合 | 欧美国产精品中文字幕| 国产婷婷一区二区| 国产欧美一区二区在线观看| 久久免费美女视频| 26uuu亚洲综合色欧美| 久久综合色综合88| 精品少妇一区二区三区免费观看 | 精品日韩在线观看| 精品久久久久久最新网址| 欧美精品一区二区三区久久久| 精品99一区二区| 亚洲国产成人私人影院tom| 中文字幕不卡在线观看| 一区免费观看视频| 亚洲一区二三区| 美洲天堂一区二卡三卡四卡视频| 久久精品免费看|