首页 > 解决方案 > Bash路径变量,权限被拒绝

问题描述

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

标签: cbashembeddedbeagleboneblack

解决方案


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

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_filea_commandteea_file
a_command
a_command | sudo dd of=a_file 2>/dev/null

所有这些与最初的问题毫无共同之处。


推荐阅读