22import shlex
33import subprocess
44
5+ from amrita .plugins .menu .models import MatcherData
6+ from amrita .plugins .perm .API .rules import UserPermissionChecker
7+ from amrita .utils .send import send_forward_msg
58from nonebot import on_command
69from nonebot .adapters .onebot .v11 import Bot , Message , MessageEvent , MessageSegment
710from nonebot .exception import FinishedException
811from nonebot .params import CommandArg
12+ from nonebot .permission import Permission
913
10- from amrita .plugins .menu .models import MatcherData
11- from amrita .plugins .perm .API .rules import UserPermissionChecker
12- from amrita .utils .send import send_forward_msg
1314from . import container_exec
15+ from .config import CONFIG
1416
1517docker_check = UserPermissionChecker (permission = "admin.exec.safe" )
1618host_check = UserPermissionChecker (permission = "admin.exec.full" )
1719permission = host_check .checker ()
1820permission_docker = docker_check .checker ()
1921
20- execute_in_docker = on_command ("exec" ,
21- state = MatcherData (name = "执行命令(docker)" , usage = "/exec <command>" , description = "在docker执行命令" ).model_dump (),
22- priority = 1 ,
23- block = True ,
24- rule = permission_docker or permission )
22+ execute_in_docker = on_command (
23+ "exec" ,
24+ state = MatcherData (
25+ name = "执行命令(docker)" , usage = "/exec <command>" , description = "在docker执行命令"
26+ ).model_dump (),
27+ priority = 1 ,
28+ block = True ,
29+ permission = Permission (permission_docker , permission ),
30+ rule = lambda : CONFIG .enable_docker ,
31+ )
32+
33+ execute = on_command (
34+ "exec.host" ,
35+ state = MatcherData (
36+ name = "执行命令(host)" ,
37+ usage = "/exec.host <command>" ,
38+ description = "在宿主机执行命令" ,
39+ ).model_dump (),
40+ priority = 1 ,
41+ block = True ,
42+ rule = permission ,
43+ )
2544
26- execute = on_command ("exec.host" ,
27- state = MatcherData (name = "执行命令(host)" , usage = "/exec.host <command>" , description = "在宿主机执行命令" ).model_dump (),
28- priority = 1 ,
29- block = True ,
30- rule = permission )
3145
3246@execute .handle ()
3347async def _ (event : MessageEvent , bot : Bot , args : Message = CommandArg ()):
@@ -41,20 +55,27 @@ async def _(event: MessageEvent, bot: Bot, args: Message = CommandArg()):
4155 * cmd_parts , stdout = subprocess .PIPE , stderr = subprocess .PIPE , shell = False
4256 )
4357 try :
44- stdout , stderr = await asyncio .wait_for (execute_result .communicate (), timeout = 10 )
58+ stdout , stderr = await asyncio .wait_for (
59+ execute_result .communicate (), timeout = 10
60+ )
4561 except asyncio .TimeoutError :
4662 execute_result .kill ()
4763 await execute .finish ("执行超时" )
4864 results = [
4965 MessageSegment .text (f"执行结果:{ stdout .decode ('utf-8' )} " ),
50- MessageSegment .text (f"执行失败:{ stderr .decode ('utf-8' )} " ) if stderr else None
66+ MessageSegment .text (f"执行失败:{ stderr .decode ('utf-8' )} " )
67+ if stderr
68+ else None ,
5169 ]
52- await send_forward_msg (bot , event , name = "执行结果" , uin = bot .self_id , msgs = results )
70+ await send_forward_msg (
71+ bot , event , name = "执行结果" , uin = bot .self_id , msgs = results
72+ )
5373 except FinishedException :
5474 pass
5575 except Exception as e :
5676 await bot .send (event , f"执行失败:{ e } " )
5777
78+
5879@execute_in_docker .handle ()
5980async def _ (event : MessageEvent , bot : Bot , args : Message = CommandArg ()):
6081 try :
@@ -63,14 +84,12 @@ async def _(event: MessageEvent, bot: Bot, args: Message = CommandArg()):
6384 await execute_in_docker .finish ("请输入要执行的命令" )
6485 cmd_parts = shlex .split (cmd_text )
6586
66- logs , exit_code = await container_exec .execute_in_docker (
67- * cmd_parts
68- )
69- results = [
70- MessageSegment .text (f"exit_code: { exit_code } \n 执行结果:{ logs } " )
71- ]
72- await send_forward_msg (bot , event , name = "执行结果" , uin = bot .self_id , msgs = results )
87+ logs , exit_code = await container_exec .execute_in_docker (* cmd_parts )
88+ results = [MessageSegment .text (f"exit_code: { exit_code } \n 执行结果:{ logs } " )]
89+ await send_forward_msg (
90+ bot , event , name = "执行结果" , uin = bot .self_id , msgs = results
91+ )
7392 except FinishedException :
7493 pass
7594 except Exception as e :
76- await bot .send (event , f"执行失败:{ e } " )
95+ await bot .send (event , f"执行失败:{ e } " )
0 commit comments