我需要在没有密码的情况下以 sudo 的形式运行一些东西,所以我使用visudo并将其添加到我的sudoers文件中:
MYUSERNAME ALL = NOPASSWD: /path/to/my/program
Run Code Online (Sandbox Code Playgroud)
然后我试了一下:
$ sudo /path/to/my/program
[sudo] password for MYUSERNAME:
Run Code Online (Sandbox Code Playgroud)
为什么它要求输入密码?如何在不要求密码的情况下以非 root 用户身份以 root 身份运行/使用命令?
我想知道如何从脚本中以另一个用户身份运行命令。
我将脚本的所有者设置为 root。我还在脚本中运行以下命令以作为 hudson 用户运行命令:
su -c command hudson
Run Code Online (Sandbox Code Playgroud)
这是正确的语法吗?
如果没有读取权限,是否可以执行脚本?在 root 模式下,我制作了一个脚本,我希望其他用户执行此脚本但不读取它。我确实chmod禁止读写但允许执行,但是在用户模式下,我看到消息说:权限被拒绝。
我有一个由普通用户运行时需要 root 权限的进程。显然我可以使用“setuid 位”来完成此操作。在 POSIX 系统上执行此操作的正确方法是什么?
另外,如何使用使用解释器(bash、perl、python、php 等)的脚本执行此操作?
一个巨大的应用程序需要在某个特定时间对需要 root 权限的文件执行少量写入。它不是真正的文件,而是作为文件暴露给 Linux 的硬件接口。
为了避免为整个应用程序授予 root 权限,我编写了一个 bash 脚本来执行关键任务。例如,以下脚本将启用硬件接口的端口 17 作为输出:
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
Run Code Online (Sandbox Code Playgroud)
但是,由于suid我系统上的 bash 脚本被禁用,我想知道实现这一目标的最佳方法是什么。
使用此处介绍的一些解决方法
sudo从主应用程序调用脚本,并相应地编辑 sudoers 列表,以避免在调用脚本时需要密码。授予 sudo 权限让我有点不舒服echo。
只需编写一个 C 程序,使用fprintf,并将其设置为 suid root。对字符串和文件名进行硬编码,并确保只有 root 可以编辑它。或者从文本文件中读取字符串,同样确保没有人可以编辑该文件。
我没有想到的其他一些解决方案比上面介绍的更安全或更简单?
为什么shebang需要路径?
错误的
#!ruby
Run Code Online (Sandbox Code Playgroud)
正确的
#!/usr/local/bin/ruby
#!/usr/bin/env ruby
Run Code Online (Sandbox Code Playgroud)
操作系统应该有关于注册命令的路径的信息,为什么它仍然期望它被给出?
我想确保我的程序只能由xyz使用 root 权限的用户运行。为此,我设置了 setuid 位:
chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh
Run Code Online (Sandbox Code Playgroud)
此外,我将用户添加xyz到house组中,以便只有xyzroot 用户可以运行 program1.sh。
在 program1.sh 中有
id -u
Run Code Online (Sandbox Code Playgroud)
以便它可以向我显示有效 ID。
program1.sh以 root 身份运行,它显示root. 但是使用该xyz帐户运行时,它显示xyz. 似乎它没有以 root 权限运行。我不知道这里出了什么问题。
我进行了一些试验并注意到一些奇怪的事情:在位于 bash 的副本上设置 setuid 位/usr/bin/bash-test似乎没有效果。当我运行一个实例时bash-test,我的主目录没有设置为/root,当我whoami从运行命令时bash-test,我的用户名没有被报告为是root,这表明它bash-test没有以 root 身份运行。但是,如果我将 setuid 位设置为 on whoami,则正如预期的那样,我被报告为任何 shell 中的 root 用户。
我也尝试设置 setuid 位/usr/bin/bash并观察到相同的行为。
当我在其上设置 setuid 位时,为什么 bash 没有以 root 身份运行?selinux 可能与此有关吗?
如何将文件设置为仅对其他用户可执行但不可读写,原因是我正在使用我的用户名执行某些操作,但我不想给出密码。我试过 :
chmod 777 testfile
chmod a=x
chmod ugo+x
Run Code Online (Sandbox Code Playgroud)
以其他用户身份执行时,我仍然获得权限被拒绝。
我在几个地方看到了使用以下shebang行的建议
#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud)
代替
#!/usr/bin/bash
Run Code Online (Sandbox Code Playgroud)
我的下意识反应是,“如果有人用这个可执行文件代替他们自己的 ~/.local/bin怎么办?” 该目录通常设置在系统范围路径之前的用户路径中。我认为这是作为一个安全问题提出的,通常是作为旁注而不是任何值得认真对待的事情,但我想测试这个理论。
为了尝试这个,我做了这样的事情:
echo -e "#!/usr/bin/python\nprint 'Hacked!'" > $HOME/.local/bin/bash
chmod 755 $HOME/.local/bin/bash
PATH=$HOME/.local/bin env bash
Run Code Online (Sandbox Code Playgroud)
这产生
/usr/bin/env: ‘bash’: No such file or directory
Run Code Online (Sandbox Code Playgroud)
为了检查它是否捡到任何东西,我也做了
echo -e "#!/usr/bin/python\nprint 'Hacked!'" > $HOME/.local/bin/perl
chmod 755 $HOME/.local/bin/perl
PATH=$HOME/.local/bin env perl
Run Code Online (Sandbox Code Playgroud)
打印出来,正如我所料,
Hacked!
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么bash找不到替代品,但找到了替代品perl吗?这是某种“安全”措施(从我的角度来看)没有抓住要点吗?
编辑:因为我被提示:我不是问/usr/bin/env bash与使用/bin/bash. 我在问上面提到的问题。
EDIT2:一定是我做错了什么。今天再次尝试(使用显式路径env而不是隐式路径),没有这种“未找到”行为。
setuid ×4
bash ×3
linux ×3
scripting ×3
executable ×2
permissions ×2
privileges ×2
security ×2
sudo ×2
chmod ×1
path ×1
root ×1
shell-script ×1
su ×1