Linux 如何从终端打开xterm窗口并从xterm在后台运行命令?

Linux 如何从终端打开xterm窗口并从xterm在后台运行命令?,linux,shell,command-line,xterm,gnome-terminal,Linux,Shell,Command Line,Xterm,Gnome Terminal,我的应用程序尝试执行root命令“sudo ifup eth0”和“sudo ifdown eth0”。但它返回了一个错误“sudo:对不起,您必须有一个tty才能运行sudo”。 因此,执行sudo命令需要tty。因此,我试图通过打开tty会话来执行这些命令 gnome-terminal --command="sudo ifdown eth0" & xterm -e "sudo ifdown eth0" & 然后它工作得很好。但我无法从新创建的gnome终端或xterm发送命

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

gnome-terminal --command="sudo ifdown eth0" &
xterm -e "sudo ifdown eth0" &
然后它工作得很好。但我无法从新创建的gnome终端或xterm发送命令。 i、 例如,如果我在新创建的gnome或xterm窗口执行命令之前关闭它们,那么命令会立即终止

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


注意:您可以使用系统配置网络命令来测试这一点,而不是使用ifdown和ifup

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

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

例如,在cron脚本中,sudo就是这样使用的

由于requirety选项在sudo不仅在cron脚本中使用,而且允许远程用户以提升的权限发出命令的环境中提供了额外的安全性,因此!要求是可以限制的

   User_Alias LOCAL_USERS = john, mary
   Cmnd_Alias NETWORK_SCRIPTS = /sbin/ifup, /sbin/ifdown
   Defaults!NETWORK_SCRIPTS     !requiretty
   LOCAL_USERS ALL = NOPASSWD: NETWORK_SCRIPTS

通常,sudo或su需要提示输入密码,否则程序可能会在没有用户干预的情况下升级其权限。如果您的应用程序出于某种目的需要升级,则需要使用xterm或类似工具。虽然在获取返回代码时存在困难(konsole可能需要
--nofork
,gnome终端可能需要
--disable factory
,但选项因版本而异),而且在每个系统上都不容易正确获取。大多数Unix和linux发行版都提供xterm,但是一些旧的Fedora/RHEL/CentOS提供了没有xterm的X,所以这是另一个需要考虑的依赖关系

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


如果要将现有应用程序包装在双fork&setId中(例如,
xterm-e sudo--daemon system config network
或者
xterm-e sudo--bash-c“system config network&disown-a”
),则
守护程序
xterm-e sudo--bash-c“系统配置网络&disown-a”
).

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

gksudo -m "Your message" /command/to/run
它将使用漂亮的GUI界面提示用户输入密码(如果需要)。无需使用xterm或gnome终端

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


但这会在系统中增加安全漏洞。。。根据这篇文章:我不能编辑一家公司的所有linux系统。感谢您提出关于使用NOPASSWD选项的建议,我将对非root用户使用该选项。请注意您提到的可以限制的安全问题!仅对特定命令或用户要求。sudo应要求tty。这通常是可以接受的。当你启动sudo时,它可能无论如何都需要一个密码,所以你不能指望它能够在没有用户干预的情况下运行。嗨,Nicholas,我正在为/etc/sudoers文件中的网络命令使用NOPASSWD选项。嗨,我正在使用RHEL5和gnome会话,但找不到该命令。@Rajasekhar:在RHEL/CentOS/Fedora上,您可以使用
consolehelper
userhelper
,但我没有这方面的经验,抱歉。我是从RHEL5 gnome终端执行此命令的,如果我关闭新打开的xterm窗口,然后系统配置网络窗口也关闭。我想打开系统配置网络窗口,直到我关闭它(或者直到执行ifup命令)。啊。在linux上,您可能需要
setsid
(1)而不是
守护进程
。那应该很好。