使用Java程序如何以非root用户为单位在端口80上启动Jetty



我正在尝试跟随progam:

  1. 如果我使用sudo java奔跑是可以的,但是我不想使用sudo
  2. 没有sudo,我会有以下错误: SocketException: Permission Denied (as its PORT 80)

使用码头文档,我可以使用命令行进行工作

  1. jetty-setuid.xm l- put用户名是非root用户
  2. start.ini-更改为exec和通过etc/jetty-setuid.xml作为第一个参数
  3. jetty.xml-将端口号作为80

然后我仍然是sudo作为非root用户 - 喜欢 -> sudo java -jar start.jar码头从端口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();
}
}

您必须以某种方式使用unix上的sudo来提升到根特权。否则您将无法获得端口80。

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

一个更保守的解决方案是绑定到另一个端口,例如8080,然后将端口80绑定到该端口。这样做的命令在操作系统之间差异很大,甚至可能在某些较旧的Unix versions上存在。

sudo将命令的特权提升到根级别。您之所

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

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

如果您仍然希望用户在默认端口上访问服务,请咨询http://wiki.eclipse.org/jetty/howto/port80和http://docs.codes.codehaus.org/display/jetplay/jetty/port80。

最新更新