sudo不起作用,但root用户工作

时间:2017-06-16 15:53:33

标签: linux bash shell sockets unix

我正在配置一个基于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套接字相关的权限有关。我非常感谢你对此事的任何帮助。

1 个答案:

答案 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

中找到