有人可以建议我如何将 Linux 中的进程权限更改为 root 吗?
假设,我有一个正常的进程在某个用户下运行——考虑我。现在我的脚本应该使用“useradd”命令创建一些用户,我想在几个小时后禁用用户帐户。让我们以 5 小时为时间框架。每隔 5 小时,它应该启用该帐户,再过 5 小时,它应该禁用该帐户。
现在问题出在脚本上,如果我尝试仅通过输入“su”命令来获得 root 访问权限,它会要求提示。好吧,我的目的是从远程客户端调用此脚本(可能通过 .net 或 Java 中的 Web 服务)。
那么有没有一种方法可以让我更改为 root 模式并在 Linux 中创建/启用/禁用帐户而不给出任何提示(需要等待某人的输入)?假设我有 root 密码。
我确实尝试使用管道命令,如下所示:
echo "password" | su
但不知怎的,它让我想起了提示。如果我成功地在没有提示的情况下直接运行脚本,我可以继续通过 Web 服务执行相同的操作。
答案1
也许你熟悉sudo command
,/etc/suoders file
如果你想写同样的东西,你可以阅读它的代码。
答案2
作为MSV评论中指出,整个前提听起来像是XY问题这对于安全来说是一场噩梦,但我将尝试解决无需密码即可获得 root 权限的问题。
首先,echo "password" | su
它不起作用,因为su
它不从 读取密码stdin
,而是/dev/tty
直接打开进行读取。虽然有工具(例如预计)可用于自动化交互式程序,但从安全角度来看,自动获取 root shell 以便以 root 身份调用特定命令的方法是不好的,因为它违反了最小特权原则。
也就是说,可以使用如下内容su
来自动化身份验证:expect
#!/usr/bin/expect -f
spawn su
expect "Password:"
send "password\n";
interact
如果目标是允许以 root 身份调用特定命令,而不需要 root 凭据,那么适合该作业的工具是sudo
。例如,如果希望允许wheel
组中的用户无需输入密码即可运行useradd
,可以通过/etc/sudoers
在sudoedit
命令中添加以下节来实现:
%wheel ALL = NOPASSWD: /usr/sbin/useradd
设置此类权限时,谨慎的做法是至少确保该功能仅限于特定用户或独占组。
至于使用此方法通过 CGI 脚本或类似方法添加用户,通常不希望直接向面向 Web 的软件授予此类权限,而是在两者之间添加一定程度的权限分离。实际特权可以授予单独的软件组件,例如守护程序,Web 应用程序将要求该组件(通过 IPC)代表其执行特权操作。通过这种方式,特权进程和 Web 应用程序都可以完成输入验证,以最大限度地降低 Web 应用程序中可利用缺陷的风险,从而允许使用useradd
任意参数调用特权操作(在本例中),或者更糟糕的是,例如作为以提升的权限执行任意代码。
答案3
我知道有两个工具是为这种情况设计的:Expect 和 Empty。它们都等待程序侦听标准输入,然后为其提供预定值。 Expect基于TCL,拥有比较庞大的用户基础。 Empty 的依赖项较少,但支持可能较少。每个页面上都应该有足够的文档来解决这个简单的问题。