我正在用Python制作一个Discord bot。我在shell上安装了一些很酷的命令(比如cowsay
),我希望将它们实现到机器人中,所以我的代码接近结尾:
else:
for i in bash_cmds:
if digested.startswith(prefix + i):
cmd = digested.replace(prefix, '')
msg = os.popen(cmd).read()
msg = '```' + msg + '```'
await client.send_message(channel, msg)
所以基本上,如果它以!!
+我在数组["cowsay", "cowthink", "fortune", "echo"]
中添加的任何BASh命令开始,那么在shell中执行命令。但是,这会带来一些安全问题。例如,可以写echo hackscript | bash
或nc -l 1337
或cat *
或rm *
(您明白了)。
我已经启动了一个命令列表,我不希望在命令中出现这些命令。但是,我不希望出现错误,以防止无法看到消息的成功部分。 (如果有人放cowsay foo && ls
,我仍然希望显示cowsay foo
的输出。)
我如何能够过滤掉可能的恶意命令并允许未过滤的部分消息成功?
我认为替换;
和&
之类的内容会有效,但我希望保留$()
之类的内容,以便人们可以使用cowsay $(fortune)
,但是然后人们可以做echo $(ls)
之类的事情...但我也不想过滤掉命令,因为:
一个。它可能有各种各样的方法
湾我不希望I eat 3 meals a day
变成I eat three mea a day
...
答案 0 :(得分:0)
您可以使用restricted shell。然后,您可以创建一个$PATH
,将int
设置为一个目录,该目录仅包含您希望由机器人执行的箱柜。
答案 1 :(得分:0)
听起来好像你想在论点
上调用类似https://docs.python.org/dev/library/shlex.html#shlex.quote的东西