common.py 文件源码

python
阅读 22 收藏 0 点赞 0 评论 0

项目:ops_agent 作者: sjqzhang 项目源码 文件源码
def runShell(script, env=None, cwd="/", user=None, base64_encode=False):
    # check script
    import pwd, grp
    import pty

    if not script:
        return 0, ""

    try:
        # base64 decode
        if base64_encode:
            decode_script = base64.decodestring(script)
        else:
            decode_script = script

        # check user
        logger.info(decode_script)
        cur_user = pwd.getpwuid(os.getuid())[0]
        if not user or user == cur_user:
            shell_list = ["bash", "-c", decode_script.encode('utf8')]
        else:
            shell_list = ["su",  user, "-c", decode_script.encode('utf8'), "-s", "/bin/bash"]
        master_fd, slave_fd = pty.openpty()
        proc = Popen(shell_list, shell=False, universal_newlines=True, bufsize=1,
                     stdout=slave_fd, stderr=STDOUT, env=env, cwd=cwd, close_fds=True)
    except Exception, e:
        logger.error(e)
        return (1, str(e))

    timeout = .1
    outputs = ''
    while True:
        try:
            ready, _, _ = gs.select([master_fd], [], [], timeout)
        except gs.error  as ex:
            if ex[0] == 4:
                continue
            else:
                raise
        if ready:
            data = os.read(master_fd, 512)
            outputs += data
            if not data:
                break
        elif proc.poll() is not None:
            break
    os.close(slave_fd)
    os.close(master_fd)
    proc.wait()
    status = proc.returncode
    return (status, outputs)
评论列表
文章目录


问题


面经


文章

微信
公众号

扫码关注公众号