Esta es una pregunta bastante simple, al menos parece que debería ser, sobre los permisos de sudo en Linux.
Hay un montón de veces cuando sólo quiero añadir algo a /etc/hosts
o un archivo similar, pero terminan por no poder porque ambos >
y >>
no se les permite, incluso con raíz.
¿Hay alguna manera de hacer que esto funcione sin tener que hacerlo su
o sudo su
en la raíz?
echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstab
que haríatee -a
lugar detee --append
.-a
--append
bandera ( ), el comando sobrescribiría todo el archivo con la cadena dada en lugar de agregarlo al final.El problema es que el shell realiza la redirección de salida, no sudo o echo, por lo que esto se hace como su usuario habitual.
Pruebe el siguiente fragmento de código:
fuente
sh
, echo puede interpretar secuencias de escape como\t
dentro de comillas simples. Podrías usarprintf %s 'something'
en su lugar.sudo /bin/bash -c "echo 'fs.inotify.max_user_watches = 524288' > /etc/sysctl.d/60-golang-inotify.conf"
por ejemplo.El problema es que es su shell el que maneja la redirección; está tratando de abrir el archivo con sus permisos, no los del proceso que está ejecutando bajo sudo.
Use algo como esto, tal vez:
fuente
sudo
(por razones de seguridad) no propaga el entorno al subproceso. Puede usarsudo -E
para evitar esta restricción.sudo sh -c "echo 'something' >> $FILENAME"
, con comillas dobles, esto va a trabajar - la sustitución de variables se realiza por la capa exterior, no la cáscara sudoed.fuente
Haciendo
Deberia trabajar. El problema es que> y >> son manejados por su shell, no por el comando "sudoed", por lo que los permisos son los suyos, no los del usuario al que está "sudoing".
fuente
Quisiera señalar, para los curiosos, que también puede citar un heredoc (para bloques grandes):
fuente
"
elimina lo interno pero no hace que el comando falle.)En bash puedes usarlo
tee
en combinación con> /dev/null
para mantener limpio el stdout.fuente
Usando la respuesta de Yoo , pon esto en tu
~/.bashrc
:Ahora puedes correr
sudoe 'deb blah # blah' /etc/apt/sources.list
Editar:
Una versión más completa que le permite canalizar la entrada o redirigir desde un archivo e incluye un
-a
interruptor para desactivar los anexos (que está activado de forma predeterminada):fuente
También puede usar
sponge
desde elmoreutils
paquete y no es necesario redirigir la salida (es decir, sintee
ruido para ocultar):fuente
Mediante el uso de sed -i con $ a , puede agregar texto, que contiene variables y caracteres especiales, después de la última línea.
Por ejemplo, agregando $ NEW_HOST con $ NEW_IP a / etc / hosts:
Opciones de sed explicadas:
fuente
echo 'Hola mundo' | (sudo tee -a /etc/apt/sources.list)
fuente
¿Qué tal:
echo text | sudo dd status = none of = privilegedfile
Quiero cambiar / proc / sys / net / ipv4 / tcp_rmem.
Hice:
sudo dd status = none of = / proc / sys / net / ipv4 / tcp_rmem <<< "4096 131072 1024000"
elimina el eco con un solo documento de línea
fuente
Esto funcionó para mí: comando original
Comando de trabajo
fuente
tee -a
. ¡Solotee
sobrescribirá el archivo!¿Puedes cambiar la propiedad del archivo y luego volver a cambiarlo después de usarlo
cat >>
para agregar?¿Algo como esto funciona para ti?
fuente