bash - 进程替换不适用于 sudo

标签 bash

ma​​in bash 脚本运行 root ,我想使用 sudo 执行子进程作为非特权用户 nobody ;该子进程应该 source一个文件,其内容由ma​​in脚本提供。

我正在尝试使用 bash 进程替换来解决这个问题。但我无法让它发挥作用。

有人可以告诉我为什么下面的脚本......

#! /bin/bash
sudo -u nobody \
    bash -c 'source /dev/stdin || ls -l /dev/stdin /proc/self/fd/0 /proc/$$/fd/0; echo "A=$A"' \
        < <(echo "A=$(ls /root/.profile)")

...当运行为 root 时,产生以下输出?

root@raspi:~# ./test3.sh
bash: line 1: /dev/stdin: Permission denied
lrwxrwxrwx 1 root   root    15 Mar 20 20:55 /dev/stdin -> /proc/self/fd/0
lr-x------ 1 nobody nogroup 64 Aug 21 14:38 /proc/3243/fd/0 -> 'pipe:[79069]'
lr-x------ 1 nobody nogroup 64 Aug 21 14:38 /proc/self/fd/0 -> 'pipe:[79069]'
A=

我希望从 stdin 读取内容工作是因为,如 ls -l 所示,读取访问stdin被授予nobody (这是有道理的)。

那么为什么这不起作用呢?有什么办法让它发挥作用吗?

this question 的答复没有帮助:如上面的示例所示,<(...) 中的代码bloc 应该访问仅 root 的数据可以。

最佳答案

要查看权限被拒绝的原因,请使用ls -lL

sudo -u nobody \
    bash -c 'source /dev/stdin || ls -lL /dev/stdin /proc/self/fd/0 /proc/$$/fd/0; echo "A=$A"' \
        < <(echo "A=$(ls /root/.profile)")

要解决该错误,请使用 cat |

sudo -u nobody \
    bash -c 'cat | { source /dev/stdin || ls -lL /dev/stdin /proc/self/fd/0 /proc/$$/fd/0; echo "A=$A"; }' \
        < <(echo "A=$(ls /root/.profile)")

关于bash - 进程替换不适用于 sudo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73434990/

相关文章:

linux - 为什么我的 sed 命令在使用变量时失败?

C 到 NASM 转换

bash - 在 bash 中,如何 cmd1 |当 cmd1 失败时,cmd2 返回 cmd1 的状态码?

bash - 如何列出我的 shell 中定义的函数?

bash - 如何根据可用空间调整进度条的大小?

Bash 脚本自动创建符号链接(symbolic link)到树中的子目录

linux - 挂载命令后如何启动系统服务

linux - Bash 字符串日期错误值

bash - 如何创建带参数的 bash 别名?

linux - 如何在 sed shell 命令中使用数组?