当我尝试从 Eclipse 运行我的服务器应用程序时,我遇到了一个错误。错误是java.net.BindException: Permission denied。我认为这是因为我使用端口 443 来建立 SSL 连接。如果我使用 java 和 sudo 在命令行上运行我的代码,我可以解决这个问题。有没有办法设置 Eclipse,以便当我点击运行按钮时,我的应用程序使用 sudo 执行?
9 回答
You can follow these steps to compile/debug applications as superuser.
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
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
Change the permissions to make it executable
sudo chmod 0755 /usr/lib/jvm/java-6-openjdk/jre/bin/java
Startup eclipse
- Go to Window->Preferences->Java->Installed JREs
- Duplicate java-6-openjdk to java-6-openjdk-root
- Edit JRE and add "--run-as-root" as Default VM Argument
To run projects as root you need to follow these steps:
- Go to Project->Properties->Java Build Path
- 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
假设您在 Linux (*nix) 上,如何通过 sudo 命令启动 eclipse 会话?
如
sudo ~/eclipse/eclipse
现在无论你从 eclipse 做什么都会有 sudo 上下文?
正如这个线程中提到的:
为了在 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 的值,它可以在不需要任何特殊权限的情况下工作。
另一种选择是使用 iptables 或 ipfilter 将端口 80 转发到 1024 以上的端口。
(有人可以提供一个实用且易于理解的解释的链接吗?)
您可以为此使用远程 Java 应用程序机制。
- 在运行 -> 调试配置...中为远程 Java 应用程序 部分创建调试配置...
- 设置您的项目名称
- 选择连接类型作为标准(Socket Attach)
- 为您的绑定配置连接属性参数(对您而言,它将是localhost和443)。
- 在您的应用程序中设置断点(例如在main方法的开头)
- 使用以下命令从终端以超级用户身份运行您的应用程序:java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=443 MyApp
- 在 Eclipse 中点击调试按钮以获取早期创建的远程 Java 应用程序
- 您的代码应该在 Eclipse 的断点处停止!
如果这可以满足您的需求并且可能的话,一个更好的答案可能是路由器上的简单端口重定向。
不要试图强制你的 linux/unix 打开一个保留端口,当你现在只开发这个(不是安装)并且你想在调试器中运行它时,设置你的路由器将传入(外部)端口 443 重定向到一个端口这更方便您当前的需求(例如 4443)。
我认为大多数路由器都支持这一点,如果你的路由器不支持,它会给你妈妈一个很好的圣诞节或生日礼物主意!
我正在编写 C 而不是 Java,但这在任何一种情况下都应该有效。我使用远程调试 - 定义到 LOCALHOST 的“远程”连接,它允许您指定要连接的用户,指定 ROOT。然后在调试配置连接中定义一个远程应用程序:LOCALHOST。请务必选中主选项卡底部以及连接属性窗口下的“跳过下载到目标路径”。
如果您使用外部工具(运行菜单/外部工具或工具栏上运行/调试图标旁边的图标),您可以使用任何脚本或任何您喜欢的东西。这些脚本可能会赋予您更高的权限,或者其他什么。
另一方面,通过这种方式调试应用程序可能会变得非常困难,因为 Run 和 Debug 命令都不会与此外部工具配置相关联。也许可以连接应用程序的 Eclipse 调试器,但我不知道,这怎么可能。
你可以走这条路
- 使用 javac 调用创建 Makefile
- 添加以下行:
setcap 'cap_net_admin=+ep' Server
- 配置 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 命令污染,不是吗?猜,没有。