我正在 Ubuntu 14.04 中工作,我有一个已编译的 C++ 应用程序。我得到名称为“program”的可执行文件。问题是这个程序使用 opencv 和套接字,那么如果我尝试在终端中执行它,如下所示:
./program
我收到这个错误:
listener: socket: Operation not permitted
setsockopt: Bad file descriptor
出现此错误是因为我使用套接字并且需要以 root 身份运行我的应用程序,所以我输入了以下内容:
sudo ./program
这要求我的密码和程序的工作属性。
问题是我想在启动 Ubuntu 时自动运行这个“程序”,但它不起作用。我有另一个应用程序,名称是“camera”,它只使用opencv,没有套接字,那么我不需要以root身份运行。所以我把这个应用程序放在Ubuntu的启动应用程序中,“相机”应用程序从一开始就启动,没有问题。
那么如何在 Ubuntu 中自动启动使用套接字的应用程序呢?
我尝试这样做:
sudo chown root:root ./program
sudo chmod a+s ./program
但我的程序使用视频,因此当我尝试观看视频时,程序会停止。这是因为我的程序不存在安全漏洞,因此它们很容易受到缓冲区溢出漏洞等的攻击。
基本上我只需要知道如何才能毫无问题地启动我的程序。
答案1
根据RecvRawEth.c
您在上面的评论中发布的文件名,我猜测您正在尝试使用原始套接字(SOCK_RAW
)。这总是要求程序以 root 身份运行,因为原始套接字有可能让您绕过其他安全机制,例如对特权端口。
你真的应该重新考虑这个应用程序。非常很少有程序合法地需要原始套接字。几乎总有更好的方法。
你至少要考虑两个额外的问题,这确实是不洁食在 Stack Exchange 类型的网站上,但我无论如何都会解决它们:
设定值
root
您试图通过将原始套接字标记为
root
无论是谁实际启动它来运行来绕过对原始套接字的限制。这样做可能会造成一个或多个安全漏洞。相信我:几十年的 Unix 历史告诉我们,复杂的 setuidroot
程序很可能存在可利用的问题。找到并切除所有这些可能需要很多年的时间。如果您绝对必须使用原始套接字,因此需要程序的某些元素以 root 身份运行,那么最好将其编写为有限范围守护进程。也就是说,使程序尽可能小,只执行必须执行的绝对最低限度的操作
root
,再加上将结果信息导出到以正常权限运行的程序所需的任何操作。开机启动
如果您创建一个守护进程,将其设置为在系统启动时运行是很简单的。任何向您展示如何创建守护进程的不错的教程都会涉及到这一点。在 Ubuntu 上,我相信这意味着处理
systemd
。至于GUI部分,你只需要将其添加到会话启动中。