专栏首页python、mysql、go知识点积累paramiko模块——ssh远程连接服务器并执行命令

paramiko模块——ssh远程连接服务器并执行命令

paramiko模块——ssh远程连接服务器并执行命令

通过ssh远程连接服务器并执行相应的命令,类似于Xshell

ansible用来批量管理远程服务器,底层其实用的就是paramiko模块

安装

pip3 install paramiko

使用

paramiko模块即支持用户名密码的方式操作服务器

也支持公钥私钥的方式操作服务器

并且实际生产中公钥私钥用的较多,因为密码是敏感信息

用户名和密码的方式执行命令

"""执行命令  用户名和密码的方式"""
# 创建对象
ssh = paramiko.SSHClient()
# 允许链接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())


# 链接服务器
ssh.connect(hostname='172.16.219.173',port=22,username='root',password='zgh123456')

# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls /')
"""
stdin用来输入额外的命令 
    yum install ansible  额外的命令-y
stdout命令的返回结果  正确
stderr命令的返回结果  错误
"""
res = stdout.read()  # 网络传输过来的二进制数据
print(res.decode('utf-8'))

# 关闭链接
ssh.close()

公钥和私钥的方式执行命令

公钥和私钥需要通过git命令生成参考之前写的git相关文章:

https://www.cnblogs.com/ghylpb/p/12158061.html

# 公钥和私钥(先讲公钥保存到服务器上)
import paramiko

# 读取本地私钥(公钥和私钥需要)
private_key = paramiko.RSAKey.from_private_key_file('a.txt')

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='172.16.219.173', port=22, username='root', pkey=private_key)

# 执行命令
stdin, stdout, stderr = ssh.exec_command('ls /')
# 获取命令结果
result = stdout.read()
print(result.decode('utf-8'))
# 关闭连接
ssh.close()

用户名和密码的方式上传下载文件

"""上传下载文件  用户名和密码的方式"""
import paramiko

# 用户名和密码
transport = paramiko.Transport(('172.16.219.173', 22))
transport.connect(username='root', password='zgh123456')

sftp = paramiko.SFTPClient.from_transport(transport)

# 上传文件
# sftp.put("a.txt", '/data/b.txt')  # 注意上传文件到远程某个文件下 文件必须存在

# 下载文件
sftp.get('/data/b.txt', 'c.txt')  # 将远程文件下载到本地并重新命令
transport.close()

公钥私钥的方式上传下载文件

"""上传下载文件 公钥私钥的方式"""
# 公钥和私钥
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('c.txt')
transport = paramiko.Transport(('172.16.219.173', 22))
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
# sftp.put('manage.py', '/data/temp.py')

# 将remove_path 下载到本地 local_path
# sftp.get('remove_path', 'local_path')
transport.close()

将上传下载执行命令进行封装

"""
我现在即想执行命令又想上传下载文件并且多次执行
yum install ansible
yum install redis
yum install redis
upload

单链接下完成多步操作
"""
# 下面写的类 你只要只要是想通过paramiko链接服务器都可以使用
import paramiko


class SSHProxy(object):
    def __init__(self, hostname, port, username, password):
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.transport = None

    def open(self):  # 给对象赋值一个上传下载文件对象连接
        self.transport = paramiko.Transport((self.hostname, self.port))
        self.transport.connect(username=self.username, password=self.password)

    def command(self, cmd):  # 正常执行命令的连接  至此对象内容就既有执行命令的连接又有上传下载链接
        ssh = paramiko.SSHClient()
        ssh._transport = self.transport

        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        return result

    def upload(self, local_path, remote_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, remote_path)
        sftp.close()

    def close(self):
        self.transport.close()

    def __enter__(self):  # 对象执行with上下文会自动触发
        # 
        # print('触发了enter')
        self.open()
        return self  # 这里发挥上面with语法内的as后面拿到的就是什么
        # return 123


    def __exit__(self, exc_type, exc_val, exc_tb):  # with执行结束自动触发
        # print('触发了exit')
        self.close()
"""
上面这个类在使用的时候 需要先执行open方法
obj = SSHProxy()
obj.open()  文件对象 链接服务器

obj.command()
obj.command()
obj.upload()
obj.upload()

obj.close()  关闭链接

文件操作
f = open()
f.write()
f.read()
f.close()

with上下文管理
with open() as f:
...
"""

# 对象默认是不支持with语法的   
# obj = SSHProxy('172.16.219.173',22,'root','zgh123456')
# with obj as f:
#     # print('进入with代码块')
#     print(f)

if __name__ == '__main__': 
    with SSHProxy('172.16.219.173',22,'root','zgh123456') as ssh:
        ssh.command()
        ssh.command()
        ssh.command()
        ssh.upload()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 粘包问题的解决,上传与下载,多用户聊天

    2.并可以返回终端的执行结果 subprocess.Popen(1,2,3,4) 1:cmd命令 2:shell = True 3:返回正确结果参数 ...

    GH
  • 生成器有什么好处?

    在Python这门语言中,生成器毫无疑问是最有用的特性之一。与此同时,也是使用的最不广泛的Python特性之一。究其原因,主要是因为,在其他主流语言里面没有生成...

    GH
  • web框架之初识Django

    百度百科:Web应用框架(Web application framework)是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。其类型有基于请求的...

    GH
  • "隐写术" - 深入研究 PDF混淆漏洞

    上礼拜发现的关于使用 this.getPageNumWords()&this.getPageNthWord() 方法来进行混淆的 PDF 漏洞不久,我们发现另外...

    madneal
  • 如何理解分布式与集群,二者区别是什么?

    分布式是指不同的业务分布在不同的地方,集群指的是将几台服务器集中在一起,实现同一业务。 白话理解的话,比如公司项目上线初期(举例电子商务网站)

    洞链
  • 常见https,SSH协议和MD5加密方式分析

    https,SSH协议和MD5加密是前端可能会接触到的加密,所以我就将他们进行了一个归纳.

    火狼1
  • 企业实施ERP频繁出错的因素有哪些?

      此时,ERP管理软件通过计算机网络资源实现数据的集中处理和共享,迎合了企业管理的需求;虽然ERP是企业借用一种新的管理模式改造企业原有的旧的管理模式,是先进...

    明象ERP
  • Jenkins配置报告与邮件插件

      我们先装一个Report插件,在系统管理-管理插件中找  HTML Publisher plugin 插件并安装

    飞天小子
  • 企业在实施而erp出错的情况下应该如何解决呢?

      重视实施前员工的思想教育和技能培训 ERP的实施和应用对企业来说是一套新生的管理工具,企业的管理和经营必须要从员工的思维方式和传统观念来改变,所以企业必须重...

    明象ERP
  • python列表生成器与生成器

    生成器与列表生成器的本质区别就是:一个已经生成数据了,使用时,如果数据过大,会产生内存溢出,而生成器是只有循环时,才会生成数据。

    py3study

扫码关注云+社区

领取腾讯云代金券