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/hostso 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 suo sudo suen la raíz?

echo 'tmpfs /tmp tmpfs defaults 0 0' | sudo tee /etc/fstabque haríatee -alugar detee --append.-a--appendbandera ( ), 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\tdentro 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 -Epara 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
teeen combinación con> /dev/nullpara 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.listEditar:
Una versión más completa que le permite canalizar la entrada o redirigir desde un archivo e incluye un
-ainterruptor para desactivar los anexos (que está activado de forma predeterminada):fuente
También puede usar
spongedesde elmoreutilspaquete y no es necesario redirigir la salida (es decir, sinteeruido 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. ¡Soloteesobrescribirá 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