Bash路径变量,权限被拒绝

时间:2019-08-29 10:19:37

标签: c bash embedded beagleboneblack

我无法创建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);

1 个答案:

答案 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应该可以解决问题。

所有这些与原始问题没有共同之处。