从 main bash 脚本运行 root
,我想使用 sudo
执行子进程作为非特权用户 nobody
;该子进程应该 source
一个文件,其内容由main脚本提供。
我正在尝试使用 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/