3

我的应用程序尝试执行根命令“sudo ifup eth0”和“ sudo ifdown eth0”。但它返回了一个错误“sudo:对不起,你必须有一个 tty 才能运行 sudo ”。因此,它需要一个 tty 来执行 sudo 命令。所以,我尝试通过打开 tty 会话来执行命令

gnome-terminal --command="sudo ifdown eth0" &
xterm -e "sudo ifdown eth0" &

然后它工作正常。但我无法从新创建的 gnome-terminal 或 xterm 发送命令。即,如果我在新创建的 gnome 或 xterm 窗口执行命令之前关闭它们,那么命令会立即终止。

您能否建议如何禁止用户关闭窗口或如何使其对用户不可见?

注意:您可以使用system-config-network命令而不是 ifdown 和 ifup来测试它

4

3 回答 3

4

我建议不要使用 xterm 或 gnome-terminal 为 sudo 提供终端,而是直接处理“对不起,您必须有一个 tty 才能运行 sudo”消息。

文件中有一个requiretty选项sudoers使 sudo 要求终端。如果未设置此选项!requiretty并且使用 NOPASSWD 选项执行命令,则 sudo 应该运行而无需打开新的终端窗口。此服务器故障帖子中有更多详细信息。

这就是 sudo 在 cron 脚本中的使用方式。

由于 requiretty 选项在 sudo 不仅用于 cron 脚本而且让远程用户以提升的权限发出命令的环境中提供了额外的安全性,因此可以限制 !requiretty 的操作。

   User_Alias LOCAL_USERS = john, mary
   Cmnd_Alias NETWORK_SCRIPTS = /sbin/ifup, /sbin/ifdown
   Defaults!NETWORK_SCRIPTS     !requiretty
   LOCAL_USERS ALL = NOPASSWD: NETWORK_SCRIPTS
于 2012-06-02T13:50:35.347 回答
3

如果您在 X 会话中运行您的代码,那么您可以使用gksudo而不是sudo

gksudo -m "Your message" /command/to/run

它将使用漂亮的 GUI 界面提示用户输入密码(如果需要)。无需 xterm 或 gnome-terminal。

效果将比允许特定命令在没有任何密码的情况下运行更安全,并且解决方案将更符合用户的习惯。

在此处输入图像描述

于 2012-06-02T15:19:10.253 回答
2

通常,sudo 或 su 需要提示输入密码,否则程序可以在没有用户干预的情况下提升其权限。如果您的应用程序出于某种目的需要提升,您将需要使用 xterm 或类似的。尽管在取回返回码方面存在困难(konsole 可能需要--nofork,gnome-terminal 可能需要--disable-factory,但选项因版本而异),而且在每个系统上都很难做到这一点。大多数 unix 和 linux 发行版都提供 xterm,但一些旧的 Fedora/RHEL/CentOS 提供没有 xterm 的 X,所以这是另一个需要考虑的依赖项。

由启动的命令xterm -e sudo -- ...然后可以执行标准的双叉和setsid。一旦用户在 xterm 中输入了他的密码,它就会立即消失,但您的命令会在后台以提升的权限运行。它可以使用套接字或 fifo 连接回原始程序,以作为根协同进程运行。

如果您想将现有应用程序包装在双叉和 setsid 中​​(例如,或者可能),daemonordisown命令或类似命令可能很有用。xterm -e sudo -- daemon system-config-networkxterm -e sudo -- bash -c "system-config-network & disown -a"

于 2012-06-02T14:55:50.707 回答