怎么禁止直接调用命令,但是脚本中可以使用?

86 天前
 nyxsonsleep

比如 rm 这个命令禁止在 console 中直接调用 rm tmp ,但是如果在 test.sh 中存在 rm tmp 不影响其功能。

1129 次点击
所在节点    问与答
18 条回复
la2la
86 天前
有个想法,指定专门执行 sh 的 user 有 rm 权限,其他 user 没有
nyxsonsleep
86 天前
不方便吧,脚本里面如果既有创建又有删除。
创建的文件的所有者会到处都搞乱了。
nyxsonsleep
86 天前
@la2la #1 不方便吧,脚本里面如果既有创建又有删除。
创建的文件的所有者会到处都搞乱了。
wheeler
86 天前
ebpf uprobe 拦截 bash readline
shadowyue
86 天前
这种问题麻烦请说你的原始需求,你分析过后的二次需求很可能有偏差
XiLingHost
86 天前
也许可以试试用 polkit 进行限制
fgwmlhdkkkw
86 天前
你自己实现一个 shell 就行……
duanxianze
86 天前
你把 rm 重命名一下就行,改一下只有你知道的名字,然后在你的脚本里调用
nyxsonsleep
86 天前
@shadowyue #5 这个就是原始需求,禁止某些不安全的命令在用户手里直接调用。但是在脚本中不要阻塞。
shadowyue
86 天前
#9
我觉得你找个需求还是能继续往上追溯根本诉求是啥?

因为看起来,你所说的用户能在 console 中执行命令,同时你认为在命令行执行 rm 不安全。
那么你的用户能自己编写脚本吗?
如果能,那用户自己写一个 test.sh 在里边执行 rm 不就可以了?
如果用户不能自己编写脚本,我不认为一个连 rm 这么简单脚本都搞不定的用户会去随意执行 rm 命令。
如果用户能查看脚本但是不能编辑,那按上面其他人提到的方案,看你一下的脚本不就知道你的花招具体怎么搞的了?
知道你的花招实现,就总有办法去破解了。
nyxsonsleep
86 天前
已解决。添加到 rc 文件即可。
alias rm='echo "The 'rm' command is disabled."'
if [ -z "$PS1" ]; then
unalias rm
fi

这个方法是存在一点缺陷的,但是对我来说已经够用了,echo 可以接收参数来执行命令,(这下注入攻击了 \doge
可以将上述中的 echo 替换为一个脚本,这个脚本单独忽略参数即可。
另外还可以检测环境变量,交互式 shell 中和脚本中的环境变量是不完全相同的。
nyxsonsleep
86 天前
@fgwmlhdkkkw #7
这样的答案确实让人耳目一新,仿佛在说:“如果你想要解决一个小问题,那就制造一个更大的工程来解决它!”真是太有启发性了!
nyxsonsleep
86 天前
@duanxianze #8 如果从外部下载的脚本如何执行呢?
duanxianze
86 天前
@nyxsonsleep 外部下载的?如果只是 rm ,那添加特定权限就好了,如果你是想安全执行外部脚本,那你应该考虑虚拟化方案
zihuyishi
86 天前
@nyxsonsleep 这不是掩耳盗铃么...
nyxsonsleep
86 天前
@zihuyishi #15 不审题做什么都是错的。
churchmice
86 天前
你直接给 rm 包个 wrapper ,真正的 rm 叫做 rm.real
wrapper 里面根据$- 变量判断当前的执行环境是否是 interactive mode,也就是用户直接在 console 执行
用 rm alias 的坏处是好多脚本里面会直接用\rm bypass 你的 alias
nyxsonsleep
86 天前
@churchmice #17 > 用 rm alias 的坏处是好多脚本里面会直接用\rm bypass 你的 alias

怎么理解这句话?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1076030

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX