Cuando uso sudo para permitir ediciones en archivos, regularmente recibo 'permiso denegado'.
Por ejemplo, mi mouse está nervioso y lento, por lo que quiero desactivar el sondeo:
sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf
Se me solicita una contraseña y luego obtengo:
bash: /etc/modprobe.d/local.conf: Permission denied
Así que intenté hacer un cambio temporal para deshabilitar el sondeo usando:
sudo echo N> /sys/module/drm_kms_helper/parameters/poll
Una vez más, el sistema respondió con:
bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied
¿Algunas ideas?
command-line
bash
sudo
Jack
fuente
fuente
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi
echo
como sudo, a menos que haga algo comosudo bash -c 'echo …'
; sin embargo, los sistemas POSIX generalmente proporcionan unecho
comando externo como/bin/echo
en OS X, que sudo puede ejecutar sin rigamarole. Por lo tanto, elecho
comando que usualmente ejecuta y elecho
comando que ejecuta con sudo son probablemente dos comandos diferentes, pero similares.La redirección de salida la realiza el shell desde el que se ha invocado el comando . Entonces, dividiendo todo en bits, aquí está lo que está sucediendo *:
invoca shell
sudo echo "options drm_kms_helper poll=N"
, que ejecuta elsudo
comando con laecho "options drm_kms_helper poll=N"
línea de comandosudo solicita una contraseña, abre el shell de superusuario e invoca
echo "options drm_kms_helper poll=N"
, que ejecuta elecho
comando pasándolo"options drm_kms_helper poll=N"
echo, ejecutándose con
root
privilegios, imprime la cadena a su salida estándar.echo
el comando termina, el shell del superusuario sale,sudo
terminael shell desde el que se ha invocado el comando recopila el resultado e intenta redirigirlo
/etc/modprobe.d/local.conf
, que solo se puede escribir por root. Se obtiene el error "permiso denegado".Para conocer las formas de solucionar esto, consulte la respuesta @shantanu.
(*) - mientras que la secuencia anterior ayuda a comprender por qué falla el comando, en realidad las cosas suceden algo fuera de orden: el shell original nota la redirección e intenta abrir el archivo para escribir antes de invocar el
sudo ...
comando. Cuando se abre el archivo, el shell ni siquiera invoca el comando que se suponía que debía escribir en el archivo (gracias a @PanosRontogiannis por señalar esto).Aquí hay una prueba rápida:
En la prueba anterior,
whoami | tee who.txt
iba a crear un archivo llamado quewho.txt
contiene la palabra "raíz". Sin embargo, cuando la redirección de salida falla en el shell de llamada, también falta el archivo "who.txt" porque no se invocó el comando.fuente
Agregando a la respuesta de Shantanu:
... O podrías usar un
tee
comando como este:o si es la salida de un comando:
fuente
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null
si no desea que se imprimastdout
también.Un enfoque que no he visto mencionado aquí es simplemente ejecutar toda la línea de comandos en su propio shell. La página de
sudo
manual en sí misma da un ejemplo de este enfoque:fuente
Otra opción es usar un archivo temporal. Esto es útil en un script bash.
fuente
sudo dd of=
Para agregar como quieras:
o para recrear el archivo desde cero:
Ventajas:
tee
desde que no hay/dev/null
redirecciónsh
desde que no hay una subshell explícita (pero implícita para la redirección)dd
tiene muchas opciones poderosas, por ejemplo,status=progress
para ver el progreso de la transferenciaFunciona porque sudo reenvía stdin al comando.
fuente
dd
en cómo sobrescribimos nuestros sistemas de archivos que alguna vez fueron excelentes, y no nos damos cuenta de que también es para tareas mundanas, y que otros comandos como root también causan un gran daño si se usan en los archivos / dispositivos incorrectos. Al igualsudo tee
,sudo dd
será, por supuesto, también trabajar con aquí cuerdas , por ejemplo,sudo dd of=outfile <<<'hello world'
. [Gracias por editar. NB consh -c 'cmd'
,sh
es un subproceso que es un shell, pero en realidad no es un subshell, excepto en el sentido de que todos los comandos externos comienzan como uno.]