27

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

4

9 回答 9

16

You can follow these steps to compile/debug applications as superuser.

  1. Rename your java-application

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

  2. Create following script and store it as /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. Change the permissions to make it executable

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

  4. Startup eclipse

  5. Go to Window->Preferences->Java->Installed JREs
  6. Duplicate java-6-openjdk to java-6-openjdk-root
  7. Edit JRE and add "--run-as-root" as Default VM Argument

To run projects as root you need to follow these steps:

  1. Go to Project->Properties->Java Build Path
  2. Double-Click the JRE System Library and choose in Alternate JRE "java-6-openjdk-root"

Note: The idea is from http://www.eclipse.org/forums/index.php/mv/msg/87353/724852/#msg_724852

于 2012-04-02T15:18:26.213 回答
2

假设您在 Linux (*nix) 上,如何通过 sudo 命令启动 eclipse 会话?

sudo ~/eclipse/eclipse

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

于 2010-04-05T19:18:35.217 回答
1

正如这个线程中提到的:

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

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

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


HTTP 服务中所述:

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

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

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

于 2010-04-05T20:05:41.500 回答
1

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

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

于 2010-04-05T22:59:13.240 回答
1

您可以为此使用远程 Java 应用程序机制。

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

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

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

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

于 2011-12-10T04:39:24.370 回答
1

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

于 2012-02-06T16:01:11.633 回答
0

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

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

于 2010-04-05T19:09:35.513 回答
0

你可以走这条路

  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 配置白名单。

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

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

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

于 2010-11-17T01:02:40.423 回答