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: Hiechocomo sudo, a menos que haga algo comosudo bash -c 'echo …'; sin embargo, los sistemas POSIX generalmente proporcionan unechocomando externo como/bin/echoen OS X, que sudo puede ejecutar sin rigamarole. Por lo tanto, elechocomando que usualmente ejecuta y elechocomando 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 elsudocomando 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 elechocomando pasándolo"options drm_kms_helper poll=N"echo, ejecutándose con
rootprivilegios, imprime la cadena a su salida estándar.echoel comando termina, el shell del superusuario sale,sudoterminael 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.txtiba a crear un archivo llamado quewho.txtcontiene 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
teecomando como este:o si es la salida de un comando:
fuente
sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/nullsi no desea que se imprimastdouttambié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
sudomanual 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:
teedesde que no hay/dev/nullredirecciónshdesde que no hay una subshell explícita (pero implícita para la redirección)ddtiene muchas opciones poderosas, por ejemplo,status=progresspara ver el progreso de la transferenciaFunciona porque sudo reenvía stdin al comando.
fuente
dden 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 ddserá, por supuesto, también trabajar con aquí cuerdas , por ejemplo,sudo dd of=outfile <<<'hello world'. [Gracias por editar. NB consh -c 'cmd',shes 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.]