【问题标题】:How do I run my application as superuser from Eclipse?如何从 Eclipse 以超级用户身份运行我的应用程序?
【发布时间】:2011-02-04 12:50:31
【问题描述】:

当我尝试从 Eclipse 运行服务器应用程序时遇到错误。错误是 java.net.BindException: Permission denied。我认为这是因为我使用端口 443 来建立 SSL 连接。如果我使用 java 和 sudo 在命令行上运行我的代码,我可以解决这个问题。有没有办法设置 Eclipse,以便当我点击运行按钮时,我的应用程序使用 sudo 执行?

【问题讨论】:

  • javac 怎么会要求sudo 访问?您可能需要编辑问题以避免混淆
  • 就像我在问题中所说的,我相信这是因为我正在尝试使用 SSLServerSocket 绑定到端口 443。不过我可能是错的。
  • 如果我正确理解了这个问题,Ronald 使用 javac 编译然后使用 sudo 执行。如果程序试图绑定端口 443,它可能会导致问题,因为在 UNIX/Linux 系统中,任何低于 1024 的端口号都保留给 root 访问。
  • 是的,在 Eclipse 之外我执行以下操作:1)javac Server.java 2) sudo java Server。这可行,但我想继续使用 Eclipse,所以我需要弄清楚如何让 Eclipse 将应用程序作为 sudo 运行。我开始认为这是不可能的。
  • 但问题不在于javac。这是java(可执行文件)。

标签: java eclipse ssl client-server sudo


【解决方案1】:

您可以按照以下步骤以超级用户身份编译/调试应用程序。

  1. 重命名您的 java 应用程序

    sudo mv /usr/lib/jvm/java-6-openjdk/jre/bin/java /usr/lib/jvm/java-6-openjdk/jre/bin/java.ori

  2. 创建以下脚本并将其存储为 /usr/lib/jvm/java-6-openjdk/jre/bin/java

    #!/bin/bash
    # file:  /usr/lib/jvm/java-6-openjdk/jre/bin/java
    # descr: Starter for jdk. Runs jdk as root when 
    #        cmd-line-arg "--run-as-root" is specified.
    #
    jre="/usr/lib/jvm/java-6-openjdk/jre/bin/java.ori"
    run_as_root=false
    args=
    
    # Filter command-line argument
    for arg in "$@"
    do
      case "$arg" in
      --run-as-root)  run_as_root=true
                      ;;
      *)              args="$args $arg"
                      ;;
    
      esac
    done
    
    # Remove leading whitespaces
    args=$(echo $args | sed -e 's/^[ \t]*//')
    
    if $run_as_root
    then
      echo "WARNING: Running as root!"
      gksu "$jre $args"
    else
      $jre $args
    fi
    
  3. 更改权限使其可执行

    sudo chmod 0755 /usr/lib/jvm/java-6-openjdk/jre/bin/java

  4. 启动eclipse

  5. 转到窗口->首选项->Java->已安装的 JRE
  6. 将 java-6-openjdk 复制到 java-6-openjdk-root
  7. 编辑 JRE 并添加“--run-as-root”作为默认 VM 参数

要以 root 身份运行项目,您需要执行以下步骤:

  1. 转到项目->属性->Java 构建路径
  2. 双击 JRE 系统库并在 Alternate JRE "java-6-openjdk-root" 中选择

注意:想法来自http://www.eclipse.org/forums/index.php/mv/msg/87353/724852/#msg_724852

【讨论】:

  • 对于 Fedora 19,我使用 pkexec(不带双引号)而不是 gksu 来管理它:pkexec $jre $args
  • 你好,我试过这个方法,但出现以下错误:Unrecognized option: --run-as-root Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.有什么想法吗?谢谢。
  • @adrian.nicolau:请再次查看我的回答,并确保您按照所述执行了每个步骤。您提到的错误可能是因为您直接使用 --run-as-root 而不是 bash-script 调用了 jre。
  • 漂亮!还可以考虑在 gksu 上使用 --message 选项,否则您可能会看到一个包含非常长的命令行的巨大对话框。
  • 我对这个解决方案有两个问题: 1. 它会要求输入密码(还不错); 2. 它在某处更改了我的项目设置,并且由于在原始相对路径中添加了“/root/”而找不到配置文件。我正在使用 Fedora 20。
【解决方案2】:

假设您使用的是 Linux (*nix), 通过 sudo 命令启动 eclipse 会话怎么样?

sudo ~/eclipse/eclipse

现在无论你在 eclipse 中做什么都会有 sudo 上下文?

【讨论】:

  • -1 - 这是不可取的......而且很危险。您使用 eclipse 编写的任何文件都将归 root 所有。更糟糕的是,由于 eclipse 运行的是 root,它拥有读取、写入或删除任何文件或目录的权限。修改或删除错误的文件,你可能会进入一个痛苦的世界。
  • 哎呀好痛。我以为我刚刚回答了他正在寻找的东西。当我在我的开发箱上时,我不会为你提到的所有 ifs-and-buts 汗流浃背。
  • 而在sudo模式下运行eclipse的另一个问题是,如果你想稍后将你的eclipse切换回非sudo模式,你将面临各种问题,因为eclipsed将无法写入到现在由root拥有的各种文件中。这将导致未指定的日食行为。
