Python paramiko 模塊淺談與SSH主要功能模擬解析
疫情還沒(méi)結(jié)束,小編只能宅在家里,哪哪也去不了,今天突發(fā)奇想給大家分享一篇教程關(guān)于Python paramiko 模塊淺談與SSH主要功能模擬解析。
大家都知道,通過(guò)SSH服務(wù)可以遠(yuǎn)程連接到Linux服務(wù)器,查看上面的日志狀態(tài),批量配置遠(yuǎn)程服務(wù)器,文件上傳,文件下載等,Python的paramiko模塊同樣實(shí)現(xiàn)了這一功能。
首先我們需要安裝這一模塊,pycharm環(huán)境中如下操作
一,安裝paramiko模塊PyCharm→Preferences→Project:項(xiàng)目名→Project Interpreter
點(diǎn)擊箭頭所指加號(hào),在搜索框輸入選中,并安裝
完成后會(huì)在Project Interpreter中顯示,如上上圖
二, 基于用戶名和密碼的 sshclient 方式登錄import paramiko# 創(chuàng)建SSH對(duì)象ssh = paramiko.SSHClient()# 允許連接不在know_hosts文件中的主機(jī)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 連接服務(wù)器ssh.connect(hostname=’192.168.199.146’, port=22, username=’fishman’, password=’9’)# 執(zhí)行命令stdin, stdout, stderr = ssh.exec_command(’df’)# 獲取命令結(jié)果res,err = stdout.read(),stderr.read()result = res if res else errprint(result.decode())# 關(guān)閉連接ssh.close()
解析:首先導(dǎo)入模塊,然后創(chuàng)建一個(gè)SSH對(duì)象,然后通過(guò)命令連接遠(yuǎn)程機(jī)器,默認(rèn)端口是22,這里我連接的是192.168.199.146的機(jī)器,密碼為9,然后執(zhí)行df命令,獲取返回的結(jié)果如下
我們可以比較一下通過(guò)SSH得到的結(jié)果
基于SSHClient是傳統(tǒng)的連接服務(wù)器、執(zhí)行命令、關(guān)閉的一個(gè)操作,有時(shí)候需要登錄上服務(wù)器執(zhí)行多個(gè)操作,比如執(zhí)行命令、上傳/下載文件,上面方法則無(wú)法實(shí)現(xiàn),可以通過(guò)如下方式來(lái)操作
#SSHClient 封裝 Transportimport paramiko# 實(shí)例化一個(gè)transport對(duì)象transport = paramiko.Transport((’192.168.199.146’, 22))# 建立連接transport.connect(username=’fishman’, password=’9’)# 將sshclient的對(duì)象的transport指定為以上的transportssh = paramiko.SSHClient()ssh._transport = transport# 執(zhí)行命令,和傳統(tǒng)方法一樣stdin, stdout, stderr = ssh.exec_command(’df’)print (stdout.read().decode())# 關(guān)閉連接transport.close()四,基于公鑰密鑰連接4.1 SSH配置免密登陸
我們知道通過(guò)配置公鑰密鑰,可以實(shí)現(xiàn)SSH的免密登陸,比如現(xiàn)在連接fishman機(jī)器會(huì)提示我們輸入密碼,然后才能登陸
通過(guò)SSH原理與運(yùn)用中介紹,我們知道,要實(shí)現(xiàn)免密公鑰登陸,需要將我們自己機(jī)器的公鑰存儲(chǔ)在要登陸的遠(yuǎn)程主機(jī)上。登錄的時(shí)候,遠(yuǎn)程主機(jī)會(huì)向用戶發(fā)送一段隨機(jī)字符串,用戶用自己的私鑰加密后,再發(fā)回來(lái)。遠(yuǎn)程主機(jī)用事先儲(chǔ)存的公鑰進(jìn)行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。
首先我們生成自己的公鑰通過(guò)命令 ssh-keygen,這里會(huì)提示這個(gè)公鑰保存的文件路徑,默認(rèn)即可然后回車,這里由于我本地已經(jīng)有生成的公鑰,所以提示是否要覆蓋,我這里就不重寫了,如果本地沒(méi)有生成過(guò)繼續(xù)回車,提示要不要對(duì)私鑰設(shè)置口令(passphrase),如果擔(dān)心私鑰的安全,這里可以設(shè)置一個(gè)。默認(rèn)也可以直接回車
得到公鑰后一種方法是通過(guò)命令將公鑰直接傳到遠(yuǎn)程機(jī)器ssh-copy-id user@host,如我們登陸的機(jī)器:
ssh-copy-id fishman@192.168.199.146
另一種方法是進(jìn)入公鑰文件去復(fù)制,進(jìn)入.ssh/id_rsa.pub通過(guò)more或者cat復(fù)制公鑰
~ more .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyQ2GtkbKcFAP/kX/+65e91Q8EJ+twpyqjEBzlVmZ2mxy8Zw7b/AfeV60ehloCq7p521IGJaXWbr3bky7Jljc6x7cAZsRW7mZRPFelPYa5iJ4lIshU3RwhbTYW6RyrG+InF3ognJ7bggpPmJbWFxqqpZwdkEilpnv0+8b17frSbF1xaQQh57vDjG78xr0pys2MBzylqrs1RNiTcRz86zJT7SbujYY/bpiUB78w46CmRlwzHOk8Zg0hcegqSMHjboQyhkSX0xcFv2ZLHm5Gpfba3863M+62Q1r2U+QW5Ki1f3nsGwHWQIRuHNWldUzWKYRPsKJHVvwFwkYDG3sZZMWR ljf@meijiabaodeiMac.lan ~ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyQ2GtkbKcFAP/kX/+65e91Q8EJ+twpyqjEBzlVmZ2mxy8Zw7b/AfeV60ehloCq7p521IGJaXWbr3bky7Jljc6x7cAZsRW7mZRPFelPYa5iJ4lIshU3RwhbTYW6RyrG+InF3ognJ7bggpPmJbWFxqqpZwdkEilpnv0+8b17frSbF1xaQQh57vDjG78xr0pys2MBzylqrs1RNiTcRz86zJT7SbujYY/bpiUB78w46CmRlwzHOk8Zg0hcegqSMHjboQyhkSX0xcFv2ZLHm5Gpfba3863M+62Q1r2U+QW5Ki1f3nsGwHWQIRuHNWldUzWKYRPsKJHVvwFwkYDG3sZZMWR ljf@meijiabaodeiMac.lan ~
復(fù)制后,我們登陸遠(yuǎn)程機(jī)器,在目錄下.ssh文件夾中發(fā)現(xiàn)有以下文件,其中id_ras id_ras.pub保存該機(jī)器的公鑰私鑰,
know_hosts:ssh會(huì)把你每個(gè)你訪問(wèn)過(guò)計(jì)算機(jī)的公鑰(public key)都記錄在~/.ssh/known_hosts。當(dāng)下次訪問(wèn)相同計(jì)算機(jī)時(shí),OpenSSH會(huì)核對(duì)公鑰。如果公鑰不同,OpenSSH會(huì)發(fā)出警告, 避免你受到DNS Hijack之類的攻擊。
我們需要將剛才復(fù)制的我的公鑰保存到authorized_keys文件中
通過(guò)vi打開(kāi)編輯然后粘貼退出保存
此時(shí),我們退出登陸,然后重新登陸,發(fā)現(xiàn)就不需要輸入登陸密碼了,可以實(shí)現(xiàn)免密登陸,美滋滋。
另外我們要注意,.ssh目錄的權(quán)限為700,其下文件authorized_keys和私鑰的權(quán)限為600。否則會(huì)因?yàn)闄?quán)限問(wèn)題導(dǎo)致無(wú)法免密碼登錄
另外,將公鑰拷貝到服務(wù)器的~/.ssh/authorized_keys文件中方法有如下幾種:
1、將公鑰通過(guò)scp拷貝到服務(wù)器上,然后追加到~/.ssh/authorized_keys文件中,這種方式比較麻煩。scp -P 22 ~/.ssh/id_rsa.pub user@host:~/。
2、通過(guò)ssh-copy-id命令最簡(jiǎn)單,也是第一種方法,ssh-copy-id '-p22 user@host'即可,有時(shí)候user@host需要加引號(hào),前面寫-p端口號(hào)
3、可以通過(guò)cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host ‘cat >> ~/.ssh/authorized_keys’,這個(gè)也是比較常用的方法,因?yàn)榭梢愿亩丝谔?hào)。
4.2 基于公鑰密鑰的 SSHClient 方式登錄進(jìn)入路徑查看我本地id_rsa文件路徑
import paramikoprivate_key = paramiko.RSAKey.from_private_key_file(’/Users/ljf/.ssh/id_rsa’)# 創(chuàng)建SSH對(duì)象ssh = paramiko.SSHClient()# 允許連接不在know_hosts文件中的主機(jī)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 連接服務(wù)器ssh.connect(hostname=’192.168.199.146’, port=22, username=’fishman’, pkey=private_key)# 執(zhí)行命令stdin, stdout, stderr = ssh.exec_command(’df’)# 獲取命令結(jié)果res,err = stdout.read(),stderr.read()result = res if res else errprint(result.decode())# 關(guān)閉連接ssh.close()
同理。可以用transport封裝
import paramikoprivate_key = paramiko.RSAKey.from_private_key_file(’/Users/ljf/.ssh/id_rsa’)# 實(shí)例化一個(gè)transport對(duì)象transport = paramiko.Transport((’192.168.199.146’, 22))# 建立連接transport.connect(username=’fishman’, pkey=private_key)ssh = paramiko.SSHClient()ssh._transport = transportstdin, stdout, stderr = ssh.exec_command(’df’)# 獲取命令結(jié)果res,err = stdout.read(),stderr.read()result = res if res else errprint(result.decode())# 關(guān)閉連接ssh.close()
同理,可以直接根據(jù)私鑰字符串連接,首先在本地獲取私鑰字符串
➜ .ssh cat id_rsa -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAskNhrZGynBQD/5F//uuXvdUPBCfrcKcqoxAc5VZmdpscvGcO 2/wH3letHoZaAqu6edtSBiWl1m6925MuyZY3Ose3AGbEVu5mUTxXpT2GuYieJSLI VN0cIW02FukcqxviJxd6IJye24IKT5iW1hcaqqWcHZBIpaZ79PvG9e360mxdcWkE Iee7w4xu/Ma9KcrNjAc8paq7NUTYk3Ec/OsyU+0m7o2GP26YlAe/MOOgpkZcMxzp PGYNIXHoKkjB426EMoZEl9MXBb9mSx5uRqX22t/OtzPutkNa9lPkFuSotX957BsB 1kCEbhzVpXVM1imET7CiR1b8BcJGAxt7GWTFkQIDAQABAoIBAH54j7Q0yiMxkCSh dc3GF8H2htDMAZ3K+9T0eYu74LYFFj4UX9Zy2KJGUex2JSX/8CzEDU2PKDkaGFjP 80HR8R0i1BLU1jdWrAC2bvgszoiTBKAULU0IEg0lDlryyAQdpDVX0q2QcKQLfoU6 HMmHWsP2+ut+kgv0Mb19Y4rXbDwctmx53BJ0Ykk3RaQe8FiLOAAdFzxbGIUdIwLh N8PEh9HW/wMFvJVEAgNu3oD0bONH+PZKasxqnOQlHrILSPQrNiXBOxCYr9u8cFx7 hl1V0yhQHnCF+JK2se6VXQnJ1pUVtWc3kRTtwas3x7IRPdNJDbj8WT6/n6ocUm+Q OgEY9gECgYEA3CtYVABizz8GsHpged/xDkOKf9gET5m1kX/awdd3m6lkoWboB5OL ym6YwxWpl6Fs0XHRAih3w2434MyTxqdgZf5ixMgq00PBr7itGycokLm1KO1GFjbZ 4tog3qwX6vejHsDl+TMWojxmkEjwQ1uPcQOeY96CvOafHH+kP5zmfAUCgYEAz0Ym 1y07sSfiKSDEO+99r7deex8fssk/xcFI3PgD/4zwu0zGF3QIB124cbZX6Sy6ut0d jzX+RQm5OGUNR1m4Qg1syeNIEF/2mV0rL7+qPGIpYIsuoeuBwedNj7qTIDx4wKtm aJcwdErEQwRJ7UOX9KEdPkKivyf4A+uT5fCsJR0CgYBE7tFF46UMLDiE8pvYLLRF egIYCuM2pPKDLpuoSzToqL2YBycokBqZc80ib1rc3a67WL5OxarRpmWaXZL7BJaa +G2mHOHDqZgv00tnj/gUcAB3Yuqps9y+OPtHnGwUphoNW+nk/wjcHLsj+6I2BKnB gZeKvzUBvdcdTh13yUEknQKBgHBkmNEbPP/+IXutwdrCLYQnyXq30Mdwqzz/ZxQz BHABK9RUeCHlkCj2X/qBJsBQudxz5ABxBbTH5gC3gvDKrMhcYT5EGSKP9rcIt09H /faKP+eS8TFp882CMCOcxwS25b+L8ZcLTIHyvOOeIrweZ/qFlsbY+UjwUmNFzcfk rmPdAoGBAJ9NWhf16aLQxUrPkUvHK9k7ONUadamBxA6NNvHMZxow81/p9VQK71o7 iUdJmC/+VOvGqbA3AbtqkbjBMUWGjEeVKLxMnCZngfu9J6bnWDUaYbQz3gVY63ca KFWjRXO6GtynW0Dec0Nj/q22V5J+2ZCkIvSAQ+cI04d0Ij7RdKPl -----END RSA PRIVATE KEY----- ➜ .ssh
#!/usr/bin/env python # -*- coding: utf-8 -*- # 基于私鑰字符串進(jìn)行連接 import paramiko from io import StringIO key_str = '''-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAskNhrZGynBQD/5F//uuXvdUPBCfrcKcqoxAc5VZmdpscvGcO 2/wH3letHoZaAqu6edtSBiWl1m6925MuyZY3Ose3AGbEVu5mUTxXpT2GuYieJSLI VN0cIW02FukcqxviJxd6IJye24IKT5iW1hcaqqWcHZBIpaZ79PvG9e360mxdcWkE Iee7w4xu/Ma9KcrNjAc8paq7NUTYk3Ec/OsyU+0m7o2GP26YlAe/MOOgpkZcMxzp PGYNIXHoKkjB426EMoZEl9MXBb9mSx5uRqX22t/OtzPutkNa9lPkFuSotX957BsB 1kCEbhzVpXVM1imET7CiR1b8BcJGAxt7GWTFkQIDAQABAoIBAH54j7Q0yiMxkCSh dc3GF8H2htDMAZ3K+9T0eYu74LYFFj4UX9Zy2KJGUex2JSX/8CzEDU2PKDkaGFjP 80HR8R0i1BLU1jdWrAC2bvgszoiTBKAULU0IEg0lDlryyAQdpDVX0q2QcKQLfoU6 HMmHWsP2+ut+kgv0Mb19Y4rXbDwctmx53BJ0Ykk3RaQe8FiLOAAdFzxbGIUdIwLh N8PEh9HW/wMFvJVEAgNu3oD0bONH+PZKasxqnOQlHrILSPQrNiXBOxCYr9u8cFx7 hl1V0yhQHnCF+JK2se6VXQnJ1pUVtWc3kRTtwas3x7IRPdNJDbj8WT6/n6ocUm+Q OgEY9gECgYEA3CtYVABizz8GsHpged/xDkOKf9gET5m1kX/awdd3m6lkoWboB5OL ym6YwxWpl6Fs0XHRAih3w2434MyTxqdgZf5ixMgq00PBr7itGycokLm1KO1GFjbZ 4tog3qwX6vejHsDl+TMWojxmkEjwQ1uPcQOeY96CvOafHH+kP5zmfAUCgYEAz0Ym 1y07sSfiKSDEO+99r7deex8fssk/xcFI3PgD/4zwu0zGF3QIB124cbZX6Sy6ut0d jzX+RQm5OGUNR1m4Qg1syeNIEF/2mV0rL7+qPGIpYIsuoeuBwedNj7qTIDx4wKtm aJcwdErEQwRJ7UOX9KEdPkKivyf4A+uT5fCsJR0CgYBE7tFF46UMLDiE8pvYLLRF egIYCuM2pPKDLpuoSzToqL2YBycokBqZc80ib1rc3a67WL5OxarRpmWaXZL7BJaa +G2mHOHDqZgv00tnj/gUcAB3Yuqps9y+OPtHnGwUphoNW+nk/wjcHLsj+6I2BKnB gZeKvzUBvdcdTh13yUEknQKBgHBkmNEbPP/+IXutwdrCLYQnyXq30Mdwqzz/ZxQz BHABK9RUeCHlkCj2X/qBJsBQudxz5ABxBbTH5gC3gvDKrMhcYT5EGSKP9rcIt09H /faKP+eS8TFp882CMCOcxwS25b+L8ZcLTIHyvOOeIrweZ/qFlsbY+UjwUmNFzcfk rmPdAoGBAJ9NWhf16aLQxUrPkUvHK9k7ONUadamBxA6NNvHMZxow81/p9VQK71o7 iUdJmC/+VOvGqbA3AbtqkbjBMUWGjEeVKLxMnCZngfu9J6bnWDUaYbQz3gVY63ca KFWjRXO6GtynW0Dec0Nj/q22V5J+2ZCkIvSAQ+cI04d0Ij7RdKPl -----END RSA PRIVATE KEY-----''' private_key = paramiko.RSAKey(file_obj=StringIO(key_str)) transport = paramiko.Transport((’192.168.199.146’, 22)) transport.connect(username=’fishman’, pkey=private_key) ssh = paramiko.SSHClient() ssh._transport = transport stdin, stdout, stderr = ssh.exec_command(’df’) res,err = stdout.read(),stderr.read() result = res if res else err print(result.decode()) # 關(guān)閉連接 ssh.close()
以上得到的結(jié)果都相同
這里需要注意,如果你是Linux及OSX系統(tǒng),那么自帶SSH,以上操作都沒(méi)問(wèn)題,如果你是Windows,那么通過(guò)Xsheel也可以生成一個(gè),通過(guò)Xsheel--》工具--》新建用戶秘鑰生成向?qū)В?/p>
如果沒(méi)有裝Xsheel,可以將Linux的公鑰copy過(guò)來(lái),這樣在這里可以讀取本地存的公鑰信息
通過(guò)命令sz ~/.ssh/id_rsa,將公鑰保存為一個(gè)txt文件,paramiko.RSAKey.from_private_key_file(公鑰文件)
五,SFTPClient用于連接遠(yuǎn)程服務(wù)器并執(zhí)行上傳下載我們計(jì)劃將本地LocalFile.txt上傳到fishman機(jī)器的test路徑下remote.txt,這是該路徑下原來(lái)的文件,其中remote.txt為空,沒(méi)有內(nèi)容,通過(guò)sftp.put(’LocalFile.txt’, ’/home/fishman/test/remote.txt’)即可上傳
基于用戶名密碼上傳下載
import paramiko# 實(shí)例化一個(gè)trans對(duì)象# 實(shí)例化一個(gè)transport對(duì)象transport = paramiko.Transport((’192.168.199.146’, 22))# 建立連接transport.connect(username=’fishman’, password=’9’)# 實(shí)例化一個(gè) sftp對(duì)象,指定連接的通道sftp = paramiko.SFTPClient.from_transport(transport) # LocalFile.txt 上傳至服務(wù)器 /home/fishman/test/remote.txt# sftp.put(’LocalFile.txt’, ’/home/fishman/test/remote.txt’)# 將LinuxFile.txt 下載到本地 fromlinux.txt文件中sftp.get(’/home/fishman/test/LinuxFile.txt’, ’fromlinux.txt’)transport.close()
同理,我們可以下載遠(yuǎn)程機(jī)器上test路徑下的LinuxFile.txt文件到本地fromLinux.txt
基于公鑰密鑰上傳下載
import paramikoprivate_key = paramiko.RSAKey.from_private_key_file(’/Users/ljf/.ssh/id_rsa’)transport = paramiko.Transport((’192.168.199.146’, 22))transport.connect(username=’fishman’, password=’9’)sftp = paramiko.SFTPClient.from_transport(transport) # LocalFile.txt 上傳至服務(wù)器 /home/fishman/test/remote.txt# sftp.put(’LocalFile.txt’, ’/home/fishman/test/remote.txt’)# 將LinuxFile.txt 下載到本地 fromlinux.txt文件中sftp.get(’/home/fishman/test/LinuxFile.txt’, ’fromlinux.txt’) transport.close()
5 實(shí)現(xiàn)輸入命令立馬返回結(jié)果的功能 以上操作都是基本的連接,如果我們想實(shí)現(xiàn)一個(gè)類似xshell工具的功能,登錄以后可以輸入命令回車后就返回結(jié)果:
import paramikoimport osimport selectimport sys # 建立一個(gè)sockettrans = 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('rn**** EOF **** rn') break # 輸出到屏幕 sys.stdout.write(result.decode()) sys.stdout.flush() # 關(guān)閉通道channel.close()# 關(guān)閉鏈接trans.close()
6 支持tab自動(dòng)補(bǔ)全
import paramikoimport osimport selectimport sysimport ttyimport termios ’’’實(shí)現(xiàn)一個(gè)xshell登錄系統(tǒng)的效果,登錄到系統(tǒng)就不斷輸入命令同時(shí)返回結(jié)果支持自動(dòng)補(bǔ)全,直接調(diào)用服務(wù)器終端’’’# 建立一個(gè)sockettrans = 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('rn**** EOF **** rn') 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()
到此這篇關(guān)于Python paramiko 模塊詳解與SSH主要功能模擬的文章就介紹到這了,更多相關(guān)Python paramiko 模塊與SSH內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 完美解決vue 中多個(gè)echarts圖表自適應(yīng)的問(wèn)題2. SpringBoot+TestNG單元測(cè)試的實(shí)現(xiàn)3. vue實(shí)現(xiàn)web在線聊天功能4. idea配置jdk的操作方法5. Springboot 全局日期格式化處理的實(shí)現(xiàn)6. python 浮點(diǎn)數(shù)四舍五入需要注意的地方7. Docker容器如何更新打包并上傳到阿里云8. IntelliJ IDEA設(shè)置默認(rèn)瀏覽器的方法9. Java GZip 基于內(nèi)存實(shí)現(xiàn)壓縮和解壓的方法10. JAMon(Java Application Monitor)備忘記
