如何使bash脚本对用户可执行,但不可读

我试图在login时运行一个脚本,该脚本将为普通用户执行,但不能被该或其他非root用户读取。

我已经尝试了各种东西,包括chmod / chown组合,以及visudo 。 在任何情况下,我都可以在login时执行脚本,但仍然以用户的身份读取脚本,或者无法读取脚本,也无法在login时执行脚本。

也试过我可以使用的shc ,但是还留下一个可执行文件,可以复制/上传等并反编译。

这是关于我做错了chmodchownvisudo吗?

首先, visudo(8)只是/etc/sudoers文件的推荐编辑器 。 没有其他的。 它是这样的,因为它做了一些语法检查,以及基本的规则parsing,以便警告你,如果你只是在拍摄自己的脚。 这不是完美的,但它已被certificate是非常有帮助的。

也就是说,以下几行显示了如何在不使用SETUID技巧的情况下授予不可读文件的执行权限。 我已经使用了root/root/bin/ ,但是对于授予执行权限的用户没有对该文件的读取权限的任何其他场景,情况都是如此。

像往常一样, #符号表示命令由root运行, $符号表示非特权用户运行的行:

 # adduser foo ... # id foo uid=1002(foo) gid=1002(foo) groups=1002(foo) # grep foo /etc/sudoers Defaults:foo secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/bin" foo ALL = (root) /root/bin/bar # ls -lrt /root/bin/bar -rwx------. 1 root root 38 Oct 4 20:22 /root/bin/bar # cat /root/bin/bar printf "Welcome to the Terrordome!\n" # su - foo $ id uid=1002(foo) gid=1002(foo) groups=1002(foo) $ sudo bar Welcome to the Terrordome! $ cat /root/bin/bar cat: /root/bin/bar: Permission denied 

我不认为你可以阻止人们阅读文件,因为他们需要能够读取它来执行它。

Bash必须能够读取脚本的内容。

你可以把一个setuid的可执行文件放在bash脚本的前面,就像编译后的二进制文件/可执行文件一样,但是这个bash已经不是bash了。

运行一个bash脚本涉及运行bash解释器(这将是一个进程),以及解释器读取文件,然后跟随文件内的脚本。 如果用户拥有的进程可以读取文件,则用户自己可以读取该文件。

这留下了唯一的select,允许用户产生一个由root拥有的进程,并拥有该根进程读取你的脚本。 这可以在一些使用setuidfunction的发行版中完成,但通常被认为是一个坏主意,如果脚本有任何错误,可能会导致安全漏洞。