我正在配置一个基于 BATMAN 的网格可视化平台,称为 ALFRED(我猜这个双关语是制造商故意的!),在此过程中,需要以 root 用户身份执行几个命令。我可以使用 sudo
轻松运行大多数命令但是当我到达cat
时命令,sudo
似乎没有所需的权限。
例如,要运行 ALFRED 服务器,我执行
$ sudo alfred -i br0 -m
它运行正常并执行命令。但是当我想使用 ALFRED 写入 UNIX 套接字时,我执行以下命令,打算将主机名写入套接字 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
这很奇怪。只是为了让它变得更奇怪,我写了 cat /etc/hostname | alfred -s 64
shell 脚本中的命令并将其命名为 alfred_start.sh
。现在我可以轻松运行
$ sudo sh alfred_start.sh
并且没有给出错误。
我已经找到了解决整个问题的方法,但问题仍然存在,为什么?
是否有与 root
相关的不同权限无法通过 sudo
访问?
我不认为 BATMAN 或 ALFRED 与整个事件有任何关系,它可能与写入 UNIX 套接字相关的权限有关。我将非常感谢任何有关此事的帮助。
最佳答案
sudo 是一个普通命令,它以正常方式与调用 shell 交互。在此管道中:
sudo cat /etc/hostname | alfred -s 64
左边的命令是sudo cat/etc/hostname
。它以提升的权限运行 cat
。右侧的命令中没有 sudo
,因此 alfred
进程没有 sudo
提升。
将 sudo
移至管道右侧。 (我假设您不需要提升权限来读取您的 /etc/hostname
!)
如果您确实需要 sudo
整个管道,则必须告诉 sudo 创建特权 shell,然后该 shell 执行作为字符串提供的管道,如下所示:
sudo sh -c 'something | something'
其他示例可以在 this question 中找到
关于linux - sudo 不起作用,但 root 用户可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44593375/