我需要以另一个用户身份运行命令并写入其标准输入并从其标准输出读取。我只能通过打开新的 shell 作为另一个用户运行命令:sudo su anotheruser
但是使用新打开的 shell,我将丢失调用者的标准输入和标准输出。我不被允许跑步sudo -u anotheruser -c command
我发现我可以使用命名管道进行 stdin/stdout 重定向,所以我编写了一个脚本:
#!/usr/bin/env bash
mkfifo pipein
mkfifo pipeout
echo '/usr/lib/openssh/sftp-server 0<pipein >pipeout' | sudo su anotheruser
cat 0<&1 >pipein & cat <pipeout
wait
但它并没有按预期工作。我想将脚本的标准输入重定向到命令的标准输入,并将命令的标准输出重定向到脚本的标准输出 - 这样我就可以无缝地使用脚本作为原始命令。
答案1
您的帖子中似乎存在一些编辑错误。 sudo 行缺少“&”,并且您稍后在脚本中为管道使用不同的名称。这是对我有用的东西:
#!/usr/bin/env bash
mkfifo pipein
mkfifo pipeout
echo '/usr/lib/openssh/sftp-server <pipein >pipeout' | sudo su anotheruser &
cat <pipeout &
cat >pipein
wait
rm -f pipein pipeout
答案2
我不确定我完全理解你的问题,但我认为你正在追求这样的事情:
sudo -u $USER sh -c "ls -la /home" | grep $USER
或者如果您希望管道作为其他用户
sudo -u $USER sh -c "ls -la /home | grep $USER"