如何将文件设置为仅对其他用户可执行但不可读取/写入,原因是我正在使用我的用户名执行某些操作,但我不想给出密码。我试过 :
chmod 777 testfile
chmod a=x
chmod ugo+x
当我以另一个用户身份执行时,我的权限仍然被拒绝。
答案1
前面的说法只说对了一半。您可以设置一个脚本,使其不被用户读取,但仍然可执行。该过程有点冗长,但可以通过在 /etc/sudoer 中设置例外来实现,以便用户可以暂时以自己的身份运行脚本,而不会提示输入密码。下面的例子:
我想与用户分享一些脚本:
me@OB1:~/Desktop/script/$ chmod 700 somescript.pl
me@OB1:~/Desktop/script/$ ls -l somescript.pl
-rwx------ 1 me me 4519 May 16 10:25 somescript.pl
制作一个调用 'somescript.pl' 的 shell 脚本并将其保存在 /bin/ 中:
me@OB1:/bin$ sudo cat somescript.sh
[sudo] password for me:
#!/bin/bash
sudo -u me /home/me/Desktop/script/somescript.pl $@
可选步骤在 /bin/ 中创建指向 somescript.sh 的符号链接:
sudo ln -s /bin/somescript.sh /bin/somescript
确保 shell 脚本对用户可读/可执行(无写访问权限):
sudo chmod 755 /bin/somescript.sh
me@OB1:/bin$ ls -l somescript*
lrwxrwxrwx 1 root root 14 May 28 16:11 somescript -> /bin/somescript.sh
-rwxr-xr-x 1 root root 184 May 28 18:45 somescript.sh
通过添加以下行在 /etc/sudoer 中进行例外处理:
# User alias specification
User_Alias SCRIPTUSER = me, someusername, anotheruser
# Run script as the user 'me' without asking for password
SCRIPTUSER ALL = (me) NOPASSWD: /home/me/Desktop/script/somescript.pl
布丁中的证据:
someuser@OB1:~$ somescript
***You can run me, but can't see my private parts!***
someuser@OB1:~$ cat /home/me/Desktop/script/somescript.pl
cat: /home/me/Desktop/script/somescript.pl: Permission denied
这种方法应该比尝试混淆Filter::Crypto
或PAR::Filter::Crypto
更好,Acme::Bleach
后者可以由确定的用户进行逆向工程。将脚本编译为二进制文件也是如此。如果您发现此方法有问题,请告诉我。对于更高级的用户,您可能需要完全删除 User_Alias 部分并将 SCRIPTUSER 替换为“%groupname”。这样您就可以使用usermod
命令管理脚本用户。
答案2
您需要对脚本具有读取和执行权限才能执行它。如果您无法读取脚本的内容,则也无法执行它。
tony@matrix:~$ ./hello.world
hello world
tony@matrix:~$ ls -l hello.world
-rwxr-xr-x 1 tony tony 17 Jul 13 22:22 hello.world
tony@matrix:~$ chmod 100 hello.world
tony@matrix:~$ ls -l hello.world
---x------ 1 tony tony 17 Jul 13 22:22 hello.world
tony@matrix:~$ ./hello.world
bash: ./hello.world: Permission denied
答案3
如果让其他用户执行一个程序,那么他们就可以知道该程序正在执行的所有操作,无论该程序文件是否可读。他们所需要做的就是指向一个调试器(或类似调试器的程序,例如strace
)。如果二进制可执行文件是可执行且不可读的,则它可以运行(脚本不能,因为解释器需要能够读取脚本),但这不会为您提供任何安全性。
如果您希望其他人能够像黑匣子一样执行您的程序,而不让他们确切地看到程序在做什么,您需要为您的脚本授予更高的权限:使其设定值给您的用户。只有root才能使用调试工具在 setuid 程序上。请注意,编写安全的 setuid 程序并不容易,并且大多数语言都不适合;看允许在 shell 脚本上设置 setuid以获得更多解释。如果您要编写 setuid 程序,我强烈推荐 Perl,它有一种模式(污点模式),明确旨在使安全的 setuid 脚本成为可能。
答案4
您可以使用 chmod 命令设置文件权限。 root 用户和文件所有者都可以设置文件权限。 chmod 有两种模式:符号模式和数字模式。
首先,您决定是为用户 (u)、组 (g)、其他人 (o) 还是三者 (a) 全部设置权限。然后,您可以添加权限 (+)、删除权限 (-),或者清除以前的权限并添加新权限 (=)。接下来,您决定是否设置读取权限 (r)、写入权限 (w) 或执行权限 (x)。最后,您将告诉 chmod 您要更改哪个文件的权限。
这里有一些例子。
清除所有权限,但为每个人添加读取权限:
$ chmod a=r filename
命令之后,文件的权限将为 -r--r--r--
为组添加执行权限:
$ chmod g+x filename
现在,文件的权限将是 -r--r-xr--
为文件所有者添加写入和执行权限。请注意如何同时设置多个权限:
$ chmod u+wx 文件名
之后,文件权限将为-rwxr-xr--
删除文件所有者和组的执行权限。再次注意如何同时设置它们:
$ chmod ug-x 文件名
现在,权限是-rw-r--r--
这是在符号模式下设置文件权限的快速参考:
Which user?
u user/owner
g group
o other
a all
What to do?
+ add this permission
- remove this permission
= set exactly this permission
Which permissions?
r read
w write
x execute