我的应用程序尝试执行root命令“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
来测试答案 0 :(得分:3)
我建议不要使用xterm或gnome-terminal为sudo提供终端,但要处理“抱歉,你必须有一个tty才能直接运行sudo”消息。
requiretty
文件中有一个sudoers
选项,可以让sudo请求终端。如果使用!requiretty
取消设置此选项,并且使用NOPASSWD选项执行该命令,则无需打开新的终端窗口即可运行sudo。此服务器故障post中有更多详细信息。
这就是如何在cron脚本中使用sudo。
由于requiretty选项在不仅在cron脚本中使用sudo而且让远程用户使用提升的权限发出命令的环境中提供了额外的安全性,因此可以限制!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
答案 1 :(得分:3)
如果您在X会话中运行代码,则可以使用gksudo
代替sudo
:
gksudo -m "Your message" /command/to/run
它将使用漂亮的GUI界面提示用户输入密码(如果需要)。不需要xterm或gnome-terminal。
效果将比允许特定命令在没有任何密码的情况下运行更安全,并且解决方案将更加符合用户习惯。
答案 2 :(得分:2)
通常,sudo或su需要提示输入密码,否则程序可能会在没有用户干预的情况下升级其权限。如果您的应用程序需要提升某些目的,您将需要使用xterm或类似的。虽然收到返回代码有困难(konsole可能需要--nofork
而gnome-terminal可能需要--disable-factory
,但选项可能会因版本而有所不同),而且每次都很难做到正确系统。大多数unix和linux发行版都提供了xterm,但是一些旧的Fedora / RHEL / CentOS在没有xterm的情况下提供了X,所以它是另一个需要思考的依赖。
xterm -e sudo -- ...
启动的命令可以执行标准的双叉和setsid。一旦用户在xterm中输入了密码,它就会立即消失,但是您的命令会在后台运行并具有提升的权限。它可以使用套接字或fifo连接回原始程序,以作为根协同进程运行。
如果要将现有应用程序包装在双叉和&组合中,daemon
或disown
命令或类似命令可能会很有用。 setsid(例如,xterm -e sudo -- daemon system-config-network
或者xterm -e sudo -- bash -c "system-config-network & disown -a"
)。