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
应该可以解决问题。
所有这些都与原始问题毫无共同之处。
我无法创建 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
应该可以解决问题。
所有这些都与原始问题毫无共同之处。