博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Linux系统编程】普通用户绑定(bind)特权端口
阅读量:6268 次
发布时间:2019-06-22

本文共 948 字,大约阅读时间需要 3 分钟。

有些知识不常使用真的容易忘啊,即使没有忘记,知识提取速度也够下午茶的。

背景

最近在学Haskell,今天用HaskellNetwork.Socket模块实现了一个简单的基于TCP的daytime服务程序。程序运行阶段报了以下的错误:

Network.Socket.bind: permission denied (Permission denied)

我的第一反应怀疑是不是本地有服务程序占用端口号13,然后用命令netstat -tunl | grep 13查看,端口号并没有占用,所以第一种可能性不成立。

是不是这个模块有类似的bug呢?但并没有查到。不放心,用C语言写了同样功能的程序,然后运行也会出错:

bind error: Permission denied

那是不是端口的问题,隐隐约约记得好像是小于1024的端口号不是预留给用户的。然后换了一个>=1024的端口,果然运行成功了。至此,思路才走上正轨。

实际上小于1024的端口是特权端口,普通用户是没有权限绑定的。

那如果我就是要用端口13呢,怎么解决呢?

解决方案

1.使用root权限运行

最简单的方式就是登录root帐号,或者使用su切换到root。如果本机有配置sudo,普通用户也可使用该命令运行服务程序。

2.使用setcap给服务程序赋予能力

上一种方式是使用具有特权的用户,而该种方式是给程序赋予绑定特权端口的能力。操作如下:

  • 使用setcap 'CAP_NET_BIND_SERVICE=+ep' /path/to/program赋予(raise)绑定特权端口的能力
  • 使用setcap 'CAP_NET_BIND_SERVICE=-ep' /path/to/program清除(lower)绑定特权端口的能力
  • 也可使用setcap -r /path/to/program清除(remove)该程序的所有能力

setcap简单使用说明

  • 除了CAP_NET_BIND_SERVICE,还有好多能力,可以参考
  • =-是运算符,除此之外还有+ep是标记,除此之外还有i。可参考 Textual Representation一节的说明。
  • setcap命令对内核有要求,必须>=2.6.24

请关注我的公众号哦。

图片描述

转载地址:http://xzvpa.baihongyu.com/

你可能感兴趣的文章
linux下libevent安装
查看>>
用ip来获得用户所在地区信息
查看>>
卡尔曼滤波
查看>>
linux下面覆盖文件,如何实现直接覆盖,不提示
查看>>
CSS3阴影 box-shadow的使用和技巧总结
查看>>
Linux下高cpu解决方案
查看>>
SQL事务用法begin tran,commit tran和rollback tran的用法
查看>>
centos7 crontab笔记
查看>>
.Net AppDomain.CurrentDomain.AppendPrivatePath(@"Libs");
查看>>
【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D
查看>>
Android Mina框架的学习笔记
查看>>
合并两个排序的链表
查看>>
rtf格式的一些说明,转载的
查看>>
REST Security with JWT using Java and Spring Security
查看>>
echarts学习总结(二):一个页面存在多个echarts图形,图形自适应窗口大小
查看>>
IIS7显示ASP的详细错误信息到浏览器
查看>>
使用fiddler对手机APP进行抓包
查看>>
exit和_exit的区别
查看>>
Javascript、Jquery获取浏览器和屏幕各种高度宽度(单位都为px)
查看>>
php不重新编译,安装未安装过的扩展,如curl扩展
查看>>