进程替换不适用于sudo



从以root运行的mainbash脚本中,我希望使用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(这是有意义的(。

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

这个问题的答案并没有帮助:正如上面的示例所示,<(...)块中的代码应该访问只有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)")

最新更新