当我尝试从Eclipse运行我的服务器应用程序时,我遇到了错误。错误是 java.net.BindException:Permission denied 。我想这是因为我使用端口443来建立SSL连接。如果我使用java和sudo在命令行上运行我的代码,我可以解决这个问题。有没有办法设置Eclipse,以便当我点击运行按钮时,我的应用程序是用sudo执行的?
答案 0 :(得分:15)
您可以按照以下步骤以超级用户身份编译/调试应用程序。
重命名java-application
sudo mv / usr / lib / jvm / java-6-openjdk / jre / bin / java /usr/lib/jvm/java-6-openjdk/jre/bin/java.ori
创建以下脚本并将其存储为/ 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
更改权限以使其可执行
sudo chmod 0755 / usr / lib / jvm / java-6-openjdk / jre / bin / java
Startup eclipse
要以root身份运行项目,您需要按照以下步骤操作:
注意:这个想法来自http://www.eclipse.org/forums/index.php/mv/msg/87353/724852/#msg_724852
答案 1 :(得分:2)
假设您使用的是Linux(* nix), 如何通过sudo命令启动eclipse会话?
如
sudo ~/eclipse/eclipse
现在无论你从eclipse做什么都会有sudo上下文?
答案 2 :(得分:1)
如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的值,它可以在不需要任何特殊权限的情况下工作。
答案 3 :(得分:1)
另一种选择是使用iptables或ipfilter将端口80转发到1024以上的端口。
(有人可以提供实用且易于理解的解释链接吗?)
答案 4 :(得分:1)
一个更好的答案,也许,如果这满足您的需求并且可能,可以是您的路由器上的简单端口重定向。
而不是试图强制你的linux / unix打开一个保留端口,当你现在只开发它(不安装)而你想在调试器中运行它时, 设置您的路由器将传入(外部)端口443重定向到更方便您当前需求的端口(例如4443)。
我认为大多数路由器支持这一点,如果你的不支持,它会给你妈妈一个很好的圣诞节或生日礼物的想法!
答案 5 :(得分:1)
我正在编写C而不是Java,但这应该适用于任何一种情况。 我使用远程调试 - 定义与LOCALHOST的“远程”连接,允许您指定要连接的用户,指定ROOT。然后在调试配置连接中定义远程应用程序:LOCALHOST。请务必选中主选项卡底部以及连接属性窗口下的“跳过下载到目标路径”。
答案 6 :(得分:0)
如果使用外部工具(运行菜单/外部工具或工具栏上的“运行/调试”图标旁边的图标),则可以使用任何脚本或任何您喜欢的脚本。脚本可能会为您提供更高的权限,或者其他任何内容。
另一方面,调试应用程序的方式可能变得非常困难,因为Run和Debug命令都不会与此外部工具配置相关联。也许可以连接应用程序的Eclipse调试器,但我不知道,这是怎么回事。
答案 7 :(得分:0)
你可以这样走
setcap 'cap_net_admin=+ep' Server
所以你将有一个透明的调试(没有sudo包装 - gdb确定)。 缺点:这是本地安全漏洞。
解决方案:
把它放到/ 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,指定Server二进制文件的路径。
现在你有一个非常奇怪但安全的脚本,其他用户无法更改...并且仍然有点违反用任何恶意代码替换Server二进制文件,这将获得上限,因此没有文件检查/限制将有所帮助。 。$ 1可以被bash命令污染,不是吗?猜猜,没有。
答案 8 :(得分:0)
您可以使用远程Java应用程序机制。