我正在尝试关注程序:
SocketException: Permission Denied (as its PORT 80)
使用jetty文档,我使用命令行工作,我改变了
jetty-setuid.xm
l - Put user-name是非root用户start.ini
- 更改为EXEC并将etc/jetty-setuid.xml
作为第一个参数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();
}
}
答案 0 :(得分:2)
你必须在Unix上以某种方式使用sudo来升级到root权限。否则你无法获得80端口。
对于Java程序,sudo必须应用于java命令本身,但这通常是一个坏主意。
更保守的解决方案是绑定到另一个端口,比如8080,然后将端口80重新路由到该端口。执行此操作的命令在操作系统之间存在很大差异,甚至可能在某些较旧的Unix版本中也不存在。
答案 1 :(得分:0)
Sudo将命令的权限提升到根级别。您需要在这里“sudo”(或者更一般地说,以root身份运行命令)的原因是,在Linux中,1024以下的端口保留给root。
换句话说 - 如果你不是root用户,你就不能在端口80上运行jetty(或任何其他服务)。
这里最简单的解决方案是在另一个端口上运行Jetty(8080是常见端口)。
如果您仍希望用户在默认端口上访问该服务,请咨询http://wiki.eclipse.org/Jetty/Howto/Port80和http://docs.codehaus.org/display/JETTY/port80。