Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用sudo将数据发送到Linux tap接口_Linux_Networking_Jenkins - Fatal编程技术网

不使用sudo将数据发送到Linux tap接口

不使用sudo将数据发送到Linux tap接口,linux,networking,jenkins,Linux,Networking,Jenkins,我正在尝试为我的网络脚本设置单元测试。由于单元测试由非root用户(“jenkins”)运行,我希望能够设置一个网络接口,jenkins可以使用该接口来测试从我的网络脚本发送的数据包。我正在测试的程序以“混杂”模式使用网络接口,并最终作为Linux服务在根用户下运行。但是,我希望在不需要root登录或交互输入的情况下测试功能单元-jenkins“用户”不是系统上的交互用户 我可以通过以下方式设置tap接口(CentOS 7.x): sudo ip tuntap add tap0 mode tap

我正在尝试为我的网络脚本设置单元测试。由于单元测试由非root用户(“jenkins”)运行,我希望能够设置一个网络接口,jenkins可以使用该接口来测试从我的网络脚本发送的数据包。我正在测试的程序以“混杂”模式使用网络接口,并最终作为Linux服务在根用户下运行。但是,我希望在不需要root登录或交互输入的情况下测试功能单元-jenkins“用户”不是系统上的交互用户

我可以通过以下方式设置tap接口(CentOS 7.x):

sudo ip tuntap add tap0 mode tap user jenkins
sudo ifconfig tap0 promisc up
这带来了一个界面,我可以使用
ifconfig
看到它,但它并没有“运行”

我可以通过使用
sudoxxxx
运行我的程序向它发送数据,这样我的程序就可以正常工作了。但是,如果我通过jenkins帐户运行该程序,数据包将无法通过-我可以暂时将jenkins用户帐户切换为“交互式”来尝试此操作。我正在使用Wireshark查看此接口上的吞吐量

我已经用我自己的用户帐户和其他帐户尝试过了,但只有根帐户起作用

我觉得我可以使用一些命令行调用来允许非root用户使用(私有的、用户拥有的)网络接口,但我什么也找不到

我可能会使用
sudo
和/或suid(
chmod 4755 XXX
)权限设计一个系统,允许单元测试以root权限运行,但似乎我应该能够运行自动测试,而不必经历这个有点曲折的过程

有人知道我如何从用户帐户使用tap界面吗

注意:最终,我的程序使用
libpcap
pcap\u inject
将数据包注入接口。如果有人知道不同的编程解决方案,那就是解决这个问题的另一种方法


此外,我可以将数据包作为非根用户注入到我的真实网络接口上,这是可行的,但让我的数据包(可能是错误的)散播到真实网络上有点危险。用户可以使用真实的界面,但不使用“tap”界面进行测试,这似乎是不一致的。

libpcap库似乎不允许以这种方式访问tap界面设置

为了解决这个问题,我需要在系统中编写C/C++代码,以便使用如下代码直接写入网络接口的文件描述符:

#include <fcntl.h>
#include <linux/if.h>
#include <linux/if_tun.h>
#include <sys/ioctl.h>

...

struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
strncpy(ifr.ifr_name, "tap0", IFNAMSIZ);
int fd = open("/dev/net/tun", O_RDWR);
int err = ioctl(fd, TUNSETIFF, (void*) &ifr);

...

int rc = write(fd, packetData, length);
#包括
#包括
#包括
#包括
...
结构ifreq-ifr;
memset(&ifr,0,sizeof(ifr));
ifr.ifr_flags=IFF_TAP | IFF_NO_PI;
strncpy(ifr.ifr_名称,“tap0”,IFNAMSIZ);
int fd=打开(“/dev/net/tun”,O_RDWR);
int err=ioctl(fd、TUNSETIFF、(void*)和ifr);
...
int rc=写入(fd,packetData,长度);
最终,这通过一个编程解决方案得以解决。我真的不认为有一个系统管理解决方案可以继续使用libpcap库


注意:在继续使用libpcap(这对其他情况很有用)之前,我尝试先以这种方式打开tap设备。这是因为libpcap在尝试相同的操作时可能会无声地失败,并且不会返回任何错误,但根本不起作用。

Stack Overflow是一个解决编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参见帮助中心中的。我正在尝试开发一个程序并为该程序运行单元测试,但我知道它可能与管理任务更相关。有没有办法让我把问题转移到那些委员会中的一个?我知道它们是由同一个系统运行的。