linux - sudo 不起作用,但 root 用户可以

标签 linux bash shell sockets unix

我正在配置一个基于 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/

相关文章:

shell - Xamarin 表单 : Can Add tabs in Shell App programmatically on the contentpage

linux - 如何比较两个不同的文件并提取重叠数据?

linux - Jenkins 服务不会在 Oracle Linux 上使用 SDKMan Java 启动

c - fallocate 和 ftruncate 有什么区别

java - 将字符串从 Java 传递到 bash 脚本

ruby - 使用 ruby​​ 自动执行任务

linux - 什么时候用引号括起 shell 变量?

bash - 如何杀死一个nohup进程?

linux - 真棒 WM : master windows count

arrays - 在 shell 脚本中获取日期