我换了种做法,
每种查询类命令比如 ps/ss, 查询后, 一般都是做grep 操作
我们限制用户执行的命令种类, 比如 ps/ss, 用户post时, 选择执行的命令类型,
并只能添加过滤关键字, 格式类似于
key1 key2 key3
依次校验 key1..., 限制key只能是单词或包含有限的特殊字符, 拼接执行时不会对系统产生影响的,
这类校验就比较简单了, 一个正则就可以确定,
如下
word_re = re.compile(r'([a-zA-Z0-9\.]+)')
greps = []
for key in keys:
matches = word_re.findall(key)
# key 包含特殊字符
if len(matches) == 0 or len(matches) > 1 or matches[0] != key:
return send_msg(from_user, f'进程关键字包含特殊字符: {key}')
greps.append(f'grep -i {key}')
cmd = f'ps -ef | {"|".join(greps)}'
在拼接命令后, 最终的执行格式如下
ps -ef | grep key1 | grep key2 | grep key3
这样就达到了在用户post关键字后校验命令仅会查询, 不会对系统产生影响