
Se eu fizer:
at -f <(echo "rm $file") now + 2 hours
isso funciona bem
No entanto, se eu fizer isso:
sudo at -f <(echo "rm $file") now + 2 hours
Eu recebo:
at: /dev/fd/63: No such file or directory
Presumo que isso se deva à ordem em que os comandos são processados. Existe alguma maneira de contornar isso usando o comando sudo? A única maneira que consigo pensar é colocar o comando em um script e sudo esse script que é uma opção, mas agora quero saber por que isso acontece.
Peço desculpas se isso já foi respondido em algum lugar, simplesmente não consigo encontrar porque não tenho certeza do que procurar.
Responder1
Porque o shell abre o canal para o comando no <(...)
e passa o identificador do arquivo para o processo filho que ele executa, sudo
neste caso. O caminho /dev/fd/63
é um método fornecido pelo kernel para permitir acesso a um identificador de arquivo já aberto através de um nome de caminho normal.
No entanto, sudo
não passa o identificador para o processo que executa (por razões de segurança): por padrão, ele fecha todos os identificadores de arquivo, exceto stdin, stdout e stderr, portanto, o programa que eventualmente é executado não possui o identificador de arquivo correspondente /dev/fd/63
e há erros.
Você pode resolver isso fazendo a substituição em um shell dentro do sudo:
sudo bash -c 'cat <(echo something)'
É claro que isso significa que a substituição interna também é executada com privilégios elevados:
$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)
o -C
sinalizador for sudo
oferece outra maneira, mas pode precisar de configuração extra para ser permitido:
-C num, --close-from=num
Feche todos os descritores de arquivo maiores ou iguais a num antes de executar um comando. Valores inferiores a três não são permitidos. Por padrão, sudo fechará todos os descritores de arquivo abertos, exceto entrada padrão, saída padrão e erro padrão ao executar um comando. A política de segurança pode restringir a capacidade do usuário de usar esta opção. A política sudoers só permite o uso da opção -C quando o administrador habilitou a opção closefrom_override.
Responder2
Presumo que sua intenção seja cat
todos os arquivos como root, do seu atual ls
?
Poderia ser inteligente usar xargs
um tubo. Tente com isto:
ls | xargs sudo cat