我无法创建BASH变量$path
,因为我得到了错误许可被拒绝。
我想用C代码执行此BASH脚本:
#define AINinit "\
#!/bin/bash \n\
path=`/sys/devices/bone_capemgr.*/slots` \n\
echo <password> | sudo -S echo cape-bone-iio > $path \n\
"
当我尝试执行path=/sys/devices/bone_capemgr.*/slots
时,出现权限被拒绝错误。 /sys/devices/bone_capemgr.*/slots
是目录。
我试图将chmod 777
添加到/sys/devices/bone_capemgr.*/slots
,但仍然无法正常工作。
我正在执行以下命令:
system(AINinit);
答案 0 :(得分:1)
假设您将此宏的内容写入文件,然后对该文件调用system()
,则必须在chmod(filename, 0755);
之前使用system()
使其可执行。
(http://man7.org/linux/man-pages/man2/chmod.2.html)
好吧,我刚刚看到了问题中的修改内容!
system(AINinit);
不可能照常工作。
system()
需要与您在终端中键入的命令行类似的命令行(而不是脚本文件的内容)。
您需要使用一个文件,如该答案的第一部分。
#define AINinit "\
#!/bin/bash \n\
path=`/sys/devices/bone_capemgr.*/slots` \n\
echo <password> | sudo -S echo cape-bone-iio > $path \n\
"
// convenient error checking omitted everywhere...
FILE *f=fopen("my_script", "w");
fputs(AINinit, f);
fclose(f);
chmod("my_script", 0755);
system("./my_script");
或者,您可以更改宏,以免使用脚本文件。
#define AINinit "\
echo <password> | sudo -S echo cape-bone-iio > `/sys/devices/bone_capemgr.*/slots`"
system(AINinit);
请注意,如评论中所述,回显密码是一种危险的解决方案(并且效果不佳,例如对于ssh
而言,效果不佳)。
我认为权限问题消息不是来自尝试使用system()
执行 some 代码的原因。
我猜这是由于sudo
重定向使用不当造成的。
sudo a_command > a_file
会执行a_file
的指令,然后先以某些特权执行a_command
。
一个非常常见的解决方法是a_command | sudo tee a_file
,其中a_command
是在没有特权的情况下执行的,但是tee
是在特权a_file
下打开的。
不方便的是,a_command
的标准输出也会在终端上回显。
如果出现回声,则命令a_command | sudo dd of=a_file 2>/dev/null
应该可以解决问题。
所有这些与原始问题没有共同之处。