Permission denied en Linux: 10 casos, incluido /dev/null
Permission denied es un error de Linux que aparece cuando tu cuenta actual no tiene permiso para usar ese archivo, esa carpeta o ese comando. Elige tu caso por el nombre del comando y la ruta al principio de la línea de error, comprueba los permisos y el propietario con ls -l y vuelve a ejecutarlo con los permisos o la cuenta adecuados para resolverlo.
La salida de abajo se obtuvo con la cuenta root de un servidor AlmaLinux 9.8 y con una cuenta normal de un servidor Debian 12; los nombres de cuenta y de host y la hora de la salida de /dev/null son valores de ejemplo.
1️⃣ Cómo encontrar la causa de Permission denied
La línea de error termina con la forma [comando: destino: Permission denied], y el nombre del comando y la ruta que van delante indican dónde se bloqueó. En el diagrama de abajo, elige el mensaje de error que se parezca al de tu pantalla para ver el comando que debes revisar primero y la parte de este artículo que debes leer.
2️⃣ Errores Permission denied frecuentes
🔲 Permisos de lectura y escritura de archivos
Para leer un archivo, la cuenta necesita permiso de lectura (r), y para modificarlo o crear uno nuevo, permiso de escritura (w). secret.txt, con permisos 600, solo puede leerlo y escribirlo su propietario, root.
ls -l secret.txt-rw------- 1 root root 16 Oct 29 00:29 secret.txtrunuser -u daemon -- cat secret.txtcat: secret.txt: Permission deniedAl leer el mismo archivo con otra cuenta, daemon, se rechazó al instante. Crear un archivo dentro de una carpeta sin permiso de escritura da el mismo error: en el servidor Debian 12, con una cuenta normal, touch se bloqueó en una carpeta lock con permisos 000.
touch ~/touchtest/lock/x.txttouch: cannot touch '/home/user/touchtest/lock/x.txt': Permission deniedEn la primera columna de ls -l, mira si hay r y w para el propietario, el grupo y las demás cuentas, en ese orden, y después añade permisos solo a la cuenta que los necesite con chmod o cambia el propietario con chown.
🔲 Permiso para atravesar carpetas
Aunque los permisos del archivo sean correctos, no llegarás a él si una carpeta intermedia de la ruta no tiene permiso x. En una carpeta, x es el permiso para atravesarla y entrar, y r es el permiso para leer la lista de nombres que contiene.
ls -ld web web/cssdrw-r--r-- 3 root root 35 Oct 29 00:29 web
drw-r--r-- 2 root root 23 Oct 29 00:29 web/cssrunuser -u daemon -- ls -l webls: cannot access 'web/css': Permission denied
ls: cannot access 'web/index.html': Permission denied
total 0
d????????? ? ? ? ? ? css
-????????? ? ? ? ? ? index.htmlLa carpeta web solo tiene r, así que daemon pudo leer los nombres que contiene, css e index.html, pero sin x los permisos y los tamaños quedaron como signos de interrogación. Al revés, la carpeta site, que tiene x pero no r, bloqueó el listado, mientras que un archivo cuyo nombre ya se conocía se pudo leer.
ls -ld sitedrwx--x--x 2 root root 24 Oct 29 00:29 siterunuser -u daemon -- ls sitels: cannot open directory 'site': Permission deniedrunuser -u daemon -- cat site/index.html<h1>index</h1>Si la ruta es larga, usa ls -ld para comprobar carpeta por carpeta desde arriba si tienen x, y añade a la carpeta bloqueada solo la x que la cuenta necesita para atravesarla.
🔲 Permiso de ejecución
Para ejecutar un script como ./nombre de archivo, el archivo necesita permiso x. deploy.sh, con permisos 644, se rechazó.
ls -l deploy.sh-rw-r--r-- 1 root root 8 Oct 29 00:29 deploy.sh./deploy.shbash: line 1: ./deploy.sh: Permission deniedTras añadir x al propietario con chmod u+x, la primera columna cambió a [-rwxr--r--].
chmod u+x deploy.shls -l deploy.sh-rwxr--r-- 1 root root 8 Oct 29 00:29 deploy.shSi la ejecución se rechaza aunque haya permiso x, comprueba si el sistema de archivos donde está el archivo se montó con noexec.
🔲 Lectura de información reservada a root
Una cuenta normal no puede leer la información que el sistema reserva a root, como los procesos que inició root o la información de contraseñas de otras cuentas. En el servidor Debian 12, al abrir con una cuenta normal la carpeta fd del proceso 1 apareció un error de permisos.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedchage -l daemonchage: Permission denied.La información de caducidad de la contraseña de otra cuenta se bloqueó por la misma razón; /etc/shadow, que la contiene, es un archivo que los usuarios normales no pueden leer. Con errores así no amplíes los permisos: vuelve a ejecutar el comando con sudo o como root.
🔲 Cuando > falla aunque uses sudo
sudo ejecuta como root solo el comando escrito detrás, mientras que abrir un archivo para la redirección (>) lo hace el shell de la cuenta actual antes de que se ejecute el comando. Por eso, si rediriges la salida de sudo echo a un archivo que solo root puede escribir, la línea de error empieza con el nombre del shell, con la forma [bash: ruta del archivo: Permission denied].
sudo echo x > /root/test.txtPara hacer también la redirección como root, envuelve toda la línea en sh -c para que el propio shell se ejecute con sudo; el manual oficial de sudo también da un ejemplo de ejecución dentro de sh -c para que funcione la redirección.
sudo sh -c 'echo x > /root/test.txt'tee recibe la entrada estándar y la escribe directamente en los archivos que le indicas, así que si ejecutas tee con sudo, el archivo lo abre tee con permisos de root. tee también muestra en pantalla una vez más lo que recibe.
echo x | sudo tee /root/test.txt🔲 Acceso SSH rechazado
Si delante de Permission denied aparece [cuenta@dirección del servidor:] y entre paréntesis hay un método de autenticación como publickey, el acceso se rechazó en la fase de autenticación, y lo que hay que revisar no son los permisos de archivos. En el servidor, sshd tiene StrictModes con su valor predeterminado yes, así que antes de aceptar el inicio de sesión revisa los permisos y el propietario de la carpeta personal y los archivos de esa cuenta. Si cualquiera de la carpeta personal, la carpeta ~/.ssh y ~/.ssh/authorized_keys puede escribirla otra cuenta, sshd no usa ese archivo de claves, así que comprueba con ls -ld que ninguno de los tres da permiso w a otras cuentas.
⌨️ Simulador de Permission denied
El simulador de abajo empieza con la cuenta root, y con runuser puedes pasar a otra cuenta, daemon, y ver tú mismo la salida cuando se bloquean la lectura de archivos, el paso por carpetas y el permiso de ejecución.
3️⃣ Errores Permission denied poco comunes
Si se rechaza aunque los permisos sean correctos, lo bloqueó algo fuera de los bits de permiso, como una política de SELinux o un montaje noexec. Si la ejecución se rechaza incluso como root, comprueba si el archivo no tiene ningún bit x.
En un servidor con SELinux activado aparece Permission denied cuando una política de SELinux lo bloquea aunque los bits de permiso sean correctos, así que en ese caso revisa primero los registros de denegación de SELinux. En los servidores donde funciona el demonio audit, las denegaciones quedan en /var/log/audit/audit.log como [avc: denied], junto con la acción bloqueada, el nombre del comando (comm) y el nombre del destino (name).
Comprueba con getenforce si SELinux está activado y ejecuta ausearch como root para ver las denegaciones de hoy.
getenforceausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts todayCon el demonio rsync, el [Permission denied (13)] al recibir archivos también se debió a que SELinux bloqueaba el acceso a la ruta del módulo.
En un sistema de archivos montado con noexec no se pueden ejecutar archivos directamente, así que aunque ls -l muestre x, se rechazan con [bash: ruta del script: Permission denied]. Si pasas la carpeta a findmnt -T, verás dónde está montada y con qué opciones; si entre las opciones está noexec, es este caso.
findmnt -T /tmp -o TARGET,OPTIONSroot se salta la mayoría de las comprobaciones de permisos, pero la ejecución solo se permite cuando al menos uno de propietario, grupo o demás cuentas tiene x. Por eso un script sin ninguna x se rechaza aunque root lo ejecute con ./.
Al ejecutar con ./ como root deploy.sh, cuya primera columna era [-rw-r--r-- 1 root root], apareció [bash: line 1: ./deploy.sh: Permission denied].
🔲 Cuando /dev/null se ha convertido en un archivo normal
Si nada más entrar por SSH con una cuenta normal aparecen seguidas las líneas de abajo antes del prompt del shell, comprueba primero si /dev/null, el dispositivo de caracteres que todas las cuentas usan para descartar la salida, se ha convertido en un archivo normal propiedad de root. El número de líneas depende de cada servidor según cuántos scripts profile se leen al iniciar sesión, y en el mismo servidor el error no apareció tras cambiar a root.
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
-bash: /dev/null: Permission denied
...ls -l /dev/null-rw-r--r-- 1 root root 55 Jan 10 09:00 /dev/nullstat -c %F /dev/nullregular fileLa primera columna era [-rw-r--r--] y en el tamaño ponía 55: el texto de error que otros comandos habían descartado se había acumulado en el archivo. Si una línea de comandos de limpieza que contiene la forma de abajo se ejecuta como root, rm borra el archivo de dispositivo y la redirección 2>/dev/null del siguiente comando crea con el mismo nombre un archivo normal nuevo propiedad de root.
rm -f /dev/null 2>/dev/nullEjecuta la línea de abajo como root. Si creas el dispositivo nuevo con un nombre al lado y luego lo sobrescribes con mv, no hay ningún momento en que falte el nombre, así que no queda hueco para que otra redirección vuelva a crear un archivo normal entre el borrado y la creación.
mknod -m 666 /dev/null.new c 1 3 && mv -f /dev/null.new /dev/null && ls -l /dev/nullcrw-rw-rw- 1 root root 1, 3 Jan 10 09:05 /dev/nullstat -c %F /dev/nullcharacter special fileEl [c 1 3] de mknod es el número de /dev/null en la lista de números de dispositivo del kernel. Tras la recuperación, echo x > /dev/null con una cuenta normal también terminó sin errores. Reiniciar también puede devolverlo a su estado, pero la línea de arriba, que no detiene el servidor, es más rápida.
| Comprobar | Antes de la corrección | Después del arreglo |
|---|---|---|
| Primera columna de ls -l | -rw-r--r-- | crw-rw-rw- |
| Tamaño en ls -l | 55 | 1, 3 |
| stat -c %F | regular file | character special file |
| Escritura con una cuenta normal | Permission denied | Sin error |
Lleva la salida que quieras descartar solo hasta >/dev/null o 2>/dev/null y, salvo para recuperarlo, nunca pongas /dev/null como destino de rm o mv.
🔢 FAQ & contenido recomendado
Servidor web · 403
Error 403 de Apache tras instalar APM (403 Forbidden)
Artículo sobre un caso en que el servidor web no podía leer la carpeta web, dejó Permission denied en error_log y mostró un 403.
Servidor web · 503
Error 503 tras instalar APM
Artículo que revisa con error.log un caso en que Apache no pudo conectarse al socket de php-fpm y dio un 503.
ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.