资讯专栏INFORMATION COLUMN

python大佬养成计划----paramiko实现SSH

gghyoo / 2156人阅读

摘要:模块为的缩写,由的网络小组所制定为建立在应用层基础上的安全协议。是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用该模块,可以方便的进行连接和协议进行文件传输。

paramiko模块

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输。

远程密码连接
#基于ssh,用于连接远程服务器做操作:远程执行命令,上传或下载文件
import paramiko

#创建一个ssh对象
client = paramiko.SSHClient()
#2.解决问题:首次连接,会出现
# Are you sure you want to continue connecting (yes/no)? yes
# 自动选择yes

# 允许连接不在know_hosts文件中的主机
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

#3.连接服务器
client.connect(hostname="172.25.254.19",port=22,username="root",password="westos")

#4.执行操作
stdin,stdout,stderr = client.exec_command("hostname")#标准输入,标准输出,标准错误输出。
#Execute a command on the SSH server.  A new `.Channel` is opened and
# the requested command is executed.  The command"s input and output
# streams are returned as Python ``file``-like objects representing
# stdin, stdout, and stderr.

#5.获取命令的执行结果
res = stdout.read().decode("utf-8")#使结果具有可读性

print(res)

#6.断开连接
client.close()

批量连接

批量连接host.txt文件中的主机,返回执行结果
格式:172.25.254.1:22:root:westos

import paramiko
with open("host.txt") as f: #保证host.txt文件在当前目录下
    hostinfos = f.readlines()   #列表形式,["172.25.254.1:22:root:westos
", "172.25.254.2:22:root:westos
", "172.25.254.3:22:root:westos
", "172.25.254.19:22:root:westos
"]

    for hostinfo in hostinfos:
        hostinfo = hostinfo.strip() #去掉空格,字符串格式,172.25.254.2:22:root:westos
        print("正在连接%s主机" %(hostinfo.split(":")[0]))
        hostname,port,username,passwd = hostinfo.split(":")
        try:
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect(hostname=hostname,port=port,username=username,password=passwd)
            stdin,stdout,stderr = client.exec_command("hostname")
            res = stdout.read().decode("utf-8")
            print("结果为:",res)
        except Exception as e :
            print("Connection is failed,the reason is :",e)
        finally:
            client.close()
            print("连接结束")

基于公钥连接

免密登录远程主机
首先在需要连接的主机上生成一对公钥和私钥,本机获取到需要连接的主机的私钥时,就可以通过公私钥配对,登陆远程主机。
这里需要id_rsa存放你所连接的主机的私钥

import paramiko
from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException

def conn(cmd,hostname,port=22,username="root"):
    client = paramiko.SSHClient()
    private_key = paramiko.RSAKey.from_private_key_file("id_rsa")#id_rsa存放私钥
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        client.connect(hostname=hostname,
            port=port,username=username,pkey=private_key)
    except NoValidConnectionsError as e:
        print("...连接失败...")
    except AuthenticationException as e:
        print("...密码错误...")
    else:
        stdin, stdout, stderr = client.exec_command(cmd)
        result = stdout.read().decode("utf-8")
        print(result)

    finally:
        client.close()


if __name__=="__main__":
    for count in range(13,20):
        hostname = "172.25.254.%s" %(count)
        print("正在连接主机:",hostname)
        conn("hostname",hostname)
    print("...连接结束...")

基于用户名密码上传下载文件

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。

import paramiko
tran = paramiko.Transport("172.25.254.19",22)
tran.connect(username="root",password="westos")


sftp = paramiko.SFTPClient.from_transport(tran)
#class SFTPClient(BaseSFTP, ClosingContextManager)
#SFTP client object.
# Used to open an SFTP session across an open SSH `.Transport` and perform
# remote file operations.
# Instances of this class may be used as context managers.
sftp.put("/home/kiosk/PycharmProjects/day18/07_pratice.py","/mnt/practice.py")
sftp.get("/mnt/passwd","hallo")
tran.close()

paramiko再封装

使paramiko模块执行自己想要的操作

import paramiko
import os
from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException, SSHException

