c - 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);
解决方案
假设您将此宏的内容写入文件然后调用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_file
a_command
tee
a_file
a_command
a_command | sudo dd of=a_file 2>/dev/null
所有这些与最初的问题毫无共同之处。
推荐阅读
- google-bigquery - 基于存储过程创建视图或使用其结果创建表
- flutter - 如何为 Prefixicon Flutter 添加背景
- c++ - 我该如何解决:找不到-lsqlite3?
- javascript - HTML列表项被滚动功能instgram隐藏
- python - 写入 10 位/颜色(位深度)alpha 通道图像的问题
- java - 在@Test 中撤销浓缩咖啡测试的权限
- powerbuilder - 在 powerbuilder 文本框中打印整个数组
- android - 有没有办法将音频字节发送到 SpeechRecognizer
- kotlin - Modifier.clip 被忽略
- python - 如果没有正则表达式的python中特定单词没有空格,如何在之前或之后添加空格