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

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

参考链接

  • https://github.com/paramiko/paramiko
  • https://www.liujiangblog.com/blog/15/
  • https://www.cnblogs.com/wang-yc/p/5628114.html
  • https://blog.csdn.net/qq_24674131/article/details/95618304

你可能感兴趣的:(使用python登录远程服务器并执行命令和文件上传下载的方法)