繁体   English   中英

进程替换不适用于 sudo

[英]Process substitution not working with sudo

bash 脚本以root身份运行,我想使用sudo作为非特权用户nobody执行子进程; 该子进程应该获取一个文件,该文件的内容由脚本source

我正在尝试使用 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 (这是有道理的)。

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

这个问题的答案没有帮助:如上面的示例所示, <(...)块中的代码应该访问只有root可以访问的数据。

要查看为什么您有Permission denied ,请使用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)")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM