从以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)")