paramiko远程密码连接

paramiko远程密码连接

基于ssh用于连接远程服务器作操作,可以远程执行命令,上传文件,下载文件等

import parpmiko  #调用parpmiko模块
client=paramiko.SSHClient() #创建ssh对象
client.set_missing_host_key_policy(paramiko.AutoAddpolicy())
#如果之前没有与目的ip连接过,会出现:Are you sure you want to continue connecting (yes/no)?
#该行命令是用来自动选择yes的,避免多与的手动操作
clinet.connect(hostname='172.25.254.37',
               port=22,
               username='root',
               password='westos')  #连接服务器
stdio,stdout,stderr =clinet.exec_command('hostnaewdeme') #执行操作
result=stdout.read().decode('utf-8')  #获取命令的执行结果
print(result)
client.close() #关闭连接

paramiko远程密码连接.plus

import parpmiko 
from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException 
def connect(cmd,hostname,port=22,username='root,passwd='westos') #定义connnetc函数
    client=paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddpolicy())
    try:
        clinet.connect(hostname='172.25.254.37',
                   port=22,
                       username=username,
                               password=passwd)
        print("正在连接主机%s......"%(hostname))
    expect NoValidConnectionsError as e:  #捕捉不能连接的错误,并打印
        print("连接失败")
    except AuthenticationException as e:  #捕捉密码错误的错误,并打印
        print("密码错误")
    else: #若无错误,执行以下操作
        stdio,stdout,stderr =clinet.exec_command('hostnaewdeme')
        result=stdout.read().decode('utf-8')
        print(result)
        client.close()
with open('host.txt') as f: #打开host.txt
    for line in f:
        line=line.strip() #移去空格
        hostname,port,username,password=line.split(':')#以:分割
        print(hostname.center(50,"*")
        connect('hostname',hostaname,port,username,passwd) #调用函数

paramiko基于公钥密钥连接:

基于ssh用于连接远程服务器做操作:远程执行命令, 上传文件, 下载文件
import  paramiko
from paramiko.ssh_exception import NoValidConnectionsError, AuthenticationException
def connect(cmd, hostname, port=22, user='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=user,
                       pkey=private_key
                      )
        stdin, stdout, stderr = client.exec_command(cmd)
    except NoValidConnectionsError as e:
        print("连接失败")
    except AuthenticationException as e:
        print("密码错误")
    else:
        result = stdout.read().decode('utf-8')
        print(result)
    finally:
        client.close()
for count in range(254):#批量对0~254段的id操作
    host = '172.25.254.%s' %(count+1)
    print(host.center(50, '*'))
    connect('uname', host)

基于用户名密码上传下载:

import  paramiko
transport = paramiko.Transport(('172.25.254.37', 22)) #实例一个tranport对象 
transport.connect(username='root', password='westos')#用户名和用户密码
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put('/tmp/kiosk', '/mnt/kiosk1') #上传文件/tmp/kiosk, 到目的ip的/mnt/kiosk1
sftp.get('/mnt/kiosk', '/home/kiosk/Desktop/day18/kiosk') #从目的ip的/home/kiosk/Desktop/day18/kiosk得到文件,放在本机/mnt/kisok下
transport.close()

基于密钥上传和下载

private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
transport = paramiko.Transport(('172.25.254.37', 22))#实例一个tranport对象
transport.connect(username='root',pkey=private_key)#用户名和用户密钥
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put('/tmp/kiosk', '/mnt/kiosk2') #上传文件/tmp/kiosk, 到目的ip的/mnt/kiosk1
sftp.get('/mnt/kiosk2', '/home/kiosk/Desktop/day18/kiosk')#从目的ip的/home/kiosk/Desktop/day18/kiosk得到文件,放在本机/mnt/kisok下
transport.close()

paramiko再次封装:

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


class SshRemoteHost(object):#创建一个类SshRemoteHost
    def __init__(self, hostname, port, user, passwd, cmd):
        self.hostname  = hostname
        self.port = port
        self.user = user
        self.passwd = passwd
        self.cmd = cmd  #实例化类内的对象
    def run(self): 
        cmd_str =  self.cmd.split()[0]
        if hasattr(self, 'do_'+ cmd_str):  #类的反射,判断是否支持该操作(hasattr:判度对象是否包含对应的属性或者方法名)
            getattr(self, 'do_'+cmd_str)()#(getattr :用于返回对象的属性值或者对应的方法体)
        else:
            print("目前不支持该功能")
    def do_cmd(self):
        client = paramiko.SSHClient()
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        try:
            client.connect(hostname=self.hostname,
                           port=self.port,
                           username=self.user,
                           password=self.passwd)

            print("正在连接主机%s......." % (self.hostname))
        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)
            client.close()
    def do_put(self):
        print("正在上传.....")
        try:
            transport = paramiko.Transport((self.hostname, int(self.port)))
            transport.connect(username=self.user, password=self.passwd)
        except SSHException as e:
            print("连接失败")
        else:
            sftp = paramiko.SFTPClient.from_transport(transport)
            newCmd  = self.cmd.split()[1:]
            if len(newCmd) == 2:
                sftp.put(newCmd[0], newCmd[1])
                print("%s文件上传到%s主机的%s文件成功" %(newCmd[0],
                                             self.hostname,  newCmd[1]))
            else:
                print("上传文件信息错误")

            transport.close()

    def do_get(self):
        print("正在下载.....")
    groups = [file.rstrip('.conf') for file in os.listdir('conf')]
    print("主机组显示:".center(50, '*'))
    for group in groups: print('\t', group)
    choiceGroup = input("清选择批量操作的主机组(eg:web):")
    print("主机组包含主机:".center(50, '*'))
    with open('conf/%s.conf' %(choiceGroup)) as f:
        for line in f:
            print(line.split(':')[0])
        f.seek(0,0)  # 把指针移动到文件最开始
        hostinfos = [line.strip() for line in f.readlines()]
    print("批量执行脚本".center(50, '*'))
    while True:
        cmd = input(">>:").strip()  # cmd uname
        if cmd:
            if cmd == 'exit' or cmd =='quit':
                print("执行结束, 退出中......")
                break
            for info in hostinfos:
                host, port, user, passwd = info.split(":")
                print(host.center(50, '-'))
                clientObj = SshRemoteHost(host, port, user, passwd, cmd)
                clientObj.run()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值