sudo at -f

sudo at -f

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, sudoen este caso. La ruta /dev/fd/63es 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, sudono 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/63y 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 -Cbandera para sudoofrece 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 cattodos los archivos como raíz, ¿de su actual ls?

Podría ser inteligente usar xargsuna tubería en su lugar. Prueba con esto:

ls | xargs sudo cat

información relacionada