通過python模擬SSH

2021-10-24 05:43:28 字數 3395 閱讀 6842

通過python模擬ssh

from time import

*import paramiko

# 定義乙個類,表示一台遠端linux主機

class

linux

(object):

# 通過ip, 使用者名稱,密碼,超時時間初始化乙個遠端linux主機

def__init__

(self, ip, username, password, timeout=30)

: self.ip = ip

self.username = username

self.password = password

self.timeout = timeout

# transport和chanel

self.t =

'' self.chan =

''# 鏈結失敗的重試次數

self.try_times =

3# 呼叫該方法連線遠端主機

defconnect

(self)

:while

true

:# 連線過程中可能會丟擲異常,比如網路不通、鏈結超時

try:

self.t = paramiko.transport(sock=

(self.ip,22)

) self.t.connect(username=self.username, password=self.password)

self.chan = self.t.open_session(

) self.chan.settimeout(self.timeout)

self.chan.get_pty(

) self.chan.invoke_shell(

)# 如果沒有丟擲異常說明連線成功,直接返回

print

('連線%s成功'

% self.ip)

# 接收到的網路資料解碼為str

print

(self.chan.recv(

65535

).decode(

'utf-8'))

return

# 這裡不對可能的異常如socket.error, socket.timeout細化,直接一網打盡

except exception as e1:

if self.try_times !=0:

print

('連線%s失敗,進行重試'

% self.ip)

self.try_times -=

1else

:print

('重試3次失敗,結束程式'

) exit(1)

# 斷開連線

defclose

(self)

: self.chan.close(

) self.t.close(

)# 傳送要執行的命令

defsend

(self, cmd)

: cmd +=

'\r'

result =

''# 傳送要執行的命令

self.chan.send(cmd)

# 回顯很長的命令可能執行較久,通過迴圈分批次取回回顯,執行成功返回true,失敗返回false

while

true

: sleep(

0.5)

ret = self.chan.recv(

65535

) ret = ret.decode(

'utf-8'

) result += ret

return result

'''傳送檔案

@:param upload_files上傳檔案路徑 例如:/tmp/test.py

@:param upload_path 上傳到目標路徑 例如:/tmp/test_new.py

'''defupload_file

(self, upload_files, upload_path)

:try

: tran = paramiko.transport(sock=

(self.ip, self.port)

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

sftp = paramiko.sftpclient.from_transport(tran)

result = sftp.put(upload_files, upload_path)

return

true

if result else

false

except exception as ex:

print

(ex)

tran.close(

)finally

: tran.close(

)# 連線正常的情況

if __name__ ==

'__main__'

:# 此處需要修改, 傳入ip,使用者名稱,密碼

host = linux(

'192.168.1.103'

,'root'

,'******x'

) host.connect(

)# result = host.send('ls') # 傳送乙個檢視ip的命令

definput_cmd

(str):

return

input

(str

) tishi_msg =

"輸入命令:"

while

true

: msg =

input

(tishi_msg)

if msg ==

"exit"

:# 關閉程式,退出命令列

host.close(

)break

else

: res = host.send(msg)

data = res.replace(res.split(

"\n")[

-1],

"")tishi_msg = res.split(

"\n")[

-1]print

(res.split(

"\n")[

-1]+ data.strip(

"\n"

))

Python通過ssh連線MySQL

機器a 通過機器b 登入機器c的mysql import pymysql from sshtunnel import sshtunnelforwarder server sshtunnelforwarder ssh address or host 機器b的ip 22 指定ssh登入的跳轉機的addr...

通過python實現ssh遠端連線功能

python實現ssh功能是通過第三方庫 paramiko 實現的 因此首先安裝 paramiko pip install paramiko 如下 import paramiko ssh paramiko.sshclient s.set missing host key policy paramik...

python通過ssh連線伺服器,執行命令

import paramiko class linuxorder def init self,ip,port,username,password,timeout param ip 伺服器ip param port ssh 連線的埠 param username 伺服器使用者名稱 param pass...