Python—實現ssh客戶端(連接遠程服務器)


paramiko是一個基於SSH用於連接遠程服務器並執行相關操作(SSHClient和SFTPClinet,即一個是遠程連接,一個是上傳下載服務),使用該模塊可以對遠程服務器進行命令或文件操作,值得一說的是,fabric和ansible內部的遠程管理就是使用的paramiko來實現的。
Paramiko模塊是基於Python實現的SSH遠程安全連接,用於SSH遠程執行命令、文件傳輸等功能。
默認Python沒有自帶,需要手動安裝:pip install paramiko。如果安裝失敗,可以嘗試yum安裝:yum install python-paramiko。
除了Paramiko模塊,還有相同作用的fabric和pexpect模塊。

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()

https://www.cnblogs.com/breezey/p/6663546.html

https://blog.csdn.net/cc297322716/article/details/78608283

https://www.jb51.net/article/125681.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM