Как повысить привилегии в середине конвейера?

Я предполагал следующее:

echo "Generating some text" | su - -c cat >/output/file 

Но su говорит:

 su: must be run from a terminal 

Что бы вы сделали?

  • запустить gvfs-mount как пользователь в скрипте, принадлежащем root для диспетчера сетевого менеджера
  • Использование sudo в openSUSE без фактического изменения для пользователя root (например, как в Ubuntu)
  • Выполнить su -s с аргументами
  • .bash_profile не используется при запуске su
  • Как переключить пользователя без ссылок на старый?
  • Два приложения GUI как разные пользователи на одном экране
  • запустить команду с sudo su в скрипте и перенаправить stdin и stdout
  • sudo / su пользователю в определенной группе
  • 2 Solutions collect form web for “Как повысить привилегии в середине конвейера?”

    sudo поддерживает это.

     $ echo hello world | sudo cat SUDO password: hello world 

    Разница заключается в том, что sudo запрашивает пароль пользователя, а не пароль root (целевого пользователя). Однако, если вы этого желаете, вы можете изменить это поведение с помощью targetpw (или runaspw или rootpw ) в sudoers.conf .


    Однако, читая то, что вы пытаетесь сделать, в то время как это решает проблему эскалации разрешения, оно не будет делать то, что вы ожидаете. Значение /output/file не будет создан как пользователь root, он будет создан / изменен как ваш пользователь.

    Причина этого в том, что перенаправление вывода оболочки выполняется перед вызовом любых команд. Итак, оболочка открывает /output/file а затем передает этот открытый файл в su / sudo (и, следовательно, cat ).

    Однако вы можете использовать tee для этого, потому что утилита tee откроет сам файл.

     echo "hello world" | sudo tee /output/file >/dev/null 

    В основном tee копирует вывод в /output/file и STDOUT, однако STDOUT перенаправляется в /dev/null .

    Вы также можете сделать:

     echo "hello world" | sudo sh -c 'cat > /output/file' 

    … который является менее загадочным.

    Просто чтобы вы знали – вы не ограничены одной командой per |pipe :

     this happens | then this | { then ; all of ; this too ; } | before this 

    Все эти процессы вызывают одновременно, но все они ждут перед ними перед тем, как делать что-либо, пока они вообще не читают |pipe . Итак, если вам нужно оценить переменную срединную линию или настроить перенаправление, вы можете. Не торопись.

     echo "it takes time" | { exec 4>|file ; cat >&4 ; } | ( sleep 1 && cat <file ) it takes time 

    Вот еще один способ:

     echo "more of the same" | ( IFS= ; su -mc 'echo '"$(printf "'%s' " "`cat`")"' >|file' </dev/tty ) | echo end of pipe 

    Если вы не выполняете ( subshell ) то команда $(cat) получит </dev/tty .

    Но если вы используете здесь-документ, вам не нужны два cat :

     rm ./file su -c 'cat <&3 >|./file; echo "middle here"' 3<<HERE >&2 | {\ until [ -s ./file ] ; do sleep 1 ; done ;\ sed 's/beginning/end/' ./file ; } $(echo "this is the beginning" | sed 'a\of the pipeline' | tee /dev/stderr) HERE 

    ВЫВОД:

     this is the beginning of the pipeline Password: middle here this is the end of the pipeline 

    Большинство из них – это просто демонстрация этого. Все, что вам действительно нужно:

     su -c 'cat <&3 >./file' 3<<HERE | { wait as needed ; more stuff to do ; } $(echo "something" | and other things) HERE 
    Linux и Unix - лучшая ОС в мире.