1. 程式人生 > >paramiko封裝成文件時踩坑

paramiko封裝成文件時踩坑

hostname 查看 一個 ror pass 2.0 import iss ssh

今天把paramiko使用封裝成一個文件,存儲到基本功能模塊中遇到一個坑,發現一個規律,為了後面不再踩這個坑,所以趕緊記錄下來。

首先我通過網上搜索,獲取使用paramiko的基本方法,代碼如下

import paramiko

#創建SSH對象
ssh = paramiko.SSHClient()
#允許不在know_host文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#連接服務器
ssh.connect(hostname=‘172.0.0.1‘,port=22,username=‘root‘,password=‘123456‘)
#獲取命令結果
stdin,stdout,stderr = ssh.exec_command(‘df -h‘)
print(stdout.read().decode()) #輸出結果
print(stderr.read().decode()) #輸出錯誤結果
ssh.close()

經過調試,代碼執行ok。

然後對這部分代碼進行封裝:

首先在公共包中建立文件paramiko.py文件,然後創建類,在類中創建方法,代碼如下:

class myParamiko():
#鏈接遠程服務器,執行命令操作
def con_oper_df(self,cnHostname=‘127.0.0.1‘,cnPort=22,cnUsername=‘root‘,cnPassword=‘123456‘):
#創建SSH對象
ssh = paramiko.SSHClient()
#允許不在know_host文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(cnHostname,cnPort,cnUsername,cnPassword)
stdin,stdout,stderr = ssh.exec_command(‘docker ps -a‘)
print(stdout.read().decode())
print(stderr.read().decode())
ssh.close()

if __name__ == ‘__main__‘:
myP = myParamiko()
myP.con_oper_df(cnHostname=‘172.0.0.1‘,cnPort=22,cnUsername=‘root‘,cnPassword=‘123456‘)

這代碼進行調試後,一直提示AttributeError: module ‘paramiko‘ has no attribute ‘SSHClient‘

但是查看paramiko中是有屬性SSHClient的,非常奇怪,再回去原來調試代碼的文件試試是ok的,然後把上面封裝時寫的代碼拷貝到原來的文件進行調試,發現也是ok的,那麽為什麽在封裝文件裏面調試不通過?

後面才發現封裝的文件名字paramiko.py和引入的文件名相同,會不會我引入時直接引入自己封裝的文件,而沒有引入類庫的文件呢? 有了猜想就去實踐,換個封裝文件名字,把內容拷貝進去進行調試,結果是ok的。

然後就發現了一個規律:我們自己封裝的文件名稱千萬不要跟類庫中需要引入的模塊名稱一致,否則問題就出來了。

paramiko封裝成文件時踩坑