3

我正在尝试以下程序:

  1. 如果我使用 SUDO java 运行一切都很好,但我不想使用 SUDO
  2. 没有 SUDO 我得到以下错误:SocketException: Permission Denied (as its PORT 80)

使用码头文档,我可以使用我更改的命令行来工作

  1. jetty-setuid.xml -- put user-name 是非root用户
  2. start.ini -- 更改为 EXEC 并etc/jetty-setuid.xml作为第一个参数传递
  3. jetty.xml-- 端口号为 80

然后我仍然以非 root 用户身份执行 sudo - 就像 -> sudo java -jar start.jar Jetty 作为非 root 用户在端口 80 上启动。

我想使用 JAVA 程序实现相同的目标。任何帮助/意见表示赞赏。

package my.package;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.nio.SelectChannelConnector;

public class JettyTest {


public static void main(String[] args) throws Exception
{
    Server server = new Server();
    System.out.println("Created new server, now going to start");
    SelectChannelConnector connector0 = new SelectChannelConnector();
    connector0.setPort(80); //on port 80
    connector0.setMaxIdleTime(30000);
    connector0.setRequestHeaderSize(8192);

    server.setConnectors(new Connector[]{ connector0 });

    server.setHandler(new MyHandler()); //simple hello world handler

    server.start();
    System.out.println("started server on port 80");
    server.join();
}

}
4

2 回答 2

2

您必须在 Unix 上以某种方式使用 sudo 才能提升到 root 权限。否则你无法获得 80 端口。

对于 Java 程序,sudo 必须应用于 java 命令本身,但这样做通常是个坏主意。

更保守的解决方案是绑定到另一个端口,比如 8080,然后将端口 80 重新路由到该端口。执行此操作的命令因操作系统而异,甚至在某些较旧的 Unix 版本上可能不存在。

于 2012-11-07T00:12:14.693 回答
0

Sudo 将您的命令的权限提升到 root 级别。您需要在此处“sudo”(或者更一般地说,以 root 身份运行命令)的原因是,在 Linux 中,低于 1024 的端口保留给 root。

换句话说 - 如果您不是 root,则无法在端口 80 上运行码头(或任何其他服务)。

这里最简单的解决方案是在另一个端口上运行 Jetty(8080 是一个常见的端口)。

如果您仍希望用户在默认端口上访问服务,请查阅http://wiki.eclipse.org/Jetty/Howto/Port80http://docs.codehaus.org/display/JETTY/port80

于 2012-11-07T11:35:25.780 回答