【问题标题】:Bash path variable, permission denied [closed]Bash路径变量,权限被拒绝[关闭]
【发布时间】:2019-08-29 10:19:37
【问题描述】:

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

【问题讨论】:

  • /sys/devices/bone_capemgr.*/slots是你想执行的程序,还是你想把echo字符串插入的文件?
  • 您的问题中几乎没有 C 代码。你需要向我们展示你想用这个 AINinit 宏做什么。
  • 根据我的经验,尝试以编程方式将密码输入sudo 效果不佳(更不用说像这样在程序中嵌入根密码的严重安全问题)。更好的方法是使用visudo 将允许特定用户运行(无需密码)的特定命令添加到sudoers 文件中。 (唯一的缺点是sudoers 文件的语法需要一些学习。)
  • 你想要path=/sys/devices/bone_capemgr.*/slots(没有反引号)。 (另外,我很担心里面的通配符*。你也许可以让它工作,但如果你能明确指定确切的路径会好得多。)

标签: c bash embedded beagleboneblack


【解决方案1】:

假设您将此宏的内容写入文件,然后对该文件调用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);

请注意,正如 cmets 中所述,回显密码是一种危险的解决方案(并且效果不佳,例如,对于 ssh 它就不行)。


我认为 权限问题 消息并非来自尝试使用 system() 执行 一些 代码。
我猜这是因为 sudo 的重定向使用不当。
sudo a_command &gt; 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&gt;/dev/null 应该可以解决问题。

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

【讨论】:

  • 好的,我明白了。但是我怎样才能实现.*/,因为这是我在 C 中寻找的数字。Couse 文件名应该没有 bash 代码。
  • @Pukacza 只需在同一命令行上使用反引号
  • chmod chmod(path, 0755); 不能解决权限问题。 path 没问题,它是 /sys/devices/bone_capemgr.9/slots
  • @Pukacza 在您的chmod() 通话中path 是什么?
  • *path 正是我想要的:/sys/devices/bone_capemgr.9/slots 我在调试器中检查过。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 2015-11-08
  • 2016-01-15
  • 2011-08-20
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多