首页 > 解决方案 > if 条件基于读取 paramiko 通道缓冲区

问题描述

我已经修改了代码并使用 paramiko 重新发布,我以 normal_user 身份登录并在多个服务器上执行“sudo su -”。很少有服务器 normal_user 具有 NOPASSWD 选项的 sudo 访问权限,其中不要求 root 访问密码。少数服务器 normal_user 具有 sudo 访问权限并询问密码。少数服务器 normal_user 不在 sudoers 文件中。但是当 sudo su - 给出时,它会询问密码,然后告诉用户不在 sudoers 文件中

下面是我的代码。如果用户被要求输入 sudo 密码并且即使不要求密码也可以工作,当用户不在 sudoers 文件中时脚本不可用。它应该报告“normal_user 不在 sudoers 文件中。将报告此事件。” pss 建议

import paramiko
import time
import sys
import os

User_name=raw_input('Enter User name: ')
Pass_word=raw_input('Enter the password: ')
cmd=raw_input('Enter the command: ')
def node_shell(hostname, site_user, site_passwd):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy( paramiko.AutoAddPolicy() )

    try:
        ssh.connect(hostname, username=site_user, password=site_passwd, timeout=3)
        transport = ssh.get_transport()
        transport.set_keepalive(1)

        while True:
            try:
                channel = ssh.invoke_shell()
                channel.settimeout(60)

                channel.send('sudo su -' + '\n')
                buff = ''
                while not (buff.endswith(User_name + ': ') or buff.endswith('# ')):
                    resp = channel.recv(9999)
                    buff += resp
                time.sleep(2)
                if buff.endswith(User_name + ': '):
                    channel.send('mm' + '\n')
                    buff=''
                    while not (buff.endswith('# ') or buff.endswith('reported. ')):
                       resp = channel.recv(9999)
                       buff += resp
                    time.sleep(5)
                    if buff.endswith('reported. '):
                        resp = channel.recv(9999)
                        buff += resp
                        time.sleep(2)
                        print "User does not have sudo access"
                        sys.exit(1)
                channel.send(cmd + '\n')
                buff = ''
                while not buff.endswith('# '):
                    resp = channel.recv(9999)
                    buff += resp
                time.sleep(5)
                return buff

            except Exception as e:
                print("ERROR: s failed: %s" % (hostname, e))


    except Exception as e:
        print("%s: failed to login : %s" % (hostname, e))
        ssh.close()
    return

标签: pythonparamiko

解决方案


推荐阅读