Python Paramiko模組的使用

2021-07-22 21:09:39 字數 4867 閱讀 5339

windows下有很多非常好的ssh客戶端,比如putty。在python的世界裡,你可以使用原始套接字和一些加密函式建立自己的ssh客戶端或服務端,但如果有現成的模組,為什麼還要自己實現呢。使用paramiko庫中的pycrypto能夠讓你輕鬆使用ssh2協議。

paramiko的安裝方法網上有很多這樣的帖子,這裡就不描述了。這裡主要講如何使用它。paramiko實現ssh2不外乎從兩個角度實現:ssh客戶端與服務端。

首先讓我們理清以下幾個名詞:

具體請參考paramiko的庫文件:

ssh客戶端實現方案一,執行遠端命令

這個方案直接使用sshclient物件的exec_command()在服務端執行命令,下面是具體**:

#例項化sshclient

client = paramiko.sshclient()

#自動新增策略,儲存伺服器的主機名和金鑰資訊

client.set_missing_host_key_policy(paramiko.autoaddpolicy())

#連線ssh服務端,以使用者名稱和密碼進行認證

client.connect(ip,username=user,password=passwd)

#開啟乙個channel並執行命令

stdin,stdout,stderr = client.exec_command(command)

#列印執行結果

print stdout.readlines()

#關閉sshclient

client.close()

ssh客戶端實現方案二,執行遠端命令

這個方案是將sshclient建立連線的物件得到乙個transport物件,以transport物件的exec_command()在服務端執行命令,下面是具體**:

#例項化sshclient

client = paramiko.sshclient()

#自動新增策略,儲存伺服器的主機名和金鑰資訊

client.set_missing_host_key_policy(paramiko.autoaddpolicy())

#連線ssh服務端,以使用者名稱和密碼進行認證

client.connect(ip,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(1024)

client.close()

ssh服務端的實現

實現ssh服務端必須繼承serverinte***ce,並實現裡面相應的方法。具體**如下:

import socket

import sys

import threading

import paramiko

host_key = paramiko.rsakey(filename='private_key.key')

class

server

(paramiko.serverinte***ce):

def__init__

(self):

#執行start_server()方法首先會觸發event,如果返回成功,is_active返回true

self.event = threading.event()

#當is_active返回true,進入到認證階段

defcheck_auth_password

(self, username, password):

if (username == 'root') and (password == '123456'):

return paramiko.auth_successful

return paramiko.auth_failed

#當認證成功,client會請求開啟乙個channel

defcheck_channel_request

(self, kind, chanid):

if kind == 'session':

return paramiko.open_succeeded

#命令列接收ip與port

server = sys.argv[1]

ssh_port = int(sys.argv[2])

#建立socket

try:

sock = socket.socket(socket.af_inet, socket.sock_stream) #tcp socket

sock.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)

sock.bind((server, ssh_port))

sock.listen(100)

print

'[+] listening for connection ...'

client, addr = sock.accept()

except exception, e:

print

'[-] listen failed: ' + str(e)

sys.exit(1)

print

'[+] got a connection!'

try:

#用sock.accept()返回的socket例項化transport

bhsession = paramiko.transport(client)

#新增乙個rsa金鑰加密會話

bhsession.add_server_key(host_key)

server = server()

try:

#啟動ssh服務端

bhsession.start_server(server=server)

except paramiko.sshexception, x:

print

'[-] ssh negotiation failed'

chan = bhsession.accept(20)

print

'[+] authenticated!'

print chan.recv(1024)

chan.send("welcome to my ssh")

while

true:

try:

command = raw_input("enter command:").strip("\n")

if command != 'exit':

chan.send(command)

print chan.recv(1024) + '\n'

else:

chan.send('exit')

print

'exiting'

bhsession.close()

raise exception('exit')

except keyboardinterrupt:

bhsession.close()

except exception, e:

print

'[-] caught exception: ' + str(e)

try:

bhsession.close()

except:

pass

sys.exit(1)

使用sftp上傳檔案

import paramiko

#獲取transport例項

tran = paramiko.transport(("host_ip",22))

#連線ssh服務端

tran.connect(username = "username", password = "password")

#獲取sftp例項

sftp = paramiko.sftpclient.from_transport(tran)

#設定上傳的本地/遠端檔案路徑

localpath="/root/desktop/python/newnc.py"

remotepath="/tmp/newnc.py"

#執行上傳動作

sftp.put(localpath,remotepath)

tran.close()

import paramiko

#獲取sshclient例項

client = paramiko.sshclient()

client.set_missing_host_key_policy(paramiko.autoaddpolicy())

#連線ssh服務端

client.connect("host_ip",username="username",password="password")

#獲取transport例項

tran = client.get_transport()

#獲取sftp例項

sftp = paramiko.sftpclient.from_transport(tran)

remotepath='/tmp/newnc.py'

localpath='/root/desktop/newnc.py'

sftp.get(remotepath, localpath)

client.close()

python paramiko 各種錯誤

這個錯誤出現在伺服器接受連線但是ssh守護程序沒有及時響應的情況 預設是15s 要解決這個問題,需要將paramiko的響應等待時間調長。transport.py中def init 初始化函式中 how long seconds to wait for the ssh banner self.ban...

Python paramiko實現跳轉控制

通過ssh 的proxycommand,建立關係,用paramiko模組,呼叫proxycommand方法 一 通過一台跳板機免密 a主機 b跳板機 c主機 做好a免密登入b,b免密登入c a主機 ssh下新增檔案b private,內容為b的私鑰 a主機 ssh下增加config檔案,內容為 ho...

python paramiko 遠端操作linux

遠端執行linux命令等 paramiko import traceback import paramiko as param,time,re from scp import scpclient ssh param.sshclient ssh.set missing host key policy ...