使用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()
结果如下:
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