鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站 一、paramiko模塊簡介 paramiko是一個用於做遠程式控制制的模塊,使用該模塊可以對遠程伺服器進行命令或文件操作,基於linux中的ssh服務 。paramiko是第三方模塊,需要我們單獨安裝。通過paramiko模塊,我們可以利用pyth ...
鏡像下載、功能變數名稱解析、時間同步請點擊 阿裡雲開源鏡像站
一、paramiko模塊簡介
paramiko是一個用於做遠程式控制制的模塊,使用該模塊可以對遠程伺服器進行命令或文件操作,基於linux中的ssh服務 。paramiko是第三方模塊,需要我們單獨安裝。通過paramiko模塊,我們可以利用python代碼程式實現對設備的遠程式控制制和文件傳輸等操作。博文實驗環境說明:
- 操作系統:centos7.6
- python版本:3.9.12
- pip版本:22.0.4
- paramiko版本:2.10.4
二、paramiko安裝步驟
1、下載並安裝python3
實驗環境安裝的是當前最新版python3.9.12。安裝方式可以參考博文linux之Centos7下安裝python3及pip3。
[root@s146 opt]# wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz
2、安裝paramiko
實驗pip方式安裝paramiko可以自動安裝相關依賴。
[root@s146 setuptools-62.1.0]# pip3 install paramiko
3、獲取paramiko模塊幫助
三、使用示例
1、基於用戶名和密碼的 sshclient 方式登錄示例
編寫程式代碼
[root@s146 scripts]# vim test1.py
程式代碼如下
# -*- coding: UTF-8 -*-
# This is a test about paramiko
# 實例化一個transport對象
import paramiko
ip = input("請輸入需要遠程的主機IP地址:")
uname = input("請輸入登錄用戶名:")
pword = input("請輸入登錄密碼:")
# 建立一個sshclient對象
ssh = paramiko.SSHClient()
# 允許將信任的主機自動加入到host_allow 列表,此方法必須放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 調用connect方法連接伺服器
ssh.connect(hostname=ip,port=22,username=uname,password=pword)
# 手動輸入待執行命令
mycmd = input("請輸入需要執行的命令:")
stdin,stdout,stderr = ssh.exec_command(mycmd)
# 直接執行指定命令
ssh.exec_command('cd /tmp/ && touch paramiko.txt && echo "吳紅勝到此一游" > paramiko.txt')
# 結果放到stdout中,如果有錯誤將放到stderr中
print(stdout.read().decode())
print(stderr.read().decode())
# 關閉連接
ssh.close()
執行命令測試
[root@s146 scripts]# python3 test1.py
如上圖,可以看到結果正常執行,命令執行結果可以正常接收。
遠端伺服器檢查執行情況
[root@s145 tmp]# cat paramiko.txt
吳紅勝到此一游
[root@s145 tmp]# ll
total 4
-rw-r–r-- 1 root root 22 Apr 27 15:46 paramiko.txt
…
2、基於用戶名和密碼的 transport 方式登錄示例
編寫程式代碼
[root@s146 scripts]# vim test2.py
# -*- coding: UTF-8 -*-
# This is a test about paramiko
import paramiko
# 實例化一個transport對象
trans = paramiko.Transport(('192.168.0.145', 22))
# 建立連接
trans.connect(username='root', password='123456')
# 將sshclient的對象的transport指定為以上的trans
ssh = paramiko.SSHClient()
ssh._transport = trans
# 執行命令,和傳統方法一樣
mycmd1 = input("請輸入需要執行的命令一:")
stdin,stdout,stderr = ssh.exec_command(mycmd1)
print(stdout.read().decode())
mycmd2 = input("請輸入需要執行的命令二:")
stdin,stdout,stderr = ssh.exec_command(mycmd2)
print(stdout.read().decode())
# 關閉連接
trans.close()
執行程式測試
[root@s146 scripts]# python3 test2.py
執行完成命令1後,交換視窗輸入命令2
四、QA
如上執行第二條命令,間隔時間太短會有如下報錯。
報錯信息
[root@s146 scripts]# python3 test2.py
/usr/local/python3/lib/python3.9/site-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated
“class”: algorithms.Blowfish,
請輸入需要執行的命令一:ls -l
total 4
-rw-------. 1 root root 1421 Dec 23 11:36 anaconda-ks.cfg
請輸入需要執行的命令二:ls -l
total 4
-rw-------. 1 root root 1421 Dec 23 11:36 anaconda-ks.cfg
Exception ignored in: <function BufferedFile.del at 0x7f9c0db51a60>
Traceback (most recent call last):
File “/usr/local/python3/lib/python3.9/site-packages/paramiko/file.py”, line 66, in del
File “/usr/local/python3/lib/python3.9/site-packages/paramiko/channel.py”, line 1392, in close
File “/usr/local/python3/lib/python3.9/site-packages/paramiko/channel.py”, line 991, in shutdown_write
File “/usr/local/python3/lib/python3.9/site-packages/paramiko/channel.py”, line 967, in shutdown
File “/usr/local/python3/lib/python3.9/site-packages/paramiko/transport.py”, line 1908, in _send_user_message
AttributeError: ‘NoneType’ object has no attribute ‘time’
報錯原因:上一條命令執行的通道還未關閉,等待關閉即可。
原文鏈接:https://blog.csdn.net/carefree2005/article/details/124582423