1. 程式人生 > >python工具編寫之paramiko實現SSH遠程連接

python工具編寫之paramiko實現SSH遠程連接

編寫 range get missing dede 連接 and try 遠程

客戶端實現有三種方式:

1:用賬號密碼登陸

1.1直接使用SSHClient對象的exec_command()在服務端執行命令:

代碼實現:

import paramiko
import sys

def Usage():
print "[Usage]./SSH_Client.py ip port command"


try:
ip=sys.argv[1]
port=int(sys.argv[2])
command=sys.argv[3]
except:
Usage()


user="root"
passwd="root"
#實例化SSHClient
client=paramiko.SSHClient()
#自動添加策略,保存服務器的主機名和密鑰信息
#用ssh連接遠程主機時,第一次連接時會提示是否繼續進行遠程連接,選擇yes 這句話會自動選擇yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#連接SSH服務端,以用戶名和密碼進行認證
client.connect(ip,port,username=user,password=passwd)
#打開一個Channel 並執行命令
stdin,stdout,stderr=client.exec_command(command)
#打印執行結果 若有錯誤 stderr.read()就不為空
if stderr.read()=="":
for i in stdout.readlines():
print i
client.close()

1.2實例化SSHClient的對象再得到一個Transport對象,以Transport對象的exec_command()在服務端執行命令

import sys
import paramiko

def Usage():
print "[Usage]./SSH_Client.py ip port command"


try:
ip=sys.argv[1]
port=int(sys.argv[2])
command=sys.argv[3]
except:
Usage()

# reload(sys)
# sys.setdefaultencoding(‘utf-8‘)
user="root"
passwd="root"
#實例化SSHClient
client=paramiko.SSHClient()
#自動添加策略,保存服務器的主機名和密鑰信息
#用ssh連接遠程主機時,第一次連接時會提示是否繼續進行遠程連接,選擇yes 這句話會自動選擇yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#連接SSH服務端,以用戶名和密碼進行認證
client.connect(ip,port,username=user,password=passwd)
#實例化Transport 建立session會話
ssh_session=client.get_transport().open_session()
if ssh_session.active:
ssh_session.exec_command(command)
print ssh_session.recv(4096)
client.close()

2:用密鑰進行登陸

import paramiko
import sys

def Usage():
print "[Usage]./SSH_Client.py ip port command"


try:
ip=sys.argv[1]
port=int(sys.argv[2])
command=sys.argv[3]
except:
Usage()

user="root"

#實例化SSHClient
client=paramiko.SSHClient()
#指定用來解密的私鑰的路徑,需要手動生成
pkey_file = ‘/home/.ssh/id_rsa‘
#使用私鑰解密
key = paramiko.RSAKey.from_private_key_file(pkey_file)
#load_system_host_keys用於指定對方主機存放本機公鑰的位置,默認不加參數的話是將這個位置設置為~/.ssh/known_hosts
client.load_system_host_keys()
#自動添加策略,保存服務器的主機名和密鑰信息
#用ssh連接遠程主機時,第一次連接時會提示是否繼續進行遠程連接,選擇yes 這句話會自動選擇yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#連接SSH服務端,以用戶名和密碼進行認證
client.connect(ip,port,username=user,key_filename=key,timeout=6)
#打開一個Channel 並執行命令
stdin,stdout,stderr=client.exec_comment(command)
#打印執行結果 若有錯誤 stderr.read()就不為空
if stderr.read()=="":
print stdout.readlines()
client.close()

實現上傳下載:

import paramiko
#獲取Transport實例 參數為tuple
tran = paramiko.Transport(("192.168.72.130",22))
#連接SSH服務端
tran.connect(username ="root", password ="root")
#獲取SFTP實例
sftp = paramiko.SFTPClient.from_transport(tran)
#設置上傳的本地/遠程文件路徑
#執行上傳動作
sftp.put("C:/7.der","/tmp/7.der")
sftp.get(‘/root/test.py‘,‘F:/test.py‘)
tran.close()

實現過程中出現的問題:

import paramiko時出現UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe9 in position 0: ordinal not in range(128) 錯誤

解決辦法:在python 安裝路徑下Lib\site.py 添加如下代碼:

import sys

reload(sys)

sys.setdefaultencoding(‘gbk‘)

經過測試 設置編碼為utf-8還是導入不成功 設置為gbk可以成功導入

登陸所要的密鑰需要手動生成:可以參考

http://blog.sina.com.cn/s/blog_7ae2408501018xsj.html

http://blog.csdn.net/fdipzone/article/details/47327183

python工具編寫之paramiko實現SSH遠程連接