前言
设备:树莓派4a
ps:吐槽一下它的网口好神奇,网线a可以接通,网线b不可以接通。隔段时间,又反过来,b可以接通,a不可以接通。其实两条网线在别的设备上都能工作,实在是不知道啥情况
树莓派中有一条指令 ifconfig eth0 [ip]
可以用来修改ip,缺陷是需要root权限才能执行
现在试试使用c语言直接操作行不行
正文
1 linuxc操作cmd
- 技术验证
参考这篇
https://blog.csdn.net/zzj244392657/article/details/92595286
在c语言中操作命令行,是我需要的,这意思是直接调用系统函数吗
int system(const char *cmdstring);
试试,命令行中可以执行echo,比如
$ echo 123
123
所以编写程序:
int main(){
system("echo 123");
return 0;
}
编译运行,正确输出了结果123
2)编写程序
int main(){
system("ifconfig");
return 0;
}
运行,可以查看到ip信息,当前eth0 ip为自动分配的 10.0.230.104
编写程序修改它
int main(){
system("ifconfig eth0 10.0.230.31");
return 0;
}
运行
SIOCSIFADDR: 不允许的操作
SIOCSIFFLAGS: 不允许的操作
也就是没有root权限
2 权限问题
查了一早上好像没啥解决办法,以下做法在树莓派4b上不起作用
uid_t uid = getuid(); //普通用户的uid
if (setuid(0)) { //设置为普通用户和超级用户一样的权限
...
}
setuid(uid); //恢复权限
最后临时方案,用root用户登录,配置方式如下:(仅适用于无桌面系统)
1)设置root用户自动登录
在写开机自起的过程中,发现了这个service,有点lucky。
cd /etc/systemd/system
ls
会发现里面有个autologin@.service
sudo vi autologin@.service
修改ExecStart一行中 --autologin pi ,改为 --autologin root
2)设置树莓派启动选项
sudo raspi-config
设置boot options
设置Desktop/CLI
选中B2 Console Autologin Text console,automatically logged in as ‘root’ user
(如果没有第一步,这里将显示’pi’ user)
3)reboot