sudo at -f

sudo at -f

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, sudoneste 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, sudonã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/63e 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 -Csinalizador for sudooferece 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 cattodos os arquivos como root, do seu atual ls?

Poderia ser inteligente usar xargsum tubo. Tente com isto:

ls | xargs sudo cat

informação relacionada