python遠程操作linux服務器(獲取ip,執行多條linux命令,上傳文件)


首先安裝模塊:pip install paramiko

參考官方文檔用法:http://docs.paramiko.org/en/2.0/api/client.html

獲取linux服務器的ip,代碼如下:

import paramiko
import re


class GetLinuxIp():
    '''獲取linux服務器ip'''

    def __init__(self, hostname, port, username, password, cmds):
        '''

        :param hostname: linux主機的ip
        :param port: linux主機的端口
        :param username: linux主機登錄用戶名
        :param password: linux主機登錄密碼
        :param cmds: 需要執行的linux命令
        '''
        self.ip = hostname
        self.port = port
        self.user = username
        self.password = password
        self.cmds = cmds
        try:
            self.client = paramiko.SSHClient()   # 實例化客戶端
            # 保存服務器的主機名和密鑰信息
            self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 連接服務端,進行身份驗證
            self.client.connect(self.ip, self.port, self.user, self.password, timeout=10)
            print("連接成功...")
        except Exception as e:
            # raise e
            print("連接失敗,錯誤是{}".format(e))
            raise e

    def excute_command(self):
        '''執行命令'''
            # todo stdin是標准輸入文件,stdout是標准輸出文件,stderr標准出錯文件,應用在輸出的重新定位上。
        self.stdin, self.stdout, self.stderr = self.client.exec_command(self.cmds)

    def get_result(self):
        '''獲取結果'''
        result = self.stdout.read().decode()
        pattern = re.compile(r'((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}')
        self.ip = pattern.search(result).group()
        print("獲取到linux服務器的ip是:{}".format(self.ip))

    def __del__(self):
        '''關閉連接'''
        self.client.close()
        print("連接關閉...")


if __name__ == '__main__':
    linux = GetLinuxIp("121.196.120.113", 22, "root", "123_Xiaohaikun", "ifconfig")
    linux.excute_command()
    linux.get_result()

運行結果如圖:

 執行多條linux命令,多條命令放在一個單引號下面,各命令之間用分號隔開,如:cmd_str = "cd /;cd etc;ls -l;" 且在末尾加上get_pty=True

demo如下:

import paramiko


def remot_connect(hostname, port, username, password, cmd_str):
    # 創建SSHClient 實例對象
    ssh = paramiko.SSHClient()
    # 調用方法,表示沒有存儲遠程機器的公鑰,允許訪問
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 連接遠程機器,地址,端口,用戶名密碼
    ssh.connect(hostname, port, username, password, timeout=10)
    # 輸出命令執行結果
    stdin, stdout, stderr = ssh.exec_command(cmd_str, get_pty=True)
    result = stdout.read()
    print(result.decode())

    # 關閉連接
    ssh.close()


if __name__ == '__main__':
    hostname = "121.196.120.113"
    port = 22
    username = "root"
    password = "123_Xiaohaikun"
    cmd_str = "cd /;cd etc;ls -l;"
    remot_connect(hostname, port, username, password, cmd_str)

 

代碼運行結果如圖:

xshell上顯示如圖:

 上傳文件:

demo如下:

import paramiko
import datetime
import os


def upload(hostname, username, password, port, local_file_path, remote_path):
    '''

    :param hostname:
    :param username:
    :param password: 
    :param port:
    :param local_file_path: 本地文件路徑
    :param remote_path: linux保存路徑
    :return:
    '''
    try:
        t = paramiko.Transport((hostname, port))
        t.connect(username=username, password=password)
        sftp = paramiko.SFTPClient.from_transport(t)
        print('開始上傳文件{}'.format(datetime.datetime.now()))

        try:
            sftp.put(local_file_path, remote_path)
        except Exception as e:
            sftp.mkdir(os.path.split(remote_path)[0])
            sftp.put(local_file_path, remote_path)
            print("從本地: {} 上傳到linux目錄下: {}".format(local_file_path, remote_path))
        print('文件上傳成功 {} '.format(datetime.datetime.now()))
        t.close()
    except Exception as e:
        print(repr(e))


if __name__ == '__main__':
    hostname = '121.196.120.113'
    username = 'root'
    password = '123_Xiaohaikun'
    port = 22
    local_file_path = r'D:\Video\1.mp4'
    remote_path = os.path.join('/root/temp/', "1.mp4")
    upload(hostname, username, password, port, local_file_path, remote_path)

運行結果:

 

 

 


免責聲明!

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



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