41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
import asyncio
|
||
from getpass import getuser
|
||
from io import BytesIO
|
||
from platform import node
|
||
|
||
from core import command
|
||
from pyrogram import Client
|
||
from pyrogram.types import Message
|
||
from tools.helpers import Parameters, basher, delete_this, show_cmd_tip, show_exception
|
||
|
||
|
||
@Client.on_message(command("sh"))
|
||
async def shell(_: Client, msg: Message):
|
||
"""执行shell脚本"""
|
||
cmd, _input = Parameters.get(msg)
|
||
if not _input:
|
||
return await show_cmd_tip(msg, cmd)
|
||
|
||
try:
|
||
res = await basher(_input, timeout=30)
|
||
except asyncio.exceptions.TimeoutError:
|
||
return await show_exception(msg, "Connection Timeout!")
|
||
|
||
_output: str = res.get('output') if not res.get(
|
||
'error') else res.get('error')
|
||
header = f"**{getuser()}@{node()}**\n"
|
||
all_bytes = len(header.encode() + _input.encode() + _output.encode())
|
||
if all_bytes >= 2048:
|
||
await delete_this(msg)
|
||
return await msg.reply_document(
|
||
document=BytesIO(_output.encode()),
|
||
caption=f"{header}> # `{_input}`",
|
||
file_name="output.log",
|
||
parse_mode='md'
|
||
)
|
||
|
||
await msg.edit_text(
|
||
f"{header}> # `{_input}`\n```{_output.strip()}```",
|
||
parse_mode='md'
|
||
)
|