🐛 修正执行shell脚本超时无法获取标准输出结果的问题,顺带加大tg消息行数,尽量不生成日志文件方便阅读
This commit is contained in:
@@ -713,22 +713,32 @@ def gen_daily_code(update, context):
|
|||||||
def shcmd(update, context):
|
def shcmd(update, context):
|
||||||
"""
|
"""
|
||||||
执行终端命令,超时时间为60,执行耗时或者不退出的指令会报超时异常
|
执行终端命令,超时时间为60,执行耗时或者不退出的指令会报超时异常
|
||||||
:param update:
|
|
||||||
:param context:
|
|
||||||
:return:
|
|
||||||
"""
|
"""
|
||||||
if is_admin(update.message.from_user.id):
|
if is_admin(update.message.from_user.id):
|
||||||
commands = update.message.text.split()
|
commands = update.message.text.split()
|
||||||
commands.remove('/cmd')
|
commands.remove('/cmd')
|
||||||
if len(commands) > 0:
|
if len(commands) > 0:
|
||||||
support_cmd = ["ls", "cp", "mv", "wget", "cat", "sed", "git", "sh", "docker_entrypoint.sh"]
|
support_cmd = ["echo", "ls", "pwd", "cp", "mv", "ps", "wget", "cat", "sed", "git", "sed", "apk", "sh",
|
||||||
|
"docker_entrypoint.sh"]
|
||||||
if commands[0] in support_cmd:
|
if commands[0] in support_cmd:
|
||||||
|
sp_cmd = ["sh", "docker_entrypoint.sh"]
|
||||||
cmd = ' '.join(commands)
|
cmd = ' '.join(commands)
|
||||||
try:
|
try:
|
||||||
out_bytes = subprocess.check_output(
|
# 测试发现 subprocess.check_output 执行shell 脚本文件的时候无法正常执行获取返回结果
|
||||||
cmd, shell=True, timeout=60, stderr=subprocess.STDOUT)
|
# 所以 ["sh", "docker_entrypoint.sh"] 指令换为 subprocess.Popen 方法执行
|
||||||
out_text = out_bytes.decode('utf-8')
|
out_text = ""
|
||||||
if len(out_text.split()) > 50:
|
if commands[0] in sp_cmd:
|
||||||
|
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
|
||||||
|
while p.poll() is None:
|
||||||
|
line = p.stdout.readline()
|
||||||
|
# logger.info(line.decode('utf-8'))
|
||||||
|
out_text = out_text + line.decode('utf-8')
|
||||||
|
else:
|
||||||
|
out_bytes = subprocess.check_output(
|
||||||
|
cmd, shell=True, timeout=60, stderr=subprocess.STDOUT)
|
||||||
|
out_text = out_bytes.decode('utf-8')
|
||||||
|
|
||||||
|
if len(out_text.split('\n')) > 100:
|
||||||
msg = context.bot.sendMessage(text='```{}```'.format(
|
msg = context.bot.sendMessage(text='```{}```'.format(
|
||||||
helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % cmd)),
|
helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % cmd)),
|
||||||
chat_id=update.effective_chat.id,
|
chat_id=update.effective_chat.id,
|
||||||
@@ -754,7 +764,8 @@ def shcmd(update, context):
|
|||||||
else:
|
else:
|
||||||
update.message.reply_text(
|
update.message.reply_text(
|
||||||
text='```{}```'.format(
|
text='```{}```'.format(
|
||||||
helpers.escape_markdown(f' →→→ {commands[0]}指令不在支持命令范围,请输入其他支持的指令{"|".join(support_cmd)} ←←← ')),
|
helpers.escape_markdown(
|
||||||
|
f' →→→ {commands[0]}指令不在支持命令范围,请输入其他支持的指令{"|".join(support_cmd)} ←←← ')),
|
||||||
parse_mode=ParseMode.MARKDOWN_V2)
|
parse_mode=ParseMode.MARKDOWN_V2)
|
||||||
else:
|
else:
|
||||||
update.message.reply_text(
|
update.message.reply_text(
|
||||||
|
Reference in New Issue
Block a user