Bash 路径变量,权限被拒绝

Bash path variable, permission denied

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

假设您将此宏的内容写入一个文件,然后对该文件调用 system(),您必须在 system() 之前使用 chmod(filename, 0755); 使其可执行。

(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() 执行 一些 代码。
我想这是由于 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 应该可以解决问题。

所有这些都与原始问题毫无共同之处。