2016-04-21 84 views
0

我们有几个硬件设备需要使用原始套接字与它们进行通信。为了做到这一点,我们运行一个UDP代理将数据发送到设备。 UDP代理需要root权限才能运行。是否有启动需要root访问权限的服务的“最佳方法”?

使用REDHAWK启动此服务有哪些选择?它不应该在启动时启动,并且需要在需要时作为波形的一部分理想地启动。

回答

0

当他开发vsftpd FTP服务器时,克里斯埃文斯对此进行了很多考虑。特别是,他的design notes值得仔细研究。

简而言之,软件以root权限启动,但立即创建一个非特权子进程,用于处理与外部世界的所有交互。子进程清理传入的请求,并将它们传递给父进程。父进程也不信任由子进程发送给它的所有内容,并且只在确定没有任何不良行为发生时才采取请求的操作。

由于外部用户只能与子进程进行交互,因此破坏父进程的特权状态要困难得多。

+0

我不会反对票,但这个问题没有任何关于设计和一切办通过红鹰框架启动服务。 –

+0

@SirBedevere我曾假设你打算使用某种音频 - 二进制转换工具将外部无线电信号转换为软件指令。如果是这样,那么用这样的措施来保护你的应用程序肯定是值得的。用于与您的软件进行通信的协议在这方面与此无关。 –

0

这确实两个部分你的问题,通用Linux一个有几个可能的答案:

  1. 贵UDP代理真的需要root?如果您可以使用1024以上的端口,那么您的进程不需要特权访问。
  2. 或者,您可以通过IPC机制来做特殊的事情,如端口转发和在特许和非特权流程之间共享责任。

我想你的问题的第二部分是你真正关心的问题,而且对谷歌来说更难,在Redhawk中看起来如何? Redhawk进程通常在用户登陆时执行,但底层传输omniORB作为Linux服务运行,并需要root访问权限来配置/启动/停止。我还没有看到一个人从一个没有特权的普通安装中用root执行单个Redhawk进程的例子,所以我不确定这是如何工作的。我不建议将Redhawk整体安装为root权限,因为这是一种公然的安全风险,完全没有必要。在任何情况下,您整合代理服务的方式大致如下:

  1. 如果您有源代码到您的代理服务器,您可以将其移植到Redhawk设备块中粗略地表示您连接的外围设备(通常是SDR)的应用程序级设备驱动程序。每个Redhawk设备都有一个tx/rx线程和几个标准函数/ API,可以用来控制它的状态。这将是最自然的进口方式。
  2. 如果你没有源代码,或者代理已经有它自己的API,你可以#包括在Redhawk设备中,只需编写粘合代码来转换成Redhawk API。这与USRP_UHD设备相似,因为它基本上使用UHD库作为“子”接口。如果您确实需要获得代理的特权访问权限,这也可能会有所帮助,因为您可以将其保留为特权服务,并仅与用户登录Redhawk设备连接。
  3. 一旦您拥有Redhawk设备,您可以将其添加到Redhawk节点,该节点可以在启动时或通过命令通过python或bash脚本启动。 cmd nodeBooter -d $SDRROOT/dev/nodes/DeviceManager/DeviceManager.dcd.xml或类似的东西会让你在那里。我知道你说应该在启动时启动而不是,但设备(驱动程序)的一般做法是它们始终可用于异步连接。无论如何,一旦运行了节点,您就可以通过python脚本或IDE在该节点/设备上启动波形。针对设备启动波形由三件事组成:满足波形依赖性,设置(Redhawk)端口连接以及分配RF调谐器(启动数据流)。我承认这似乎不是最直接的方式,但有系统级的原因为什么这样做。
  4. 或者,根据您的最终目标,您可以在Redhawk 组件而不是设备中执行上述#2或#3。除了约定以外,没有太多的技术差异,人们会如何使用你的硬件/系统/应用程序。作为一个组件,你可以直接将它添加到你的波形(很像GNU无线电),因此它是一个实体。这对于人们来说通常更容易理解,并且需要的工作步骤较少,但如果您与其他人一起工作或正在构建更大的系统,则可能会出现问题。将硬件接口构建到设备中并在节点中运行它们可以与Waveforms(应用程序)解耦,因此,每次使用不同的RF前端时,都不必切换组件。

无论如何,这应该让你思考。我建议阅读Redhawk手册,尽管在这一点上它相当大。搜索python示例,他们是了解如何操作框架的最简单方法。要探索可用的Python函数:

$ python 
>>> from ossie.utils import redhawk 
>>> domain = redhawk.attach('REDHAWK_DEV') 
>>> dir(domain) 
相关问题