Python 實現ssh客戶端(連線遠端伺服器)

2022-03-08 10:52:24 字數 4352 閱讀 9735

ssh客戶端實現方案一,遠端執行命令(密碼認證)

# -*- coding:utf-8 -*-

import paramiko # 先安裝pycrypto,再安裝paramiko

# 建立ssh物件

ssh = paramiko.sshclient()

# 允許連線不在~/.ssh/known_hosts檔案中的主機

ssh.set_missing_host_key_policy(paramiko.autoaddpolicy())

# 連線伺服器

ssh.connect(hostname="106.15.88.182", port=22, username="root", password="123456")

# 執行命令,不要執行top之類的在不停的重新整理的命令(可以執行多條命令,以分號來分隔多條命令)

# stdin, stdout, stderr = ssh.exec_command("cd %s;mkdir %s" % ("/www/wwwroot", "aa"))

stdin, stdout, stderr = ssh.exec_command("python /www/wwwroot/test.py")

stdin.write("終端等待輸入...\n") # test.py檔案有input()函式,如果不需要與終端互動,則不寫這兩行

stdin.flush()

# 獲取命令結果

res, err = stdout.read(), stderr.read()

result = res if res else err

res = result.decode()

res = result.decode("utf-8")

res = result.decode(encoding="utf-8")

print res

# 關閉伺服器連線

ssh.close()

ssh客戶端實現方案二,遠端執行命令(密碼認證)

import paramiko

transport = paramiko.transport(("106.15.88.182", 22))

transport.connect(username="root", password="123456") # 建立連線

# transport.connect(username="root", password="口令", hostkey="金鑰")

# 建立ssh物件,sshclient是定義怎麼傳輸命令、怎麼互動檔案

ssh = paramiko.sshclient()

ssh._transport = transport

# 執行命令,不要執行top之類的在不停的重新整理的命令

stdin, stdout, stderr = ssh.exec_command("df")

# 獲取命令結果

res, err = stdout.read(), stderr.read()

result = res if res else err

print result.decode()

# 關閉伺服器連線

transport.close()

ssh客戶端實現方案三,遠端執行命令(密碼認證)

import paramiko

client = paramiko.sshclient() # 建立ssh物件

client.set_missing_host_key_policy(paramiko.autoaddpolicy())# 允許連線不在known_hosts檔案中的主機

# 連線伺服器,以使用者名稱和密碼進行認證

client.connect(hostname="106.15.88.182", port=22, username="root", password="123456")

#例項化transport,並建立會話session

ssh_session = client.get_transport().open_session()

if ssh_session.active:

ssh_session.exec_command("df")

print ssh_session.recv(1024)

# 關閉伺服器連線

client.close()

ssh客戶端實現方案四,遠端執行命令(金鑰認證)

import paramiko

ssh = paramiko.sshclient() # 建立ssh物件

ssh.set_missing_host_key_policy(paramiko.autoaddpolicy()) # 允許連線不在know_hosts檔案中的主機

#這裡寫我們的金鑰檔案

private_key = paramiko.rsakey.from_private_key_file("key.poem")

# 連線伺服器,這裡我們用pkey引數設定為私鑰登陸

ssh.connect(hostname="106.15.88.182", port=22, username="root", pkey=private_key)

stdin, stdout, stderr = ssh.exec_command('df') # 執行命令

res, err = stdout.read(), stderr.read() # stdout.readline()

result = res if res else err

print result.decode()

ssh.close() # 關閉連線

封裝之後的使用

import sys,logging

from paramiko.client import sshclient, autoaddpolicy

from paramiko import authenticationexception

from paramiko.ssh_exception import novalidconnectionserror

class sshclient():

def __init__(self):

self.ssh_client = sshclient()

def ssh_login(self, host_ip, username, password):

try:

# 設定允許連線known_hosts檔案中的主機(預設連線不在known_hosts檔案中的主機會拒絕連線丟擲sshexception)

self.ssh_client.set_missing_host_key_policy(autoaddpolicy())

self.ssh_client.connect(host_ip, port=22, username=username, password=password)

except authenticationexception:

logging.warning('username or password error')

return 1001

except novalidconnectionserror:

logging.warning('connect time out')

return 1002

except:

print("unexpected error:", sys.exc_info()[0])

return 1003

return 1000

def execute_some_command(self, command):

stdin, stdout, stderr = self.ssh_client.exec_command(command)

print stdout.read().decode()

def ssh_logout(self):

self.ssh_client.close()

if __name__ == "__main__":

command = "whoami" # 自己使用ssh時,命令怎麼敲的command引數就怎麼寫

ssh = sshclient()

if ssh.ssh_login(host_ip="106.15.88.188", username="root", password="abc0506") == 1000:

ssh.execute_some_command(command)

ssh.ssh_logout()

ssh客戶端的選擇

目前主流的ssh工具有 finalshell xshell securecrt。筆者之前用securecrt和xshell,最近一直在用finalshell,securecrt介面功能較多,但是是英文版,中文版漢化不全或存bug,讓我苦惱的是輸出內容太費眼了,行間距太窄且無法調節。xshell跟se...

幾款SSH客戶端

securecrt xshell putty等都僅僅是客戶端軟體,一般用於windows客戶端計算機,因此,無論選擇哪款客戶端ssh工具都是可以的。1 securecrt 8.1版本 securecrt是一款支援ssh ssh1和ssh2 協議的終端 軟體,常被用來執行於windows下遠端登入un...

ssh客戶端簡單使用

secure shell,只是一種協議,實現它的軟體有很多,我們常用的開源又免費的軟體叫openssh,分為客戶端和服務端。不是運維,服務端我沒搞過,所以這裡只講客戶端用法,大部分程式設計師應該只要知道客戶端使用就好了。安裝openssh clients,然後就可以通過ssh agent連線遠端伺服...