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)
评论列表
文章目录