如何以Eclipse中的超级用户身份运行我的应用程序?

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

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

  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. 启动日食

  5. 转到Window-> Preferences-> Java-> Installed JREs
  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

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

 sudo ~/eclipse/eclipse 

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

正如这个post中提到的:

要在Unix / Linux系统上打开1024以下的端口,您需要成为“root”。

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

请使用“ -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的值,它可以在不需要任何特殊权限的情况下工作。

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

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

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

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

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

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

如果使用外部工具(运行菜单/外部工具或工具栏上的“运行/调试”图标旁边的图标),则可以使用任何脚本或任何您喜欢的脚本。 这些脚本可能会为您提供更高的权限。

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

你可以走这条路

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

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

解:

把它放到/ opt / my-stupid-eclipse中

#!/ bin / sh的

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

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

username ALL =(ALL)NOPASSWD:/ opt / my-stupid-eclipse

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

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

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

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