我有一个通过端口5000运行的Flask服务器,它很好.我可以访问http://example.com:5000
但是可以在http://example.com上简单地访问它吗?我假设这意味着我必须将端口从5000更改为80.但是当我在Flask上尝试时,我在运行它时收到此错误消息.
Traceback (most recent call last):
File "xxxxxx.py", line 31, in <module>
app.run(host="0.0.0.0", port=int("80"), debug=True)
File "/usr/local/lib/python2.6/dist-packages/flask/app.py", line 772, in run
run_simple(host, port, self, **options)
File "/usr/local/lib/python2.6/dist-packages/werkzeug/serving.py", line 706, in run_simple
test_socket.bind((hostname, port))
File "<string>", line 1, in bind
socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)
运行lsof -i :80回报
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache2 467 root 3u IPv4 92108840 0t0 TCP *:www (LISTEN)
apache2 4413 www-data 3u IPv4 92108840 …Run Code Online (Sandbox Code Playgroud) 我听说这是一个安全功能,但它通常看起来像一个安全问题.如果我想编写一个使用特权端口的服务器,我不仅要担心我的代码有多安全,我还要特别担心我是否正在使用setuid和删除权限.
我想让一个Python程序开始监听端口80,但之后执行没有root权限.有没有办法放弃root或没有它的端口80?
我无法在端口80上启动应用程序.我在IDE和服务器上试过本地计算机,没有运气.我检查了其他类似的帖子,并确保我在root服务器上运行jar.
这是错误:
till here all ok
...
java.net.SocketException: Permission denied
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:338)
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:760)
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:472)
at org.apache.catalina.connector.Connector.startInternal(Connector.java:986)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:237)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.addPreviouslyRemovedConnectors(TomcatEmbeddedServletContainer.java:186)
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:149)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:288)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.andirod.StartApplication.main(StartApplication.java:20)
...
...
...
Exception in thread "main" java.lang.IllegalStateException: Tomcat connector in failed state
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:157)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:288)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:483)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) …Run Code Online (Sandbox Code Playgroud) 我正在运行一个node.js服务器,它将在端口80和其他服务器上提供请求.显然,这需要以root身份运行应用程序(在Linux上).
以这篇文章(http://syskall.com/dont-run-node-dot-js-as-root)为例,很明显有一些简单的方法可以让节点作为非root用户运行,但我想知道是否有人对所建议的不同方法的优点/缺点有任何看法:
代码:在侦听端口80建立后,使用setuid()从root用户下载到非特权用户.
使用某种代理服务器将请求重定向到端口> 1024(因此不需要节点以root身份运行)
使用IP表转发到另一个端口(同上节点不会以root身份运行)
谢谢
如何使用ip6tables将一个端口重定向到另一个本地端口?例如:ip6tables -t nat -A PREROUTING -j REDIRECT -p tcp --dport 443 --to-ports 8443
我使用Ansible安装了Nginx.要在Centos7上安装,我使用了yum软件包,因此它默认以root用户身份运行.我希望它在Centos框中以不同的用户(ex- nginx用户)启动和运行.当我尝试使用其他用户运行它时,我收到以下错误:
nginx.service的作业失败,因为控制进程退出并显示错误代码.有关详细信息,请参阅"systemctl status nginx.service"和"journalctl -xe".
我知道以root身份运行是不可取的.那么我该如何解决这个问题并以非root用户身份运行nginx.谢谢
我目前正在开发一个用PHP进行系统更改的项目(例如,更改Nginx /重启服务的配置文件).
PHP脚本在localhost上运行.在我看来,最好的(读取:最安全)方式是使用SSH建立连接.我考虑以下选项之一:
选项1:在php会话中存储用户名/密码并提示输入sudo
使用带有用户名/密码的phpseclib,将这些值保存在php会话中,并为每个命令提示sudo.
选项2:使用root登录
在登录脚本中使用phpseclib和root用户名和密码.在这种情况下,您不必向用户询问sudo.(不是真正安全的解决方案)
<?php
include('Net/SSH2.php');
$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('root', 'root-password')) {
exit('Login Failed');
}
?>
Run Code Online (Sandbox Code Playgroud)
选项3:使用从文件中读取的公钥进行身份验证
使用带有公钥的PHP SSHlib进行身份验证,并将pubkey放在www root之外.
<?php
$connection = ssh2_connect('shell.example.com', 22, array('hostkey' => 'ssh-rsa'));
if (ssh2_auth_pubkey_file($connection, 'username', '/home/username/.ssh/id_rsa.pub', '/home/username/.ssh/id_rsa', 'secret')) {
echo "Public Key Authentication Successful\n";
} else {
die('Public Key Authentication Failed');
}
?>
Run Code Online (Sandbox Code Playgroud)
方案4:?
我试图使用Boost asio接收UDP数据包.我的代码基于asio文档中的阻塞UDP客户端示例.
我试图从C6655 TI DSP接收类似BOOTP的UDP数据包,这些数据包以3秒的间隔传输.我有Wireshark看着我的程序正在监听的相同接口,它可以看到数据包到达(参见下面的确切数据包数据,从Wireshark导出).数据包并非真正来自DSP,我捕获了一个,tcpdump我正在用带有封装的Raspberry Pi模拟它.
但是,我的程序没有收到数据包.它有4秒的超时(因为DSP每3秒播放一次).如果它达到超时,它会打印一条消息,否则它应该打印接收的字节数.该程序的完整(可编译)源代码如下(约100行).
使用参数调用该命令192.168.5.122 67 4000,这意味着在超时4000毫秒的情况下侦听192.168.5.122:67.
编辑:除了下面的代码,我还尝试了这个作为我的端点:udp::endpoint listen_endpoint(boost::asio::ip::address_v4::any(), atoi(argv[2]));以及0.0.0.0搜索结果建议的IP地址.
我还添加了以下内容无济于事:
boost::asio::socket_base::broadcast option(true);
socket_.set_option(option);
Run Code Online (Sandbox Code Playgroud)
我有一个能够正确接收此数据包的程序,使用Berkeley套接字编写.除了绑定到INADDR_ANY之外,我没有做任何特别的事情.
这是完整的程序:
//
// blocking_udp_client.cpp
// ~~~~~~~~~~~~~~~~~~~~~~~
//
#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/ip/udp.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <iostream>
using boost::asio::deadline_timer;
using boost::asio::ip::udp;
class listener
{
public:
listener(const udp::endpoint& listen_endpoint)
: socket_(io_service_, listen_endpoint)
, deadline_(io_service_)
{
deadline_.expires_at(boost::posix_time::pos_infin);
check_deadline();
}
std::size_t receive(const boost::asio::mutable_buffer& buffer, boost::posix_time::time_duration timeout, boost::system::error_code& ec)
{ …Run Code Online (Sandbox Code Playgroud) 我已经完成了一个 Java 库,它使用带有 JNI 的 C 库。C库在linux中编译成.so文件。这个库需要cap_net_raw 能力。
执行一个没有额外权限的java 进程,该进程使用所述 java 库。将使用该库的实际进程是产品中已经存在的进程,我们不想授予它们更多权限。
为了测试这一点,我创建了一个jar并在使用和不使用sudo. 正如预期的那样,使用它会成功,但如果没有它,它就会失败。
SocketTester.javastatic {
System.loadLibrary("SocketTester");
}
private native int socketTest();
Run Code Online (Sandbox Code Playgroud)
socketTester.h使用命令生成文件javac -h . SocketTester.java
Run Code Online (Sandbox Code Playgroud)
socketTester.c实现socketTester.h并需要该cap_net_raw功能的文件gcc -o libSocketTester.so socketTester.c -shared -I/usr/lib/jvm/java-14-openjdk-amd64/include -I/usr/lib/jvm/java-14-openjdk-amd64/include/linux
Run Code Online (Sandbox Code Playgroud)
libSocketTester.so到/usr/libsudo ldconfig
Run Code Online (Sandbox Code Playgroud)
cd /usr/lib
sudo setcap cap_net_raw=epi libSocketTester.so
Run Code Online (Sandbox Code Playgroud)
Test.java类public static void main(final String[] args) …Run Code Online (Sandbox Code Playgroud)