class SshRrmote(object):
    def __init__(self,cmd,hostname,port,username,passwd):
        self.hostname = hostname
        self.passwd = passwd
        self.cmd = cmd
        self.username = username
        self.port = port
    def run(self):
        """默认调用的内容"""
        # cmd hostname
        # put local_file remote_file
        # get remote_file local_file
        cmd_str = self.cmd.split()[0]  # cmd
        # 类的反射, 判断类里面是否可以支持该操作?
        if hasattr(self, "do_" + cmd_str):  # do_cmd
            getattr(self, "do_" + cmd_str)()
        else:
            print("目前不支持该功能")
    def do_cmd(self):
        client = paramiko.SSHClient()
        try:
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect(hostname=self.hostname,port=int(self.port),username=self.username,password=self.passwd)

        except NoValidConnectionsError as e:
            print("...连接失败...")
        except AuthenticationException as e:
            print("...密码错误...")
        else:
            cmd = " ".join(self.cmd.split()[1:])
            stdin, stdout, stderr = client.exec_command(cmd)
            result = stdout.read().decode("utf-8")
            print("执行结果",result)
        finally:
            print("断开%s的连接" %(self.hostname))
            client.close()
    def do_get(self):
        #有待改进,因为连接多个主机时,会覆盖文件
        print("开始下载")
        try:
            trans = paramiko.Transport(self.hostname,int(self.port))
            trans.connect(username=self.username,password=self.passwd)
            print("hello")
        except SSHException as e:
            print("连接失败")
        else:
            sftp = paramiko.SFTPClient.from_transport(trans)
            cmd = self.cmd.split()[1:]
            if len(cmd)==2:
                sftp.get(cmd[0],cmd[1])
                print("下载文件%s成功,并保存为%s" %(cmd[0],cmd[1]))
            else:
                print("参数有误")
            trans.close()
    def do_put(self):
        # put /tmp/passwd /tmp/passwd  # 将本机的/tmp/passwd文件上传到远程主机的/tmp/passwd;
        print("开始上传")   #注意你使用的用户是否为kiosk
        try:
            trans = paramiko.Transport(self.hostname, int(self.port))
            trans.connect(username=self.username, password=self.passwd)

        except SSHException as e:
            print("连接失败")
        else:
            sftp = paramiko.SFTPClient.from_transport(trans)
            cmd = self.cmd.split()[1:]
            if len(cmd) == 2:
                sftp.put(cmd[0],cmd[1])
                print("上传文件%s成功,并保存为%s" %(cmd[0], cmd[1]))
            else:
                print("参数有误")
            trans.close()

#1.选择要操作的主机组:mysql,web,ftp
#       主机信息怎么存?将不同的主机信息存放在不同的文件中
#2.根据选择的主机组,显示包含的主机IP/主机名
#3.让用户确认信息,选择需要批量执行的命令
#   -cmd shell命令
#   -put 本地文件 远程文件
#   -get 远程文件 本地文件

def main():
    groups = [file.rstrip(".conf") for file in os.listdir("conf")]
    print("主机组显示".center(50,"*"))
    [print("	",item) for item in groups]
    choiceGroup = input("请选择批量操作的主机组(eg:web):")
    with open("conf/"+choiceGroup+".conf") as f:
        info = f.readlines()
        print("批量执行脚本".center(50, "*"))
        while True:
            cmd = input(">>").strip()
            if cmd:
                if cmd =="exit":
                    print("连接执行结束")
                    break
                for item in info:
                    item=item.strip()
                    print(item.split(":")[0].center(50,"-"))
                    hostname,port,username,passwd = item.split(":")
                    ssh = SshRrmote(cmd,hostname,port,username,passwd)
                    ssh.run()

main()


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42458.html

相关文章

  • pythonparamiko模块的使用

    摘要:是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,和内部的远程管理就是使用的来现实。 paramiko paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。 1、下载安装 pycrypto,由于 paramiko 模块内部...

    Cobub 评论0 收藏0
  • python大佬养成计划--协程实现TCP连接

    摘要:协程实现连接在网络通信中,每个连接都必须创建新线程或进程来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接。所以我们尝试使用协程来实现服务器对多个客户端的响应。 协程实现TCP连接 在网络通信中,每个连接都必须创建新线程(或进程) 来处理,否则,单线程在处理连接的过程中, 无法接受其他客户端的连接。所以我们尝试使用协程来实现服务器对多个客户端的响应。与单一TCP通信的构架...

    fuchenxuan 评论0 收藏0
  • python大佬养成计划----socket实现UDP通信

    摘要:是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对,则是面向无连接的协议。测试结果用两个命令行分别启动服务器和客户端测试开启服务端完成一次通信 UDP TCP是建立可靠连接, 并且通信双方都可以以流的形式发送数据。 相对TCP, UDP则是面向无连接的协议。使用UDP协议时, 不需要建立连接, 只需要知道对方的IP地址和端口号, 就可以直接发数据包。 但是, 能不能到达就不知道...

    Juven 评论0 收藏0
  • SSH连接与自动化部署工具paramiko与Fabric

    摘要:是基于实现的远程安全连接,支持认证及密钥方法。利用函数发送到,通过函数获取回显。如下全局属性设定对象的作用是定义的全局设定,支持多个属性及自定义属性。相比确实简化了不少。出现异常时,发出警告,继续执行,不要终止。 paramiko paramiko是基于Python实现的SSH2远程安全连接,支持认证及密钥方法。可以实现远程命令执行,文件传输,中间SSH代理等功能,相对于Pexpect...

    ermaoL 评论0 收藏0
  • python大佬养成计划----HTML网页设计(表单)

    摘要:数据传输方式输入类控件表单元素也称表单控件,按照填写方式分为输入类和下拉菜单类。按钮的名字按钮上显示的文本重置菜单列表控件下拉菜单可以节省页面空间。是单标签,用来定义下拉菜单中的选项。表示初始被选中的选项。 当用户熟悉了静态网页制作后就能感受到它的功能单一,会想建立具有交互性的动态网站。动态网站经常用到的一个元素就是表单。表单是HTML的一个重要组成部分,是网站管理员与用户之间沟通的桥...

    nevermind 评论0 收藏0

发表评论

0条评论

gghyoo

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<