我正在配置一个基于BATMAN的网格可视化平台,称为ALFRED(我猜双关语是制造商想要的!),这样做,需要以root用户身份执行一些命令。我可以使用sudo
轻松运行大多数命令但是当我到达cat
命令时,sudo
似乎没有所需的权限。
例如,要使ALFRED服务器运行,我执行
$ sudo alfred -i br0 -m
并且它正常运行并执行命令。但是当我想使用ALFRED写入UNIX套接字时,我执行以下命令,意图将主机名写入socket 64
$ sudo cat /etc/hostname | alfred -s 64
我收到了错误
can't connect to unix socket: Permission denied
但是当我通过su root
手动切换到root用户并运行
cat /etc/hostname | alfred -s 64
该命令正确执行且没有给出错误,当我退出root用户并返回普通用户时,我可以通过调用来读取套接字
$ sudo alfred -r 64
这很奇怪。为了使它比它更奇怪,我在shell脚本中编写了cat /etc/hostname | alfred -s 64
命令并将其命名为alfred_start.sh
。现在我可以轻松运行
$ sudo sh alfred_start.sh
并且没有给出错误。
我找到了解决整个问题的方法,但问题仍然存在,为什么?
是否有与root
相关联的不同权限无法通过sudo
访问?
我不相信BATMAN或ALFRED与整个事情有任何关系,它可能与写入UNIX套接字相关的权限有关。我非常感谢你对此事的任何帮助。
答案 0 :(得分:2)
sudo是一个普通命令,它以正常方式与调用shell交互。在这个管道中:
sudo cat /etc/hostname | alfred -s 64
左侧的命令是sudo cat /etc/hostname
。它以提升的权限运行cat
。右侧的命令中没有sudo
,因此alfred
进程不是sudo
- 提升。
将sudo
移动到管道右侧。 (我假设您不需要提升权限来阅读/etc/hostname
!)
如果您确实需要sudo
整个管道,您必须告诉sudo创建priveleged shell,然后执行作为字符串提供的管道,如下所示:
sudo sh -c 'something | something'
其他示例可在this question
中找到