【发布时间】:2021-09-21 14:32:36
【问题描述】:
我有一个 C 语言的 CGI 脚本,它在我的 Raspberry pi 中打开串行端口 ttyUSB0,在我的设备上发送数据并得到它的响应。
当我在终端中手动启动该脚本时,该脚本可以正确执行,但我的网页无法访问该端口来打开它。
我的代码:
int main (void) {
printf("Content-type: text/html\n\n");
const int fd = open ("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_SYNC);
if (fd == -1)
{
printf ("error %d opening %s: %s", errno, "ttyUSB0", strerror (errno));
return 0;
}
网页中的响应:“error 13 opening ttyUSB0: Permission denied”
在命令“id -Gn pi”的输出下方: pi adm tty uucp dialout cdrom sudo 音频 视频 plugdev 游戏 用户输入 netdev spi i2c gpio lpadmin
谢谢。
【问题讨论】:
-
"Manual" 程序的执行是从 shell 作为拥有 tty 设备的组中的用户执行的,例如拨出组。作为 CGI 脚本执行具有不同的进程所有者,该进程所有者不在拥有 tty 设备的组中。简单而正确的解决方案是将该进程用户添加到 dialout 组。
-
我正在阅读一些问题,例如解决方案是像您的目的一样在组中添加拨出但使用命令后:“sudo usermod -a -G dialout pi”我的问题不是固定的。你有什么想法吗?
-
您如何验证 CGI 脚本的进程所有者是谁?
-
只需在论坛的不同主题中搜索并使用 ls -l /ttyUSB0 被群组拨出使用。然后,如果我使用命令:“top”并且我发出请求,apache 似乎与用户 www-data 一起执行,所以有些人要求执行命令“sudo adduser www-data dialout”,但这并没有解决我的问题。你能帮我吗?
-
我的问题已通过命令 sudo adduser www-data dialout 解决并重新启动系统抱歉浪费了时间。
标签: linux apache raspberry-pi serial-port cgi