Mi suposición fue la siguiente:
echo "Generating some text" | su - -c cat >/output/file
Pero su
dice:
su: must be run from a terminal
¿Qué harías?
Mi suposición fue la siguiente:
echo "Generating some text" | su - -c cat >/output/file
Pero su
dice:
su: must be run from a terminal
¿Qué harías?
Respuestas:
sudo
apoya esto.
$ echo hello world | sudo cat
SUDO password:
hello world
La diferencia es que sudo
le pide su contraseña de usuario, no la contraseña root
(usuario objetivo). Sin embargo, si así lo desea, puede cambiar este comportamiento con la directiva targetpw
( runaspw
o rootpw
) sudoers.conf
.
Sin embargo, leer lo que está tratando de hacer, aunque esto resuelve el problema de escalado de permisos, no hará lo que espera. El significado /output/file
no se creará como usuario root, se creará / modificará como su usuario.
La razón de esto es que la redirección de salida de shell se realiza antes de invocar cualquier comando. Entonces, el shell se abre /output/file
y luego pasa ese archivo abierto a su
/ sudo
(y, en consecuencia, cat
).
Sin embargo, puede tee
hacer esto en su lugar, ya que la tee
utilidad abrirá el archivo en sí.
echo "hello world" | sudo tee /output/file >/dev/null
Básicamente tee
copia la salida en /output/file
y STDOUT, sin embargo, STDOUT se redirige a /dev/null
.
También puedes hacer:
echo "hello world" | sudo sh -c 'cat > /output/file'
... que es menos críptico.
sudo -v
. Le pedirá su contraseña si no ha usado sudo en unos minutos.
Para que lo sepas, no estás limitado a un solo comando por |pipe
:
this happens | then this | { then ; all of ; this too ; } | before this
Todos esos procesos se invocan al mismo tiempo, pero todos esperan |pipe
ante ellos antes de hacer cualquier cosa, siempre que lean el |pipe
mensaje, eso es. Entonces, si necesita evaluar una variable midstream o configurar una redirección, puede hacerlo. Solo tomate tu tiempo.
echo "it takes time" |
{ exec 4>|file ; cat >&4 ; } |
( sleep 1 && cat <file )
it takes time
Aquí hay otra forma:
echo "more of the same" |
( IFS= ; su -mc 'echo '"$(printf "'%s' " "`cat`")"' >|file' </dev/tty ) |
echo end of pipe
Si no lo hace, ( subshell )
el comando también $(cat)
se obtendrá </dev/tty
.
Pero si está utilizando un documento aquí, no necesita dos cat
s:
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
SALIDA:
this is the beginning
of the pipeline
Password:
middle here
this is the end
of the pipeline
La mayor parte de lo anterior es solo para demostrar esto. Todo lo que realmente necesitas es:
su -c 'cat <&3 >./file' 3<<HERE | { wait as needed ; more stuff to do ; }
$(echo "something" | and other things)
HERE