Мое предположение было следующим:
echo "Generating some text" | su - -c cat >/output/file
Но su
говорит:
su: must be run from a terminal
Что бы вы сделали?
Мое предположение было следующим:
echo "Generating some text" | su - -c cat >/output/file
Но su
говорит:
su: must be run from a terminal
Что бы вы сделали?
Ответы:
sudo
поддерживает это.Разница в том, что
sudo
запрашивается ваш пароль пользователя, а не парольroot
(целевого пользователя). Однако, если вы хотите, вы можете изменить это поведение с помощью директивыtargetpw
(runaspw
илиrootpw
) вsudoers.conf
.Однако, читая то, что вы пытаетесь сделать, пока это решает проблему эскалации разрешений, это не будет делать то, что вы ожидаете. Значение
/output/file
не будет создано как пользователь root, оно будет создано / изменено как ваш пользователь.Причина этого заключается в том, что перенаправление вывода оболочки выполняется до вызова каких-либо команд. Таким образом, оболочка открывается
/output/file
и затем передает этот открытый файл вsu
/sudo
(и, следовательно,cat
).Однако вы можете использовать
tee
это вместо этого, так какtee
утилита откроет сам файл.В основном
tee
копирует выходные данные в/output/file
и STDOUT, однако STDOUT перенаправляется в/dev/null
.Вы также можете сделать:
... что менее загадочно.
источник
sudo -v
. Он спросит ваш пароль, если вы не использовали sudo в течение нескольких минут.Просто чтобы вы знали - вы не ограничены одной командой на
|pipe
:Все эти процессы вызываются одновременно - но все они ждут
|pipe
перед тем, как на самом деле что-то делать, до тех пор, пока они вообще читают|pipe
, то есть. Так что, если вам нужно оценить переменную midstream или настроить перенаправление, вы можете. Не торопись.Вот еще один способ:
Если вы этого не сделаете,
( subshell )
команда$(cat)
получит</dev/tty
.Но если вы используете здесь документ, вам не нужно два
cat
s:ВЫВОД:
Большинство из вышеперечисленного просто для демонстрации этого. Все, что вам действительно нужно, это:
источник