【解决方案3】:

this thread中所述:

要在 Unix/Linux 系统上打开低于 1024 的端口,您需要 “根”。

我还使用参数-Dorg.eclipse.equinox.http.jetty.port=8080 来更改监听端口,但这似乎被忽略了(根据堆栈跟踪)

请使用“-Dorg.osgi.service.http.port=8080”。


HTTP Service中所述:

  • org.osgi.service.http.port - 指定用于 http 服务的端口号。根据 OSGi 规范,此属性的默认值为 80(需要 root 权限)。

  • org.osgi.service.http.port.secure - 指定用于安全 http 服务的端口号。根据 OSGi 规范,此属性的默认值为 443(需要 root 权限)。

也许如果您尝试将最后一个属性修改为高于 1024 的值,它可以在不需要任何特殊权限的情况下工作。

【讨论】:

    【解决方案4】:

    另一种选择是使用 iptables 或 ipfilter 将端口 80 转发到 1024 以上的端口。

    (有人可以提供一个实用且易于理解的解释的链接吗?)

    【讨论】:

    【解决方案5】:

    如果这可以满足您的需求并且可能的话,一个更好的答案可能是路由器上的简单端口重定向。

    当你现在只是在开发这个(不是安装)并且你想在调试器中运行它时,而不是试图强制你的 linux/unix 打开一个保留端口, 将您的路由器设置为将传入(外部)端口 443 重定向到更方便您当前需要的端口(例如 4443)。

    我认为大多数路由器都支持这一点,如果你的路由器不支持,它会给你妈妈一个很好的圣诞节或生日礼物主意!

    【讨论】:

    • 哎呀,我刚刚意识到上面有人提到了 iptable .. 同样的事情。对不起,不是想窃取你的想法!
    【解决方案6】:

    我正在编写 C 而不是 Java,但这在任何一种情况下都应该有效。 我使用远程调试 - 定义到 LOCALHOST 的“远程”连接,它允许您指定要连接的用户,指定 ROOT。然后在调试配置连接中定义一个远程应用程序:LOCALHOST。请务必选中主选项卡底部以及连接属性窗口下的“跳过下载到目标路径”。

    【讨论】:

      【解决方案7】:

      您可以为此使用Remote Java Application机制。

      1. 远程 Java 应用程序创建调试配置 运行 -> 调试配置... 中的部分
      2. 设置项目名称
      3. 选择连接类型作为标准(套接字连接)
      4. 为您的绑定配置连接属性参数 (对你来说,它将是 localhost443)。
      5. 在您的应用程序中设置断点(例如,在 main 方法的开头)
      6. 使用以下命令从终端以超级用户身份运行您的应用程序:java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=443 MyApp
      7. 在 Eclipse 中点击调试按钮以获取早期创建的远程 Java 应用程序
      8. 您的代码应该在 Eclipse 的断点处停止!

      【讨论】:

        【解决方案8】:

        如果您使用外部工具(运行菜单/外部工具或工具栏上运行/调试图标旁边的图标),您可以使用任何脚本或任何您喜欢的东西。这些脚本可能会赋予您更高的权限,或者其他什么。

        另一方面,通过这种方式调试应用程序可能会变得非常困难,因为运行和调试命令都不会与此外部工具配置相关联。也许可以连接应用程序的Eclipse调试器,但我不知道这怎么可能。

        【讨论】:

          【解决方案9】:

          你可以往这边走

          1. 使用 javac 调用创建 Makefile
          2. 添加以下行:
          setcap 'cap_net_admin=+ep' Server
          
          1. 配置 sudo 以允许您的 Eclipse 用户运行 setcap。

          所以你将有一个透明的调试(没有 sudo 包装器 - gdb ok)。 缺点:这是一个本地安全漏洞。

          解决方案:

          把这个放到 /opt/my-stupid-eclipse

          #!/bin/sh

          setcap 'cap_net_admin=+ep cap_net_raw=+ep' $1

          chmod +x 这个脚本并在 sudo config 上将其列入白名单。

          用户名 ALL=(ALL) NOPASSWD: /opt/my-stupid-eclipse

          将其添加到您的 makefile,指定服务器二进制文件的路径。

          现在你有一个非常奇怪但安全的脚本,其他用户无法更改它......并且用任何恶意代码替换服务器二进制文件仍然有一点漏洞,这将获得上限,因此没有文件名检查/严格会有所帮助。 . $1 会被 bash 命令污染,不是吗?猜猜,没有。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-10-08
            • 1970-01-01
            • 2013-06-18
            • 1970-01-01
            • 1970-01-01
            • 2011-03-26
            • 1970-01-01
            相关资源
            最近更新 更多