如何在管道中间提升权限?

x-y*_*uri 8 shell su io-redirection shell-script

我的猜测如下:

echo "Generating some text" | su - -c cat >/output/file
Run Code Online (Sandbox Code Playgroud)

但是su说:

su: must be run from a terminal
Run Code Online (Sandbox Code Playgroud)

你会怎么办?

phe*_*mer 8

sudo 支持这一点。

$ echo hello world | sudo cat  
SUDO password: 
hello world
Run Code Online (Sandbox Code Playgroud)

不同之处在于sudo要求您提供用户密码,而不是root(目标用户)密码。不过,如果你愿意的话,你可以更改与这种行为targetpw(或runaspwrootpw在)指令sudoers.conf


然而,阅读你想要做的事情,虽然这解决了权限升级问题,但它不会像你期望的那样做。意思是/output/file不会以 root 用户身份创建,而是以您的用户身份创建/修改。

这样做的原因是 shell 输出重定向是在调用任何命令之前完成的。所以外壳打开/output/file,然后将打开的文件传递给su/ sudo(因此,cat)。

但是,您可以使用它tee来代替,因为该tee实用程序将打开文件本身。

echo "hello world" | sudo tee /output/file >/dev/null
Run Code Online (Sandbox Code Playgroud)

基本上tee将输出复制到/output/file和 STDOUT,但是 STDOUT 被重定向到/dev/null.

你也可以这样做:

echo "hello world" | sudo sh -c 'cat > /output/file'
Run Code Online (Sandbox Code Playgroud)

......这不那么神秘。