【问题标题】:How to Open xterm window from a terminal and run a command in background from xterm?如何从终端打开 xterm 窗口并在后台从 xterm 运行命令?
【发布时间】:2012-06-02 13:36:43
【问题描述】:

我的应用程序尝试执行根命令“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

进行测试

【问题讨论】:

    标签: linux shell command-line xterm gnome-terminal


    【解决方案1】:

    我建议不要使用 xterm 或 gnome-terminal 来为 sudo 提供终端,而是直接处理 "sorry, you must have a tty to run sudo" 消息。 p>

    sudoers 文件中有一个requiretty 选项使 sudo 请求终端。如果使用!requiretty 未设置此选项,并且使用 NOPASSWD 选项执行命令,则 sudo 应该无需打开新的终端窗口即可运行。这个serverfaultpost有更多细节。

    这就是 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
    

    【讨论】:

    • 但这会在系统中增加安全漏洞...根据这篇文章:maymay.net/blog/2010/03/17/…
    • 我无法编辑公司中的所有 linux 系统。感谢关于使用 NOPASSWD 选项的一项建议,我将用于非 root 用户
    • 关于您提到的安全问题,您可以将 !requiretty 仅限于特定命令或用户。
    • sudo 应该需要一个 tty。这通常是可以接受的。当您启动 sudo 时,它可能无论如何都需要密码,因此您不能指望它能够在没有用户干预的情况下运行。
    • 嗨 Nicholas,我在 /etc/sudoers 文件中对网络命令使用 NOPASSWD 选项的任何方式。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 您好,我正在使用 RHEL5 和 gnome 会话,但找不到该命令。
    • @Rajasekhar:在 RHEL/CentOS/Fedora 上,您可以使用 consolehelper 或 userhelper,但我没有这方面的经验,抱歉。
    【解决方案3】:

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

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

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

    【讨论】:

    • 我从 RHEL5 gnome 终端执行了这个命令,如果我关闭了新打开的 xterm 窗口,那么 system-config-network 窗口也会关闭。我希望打开系统配置网络窗口,直到我关闭它(或直到执行 ifup 命令)。
    • 啊。在 linux 上,您可能需要setsid(1) 而不是daemon。那应该没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多