標籤:直接 timeout miss set hosts 列印 int 上傳 代碼
用戶端實現有三種方式:
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遠端連線