
Si lo hago:
at -f <(echo "rm $file") now + 2 hours
eso funciona bien
Sin embargo, si hago esto:
sudo at -f <(echo "rm $file") now + 2 hours
Yo obtengo:
at: /dev/fd/63: No such file or directory
Supongo que esto se debe al orden en que se procesan los comandos. ¿Hay alguna forma de solucionar este problema utilizando el comando sudo? La única forma que se me ocurre es poner el comando en un script y sudo ese script, que es una opción, pero ahora quiero saber por qué sucede esto.
Disculpas si esto ya fue respondido en alguna parte, simplemente no puedo encontrarlo porque no estoy seguro de qué buscar.
Respuesta1
Porque el shell abre la tubería al comando en <(...)
y pasa el identificador del archivo al proceso secundario que ejecuta, sudo
en este caso. La ruta /dev/fd/63
es un método proporcionado por el kernel para permitir el acceso a un identificador de archivo ya abierto a través de un nombre de ruta normal.
Sin embargo, sudo
no pasa el identificador al proceso que ejecuta (por razones de seguridad): de forma predeterminada, cierra todos los identificadores de archivos excepto stdin, stdout y stderr, por lo que el programa que finalmente se ejecuta no tiene el identificador de archivo correspondiente a /dev/fd/63
y se produce un error.
Puedes solucionarlo haciendo la sustitución en un shell dentro de sudo:
sudo bash -c 'cat <(echo something)'
Esto, por supuesto, significa que la sustitución interna también se ejecuta con privilegios elevados:
$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)
la -C
bandera para sudo
ofrece otra forma, pero es posible que necesite una configuración adicional para permitirlo:
-C núm, --close-from=núm
Cierre todos los descriptores de archivos mayores o iguales a num antes de ejecutar un comando. No se permiten valores inferiores a tres. De forma predeterminada, sudo cerrará todos los descriptores de archivos abiertos que no sean la entrada estándar, la salida estándar y el error estándar al ejecutar un comando. La política de seguridad puede restringir la capacidad del usuario para utilizar esta opción. La política sudoers solo permite el uso de la opción -C cuando el administrador ha habilitado la opción closefrom_override.
Respuesta2
Supongo que su intención es tener cat
todos los archivos como raíz, ¿de su actual ls
?
Podría ser inteligente usar xargs
una tubería en su lugar. Prueba con esto:
ls | xargs sudo cat