美文网首页编程随笔
使用python登录远程服务器并执行命令和文件上传下载的方法

使用python登录远程服务器并执行命令和文件上传下载的方法

作者: jj_jump | 来源:发表于2020-03-06 20:57 被阅读0次
    Image

    使用python登录远程服务器并执行命令和文件上传下载的方法

    在Linux系统上写了一些shell脚本,但是我想在windows系统下进行调用,并返回一些结果。我不想频繁登陆远程服务去执行一次命令,所以我搜索了一下python关于ssh登录的库,发现了一个非常好用的库--->paramiko。paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,在运维方面非常有用。

    1.paramiko库的安装

    pip install paramiko
    

    2.paramiko基于用户名和密码的 sshclient 方式登录及公钥秘钥登录进行命令操作

    注意:paramiko.SSHClient().exec_command() 可以执行一条命令;当执行多条命令时,多条命令放在一个单引号下面,各命令之间用英文分号隔开

    import paramiko
    
    private_key = paramiko.RSAKey.from_private_key_file('/home/python/.ssh/id_rsa')
    
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 连接服务器(根据自己的情况选择)
    # 户名和密码登录
    ssh.connect(hostname='192.168.2.45', port=22, username='root', password='123456') 
    # 公钥秘钥登录
    ssh.connect(hostname='192.168.2.45', port=22, username='root', pkey=private_key) 
    # 执行命令
    stdin, stdout, stderr = ssh.exec_command('ls -lah')
    # 获取命令结果
    result = stdout.read().decode('utf-8')
    # 输出返回的结果
    print(result)
    # 关闭连接
    ssh.close()
    
    结果输出为:
    总用量 148K
    drwxr-xr-x 21 python python 4.0K 3月   3 02:36 .
    drwxr-xr-x  3 root   root   4.0K 2月   2 04:12 ..
    -rw-------  1 python python 2.9K 2月  19 22:00 .bash_history
    -rw-r--r--  1 python python  220 2月   2 04:12 .bash_logout
    -rw-r--r--  1 python python 3.7K 2月   2 04:12 .bashrc
    drwx------ 17 python python 4.0K 3月   3 02:56 .cache
    drwx------  3 python python 4.0K 2月   2 04:40 .compiz
    drwx------ 21 python python 4.0K 2月   3 03:40 .config
    drwx------  3 python python 4.0K 2月   2 05:01 .dbus
    drwxr-xr-x  3 python python 4.0K 2月   3 04:49 Desktop
    -rw-r--r--  1 python python   25 2月   2 04:15 .dmrc
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Documents
    drwxr-xr-x  2 python python 4.0K 2月   2 05:11 Downloads
    -rw-r--r--  1 python python 8.8K 2月   2 04:12 examples.desktop
    drwx------  2 python python 4.0K 3月   3 02:36 .gconf
    drwx------  3 python python 4.0K 3月   3 02:36 .gnupg
    -rw-------  1 python python 4.7K 3月   3 02:36 .ICEauthority
    drwx------  3 python python 4.0K 2月   2 04:15 .local
    drwx------  5 python python 4.0K 2月   2 04:54 .mozilla
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Music
    -rw-------  1 python python   47 2月   3 05:13 .mysql_history
    -rw-r--r--  1 python python  267 2月   2 05:26 .pam_environment
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Pictures
    drwx------  3 python python 4.0K 2月   3 03:35 .pki
    drwx------  2 python python 4.0K 2月   2 05:01 .presage
    -rw-r--r--  1 python python  655 2月   2 04:12 .profile
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Public
    drwxrwxr-x  2 python python 4.0K 3月   3 02:36 .sogouinput
    -rw-r--r--  1 python python    0 2月   2 04:19 .sudo_as_admin_successful
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Templates
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Videos
    -rw-------  1 python python   51 3月   3 02:36 .Xauthority
    -rw-rw-r--  1 python python  132 2月   2 05:20 .xinputrc
    -rw-------  1 python python   84 3月   3 02:36 .xsession-errors
    -rw-------  1 python python 1.5K 2月  19 22:00 .xsession-errors.old
    
    

    3。paramiko基于用户名和密码的 transport 方式登录及公钥秘钥登录进行命令操作

    import paramiko
    
    private_key = paramiko.RSAKey.from_private_key_file('/home/python/.ssh/id_rsa')
    
    transport = paramiko.Transport(('192.168.3.54', 22))
    # 连接服务器(根据自己的情况选择)
    # 户名和密码登录
    transport.connect(username='root', password='123456')
    # 公钥秘钥登录
    transport.connect(username='root', password='123456',pkey=private_key)
     
    # 创建SSH对象
    ssh = paramiko.SSHClient()
    ssh._transport = transport
     # 执行命令
    stdin, stdout, stderr = ssh.exec_command('ls -lah')
    # 输出执行结果
    print(stdout.read().decode('utf-8'))
     
    transport.close()
    
    结果输出为:
    总用量 148K
    drwxr-xr-x 21 python python 4.0K 3月   3 02:36 .
    drwxr-xr-x  3 root   root   4.0K 2月   2 04:12 ..
    -rw-------  1 python python 2.9K 2月  19 22:00 .bash_history
    -rw-r--r--  1 python python  220 2月   2 04:12 .bash_logout
    -rw-r--r--  1 python python 3.7K 2月   2 04:12 .bashrc
    drwx------ 17 python python 4.0K 3月   3 02:56 .cache
    drwx------  3 python python 4.0K 2月   2 04:40 .compiz
    drwx------ 21 python python 4.0K 2月   3 03:40 .config
    drwx------  3 python python 4.0K 2月   2 05:01 .dbus
    drwxr-xr-x  3 python python 4.0K 2月   3 04:49 Desktop
    -rw-r--r--  1 python python   25 2月   2 04:15 .dmrc
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Documents
    drwxr-xr-x  2 python python 4.0K 2月   2 05:11 Downloads
    -rw-r--r--  1 python python 8.8K 2月   2 04:12 examples.desktop
    drwx------  2 python python 4.0K 3月   3 02:36 .gconf
    drwx------  3 python python 4.0K 3月   3 02:36 .gnupg
    -rw-------  1 python python 4.7K 3月   3 02:36 .ICEauthority
    drwx------  3 python python 4.0K 2月   2 04:15 .local
    drwx------  5 python python 4.0K 2月   2 04:54 .mozilla
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Music
    -rw-------  1 python python   47 2月   3 05:13 .mysql_history
    -rw-r--r--  1 python python  267 2月   2 05:26 .pam_environment
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Pictures
    drwx------  3 python python 4.0K 2月   3 03:35 .pki
    drwx------  2 python python 4.0K 2月   2 05:01 .presage
    -rw-r--r--  1 python python  655 2月   2 04:12 .profile
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Public
    drwxrwxr-x  2 python python 4.0K 3月   3 02:36 .sogouinput
    -rw-r--r--  1 python python    0 2月   2 04:19 .sudo_as_admin_successful
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Templates
    drwxr-xr-x  2 python python 4.0K 2月   2 04:15 Videos
    -rw-------  1 python python   51 3月   3 02:36 .Xauthority
    -rw-rw-r--  1 python python  132 2月   2 05:20 .xinputrc
    -rw-------  1 python python   84 3月   3 02:36 .xsession-errors
    -rw-------  1 python python 1.5K 2月  19 22:00 .xsession-errors.old
    
    

    4.paramiko基于用户名和密码的 transport 方式登录及公钥秘钥登录进行文件上传下载操作

    import paramiko
    
    private_key = paramiko.RSAKey.from_private_key_file('/home/python/.ssh/id_rsa')
    
    transport = paramiko.Transport(('192.168.3.54', 22))
    # 连接服务器(根据自己的情况选择)
    # 户名和密码登录
    transport.connect(username='root', password='123456')
    # 公钥秘钥登录
    transport.connect(username='root', password='123456',pkey=private_key)
    sftp = paramiko.SFTPClient.from_transport(transport)
    
    # 将C:\Users\liming\Desktop\python_projects\program\test\test.py 上传至服务器 /home/python/test.py
    local_path=r"C:\Users\liming\Desktop\python_projects\program\musics\test.py"
    remote_path="/home/python/Desktop/test.py"
    sftp.put(localpath, remotepath)
    # 将remote_path下载到本地 local_path
    sftp.get(remove_path, local_path)
     
    transport.close()
    

    结果如下:

    Image

    5.对paramiko进行封装,实现远程命令执行和文件上传下载

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import paramiko
    
    
    class SSHConnection:
        """
        对paramiko进行封装,实现远程命令执行和文件上传下载
        """
    
        def __init__(self, host='192.168.12.68', port=22, username='root', pwd='123456'):
            self.host = host
            self.port = port
            self.username = username
            self.pwd = pwd
            self.__k = None
            self.__transport = self.connect()
    
        def connect(self):
            """
            连接Linux服务器
            :return: transport对象
            """
            transport = paramiko.Transport((self.host, self.port))
            transport.connect(username=self.username, password=self.pwd)
            return transport
    
        def upload(self, local_path, target_path):
            """
            上传本地文件到服务器上
            :param local_path:本地计算机上的文件路径
            :param target_path:远程服务器上的文件路径
            :return:无
            """
            sftp = paramiko.SFTPClient.from_transport(self.__transport)
            sftp.put(local_path, target_path)
    
        def download(self, remote_path, local_path):
            """
            将服务器上的文件下载到本地
            :param remote_path:远程服务器上的文件路径
            :param local_path:本地计算机上的文件路径
            :return: 无
            """
            sftp = paramiko.SFTPClient.from_transport(self.__transport)
            sftp.get(remote_path, local_path)
    
        def cmd(self, command):
            """
            在服务器上执行shell命令
            :param command:要执行的命令
            :return:执行命令后的返回结果
            """
            ssh = paramiko.SSHClient()
            ssh._transport = self.__transport
            # 执行命令
            stdin, stdout, stderr = ssh.exec_command(command)
            # 获取命令结果
            result = stdout.read().decode("utf-8")
            print(result)
            return result
    
        def close(self):
            """
            关闭服务器连接
            :return: 无
            """
            self.__transport.close()
    
    
    def main():
        ssh = SSHConnection(host="192.168.56.136", port=22, username="root", pwd="123456")
        ssh.cmd('ls -lah;cd /home/python/Desktop/prj/run.sh')  # 执行ls -lah命令,并执行run.sh脚本
        ssh.upload(r'C:\Users\liming\Desktop\python_projects\program\test\test.py', '/home/python/Desktop/1.py')  # 将本地的test.py文件上传到远端服务器的/home/python/Desktop目录下并改名为1.py
        ssh.download('/home/python/Desktop/1.py', 'testdownload.py')  # 将远端服务器的/home/python/Desktop目录下的1.p下载到本地的test目录下并改名为test.py
        ssh.close()  # 关闭连接
    
    
    if __name__ == '__main__':
        main()
    
    

    参考链接

    相关文章

      网友评论

        本文标题:使用python登录远程服务器并执行命令和文件上传下载的方法

        本文链接:https://www.haomeiwen.com/subject/rnforhtx.html