zoukankan      html  css  js  c++  java
  • python3+paramiko实现ssh客户端

    一、程序说明

    ssh客户端实现主要有以下四个问题:

    第一个问题是在python中ssh客户端使用哪个包实现----我们这里使用的是paramiko

    第二个问题是怎么连接服务器----连接服务器直接使用connect()函数就可以了,有个坑是不在known_hosts文件中的机器默认不允许连接需要处理一下

    第三个问题是连上之后怎么执行命令----连上之后直接用exec_command()函数就可以执行命令

    第四个问题是怎么读取命令执行结果----exec_command()函数会返回函数执行结果,用一个参数接收一下就可以了

    我们这里整个整序的流程是:

    使用用户名密码登录主机----如果登录成功则执行whoami命令----打印whoami命令结果----退出ssh会话

    二、程序源代码

    import logging
    import sys
    from paramiko import AuthenticationException
    from paramiko.client import SSHClient, AutoAddPolicy
    from paramiko.ssh_exception import NoValidConnectionsError
    
    
    class MySshClient():
        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:
                logging.warning('unknow error')
                print("Unexpected error:", sys.exc_info()[0])
                return 1003
            return 1000
    
        # 此函数用于执行command参数中的命令并打印命令执行结果
        def execute_some_command(self,command):
            stdin, stdout, stderr = self.ssh_client.exec_command(command)
            print(stdout.read().decode())
    
        # 此函数用于退出登录
        def ssh_logout(self):
            logging.warning('will exit host')
            self.ssh_client.close()
    
    if __name__ == '__main__':
        # 远程主机IP
        host_ip = '192.168.220.129'
        # 远程主机用户名
        username = 'root'
        # 远程主机密码
        password = 'toor'
        # 要执行的shell命令;换成自己想要执行的命令
        # 自己使用ssh时,命令怎么敲的command参数就怎么写
        command = 'whoami'
        # 实例化
        my_ssh_client = MySshClient()
        # 登录,如果返回结果为1000,那么执行命令,然后退出
        if my_ssh_client.ssh_login(host_ip,username,password) == 1000:
            logging.warning(f"{host_ip}-login success, will execute command:{command}")
            my_ssh_client.execute_some_command(command)
            my_ssh_client.ssh_logout()

    参考:

    http://docs.paramiko.org/en/2.4/api/client.html

  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/lsdb/p/9293410.html
Copyright © 2011-2022 走看看