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

时间:2010-04-05 18:39:01

标签: java eclipse ssl client-server sudo

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

9 个答案:

答案 0 :(得分:15)

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

  1. 重命名java-application

    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. Startup eclipse

  5. 转到Window-> Preferences-> Java-> Installed JREs
  6. 将java-6-openjdk复制到java-6-openjdk-root
  7. 编辑JRE并将“--run-as-root”添加为“默认VM参数”
  8. 要以root身份运行项目,您需要按照以下步骤操作:

    1. 转到项目 - >属性 - > Java构建路径
    2. 双击JRE系统库并选择Alternate JRE“java-6-openjdk-root”
    3. 注意:这个想法来自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)

你可以这样走

  1. 使用javac调用创建一个Makefile
  2. 添加以下行:
  3. setcap 'cap_net_admin=+ep' Server
    
    1. 配置sudo以允许Eclipse用户运行setcap。
    2. 所以你将有一个透明的调试(没有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应用程序机制。

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