TL; DR: mova sudo pelo canal ( | ) para o comando at .
Você realmente não está executando at como root.
Você executou cat como raiz ( sudo cat ... ) e canalizou a saída de cat para at , mas não executou o comando at como raiz.
Em muitos sistemas, alguns usuários não-root têm permissão para executar em tarefas. No entanto, se não for o que você deseja, seu sistema é configurado da maneira desejada e você pretende executar esse trabalho específico como root, então você pode resolver o problema executando at como root em vez de cat . (De qualquer forma, você não precisa executar cat como root nesta situação.)
Para isso, coloque sudo antes de at em vez de cat :
cat << EOF | sudo at 'now + 1 minute'
Detalhes opcionais:
Atualmente você tem:
sudo cat << EOF | at 'now + 1 minute'
echo "hello"
EOF
Isso executa cat como root com sudo , passando echo "hello" para ele (com a sintaxe here-document). A saída padrão do comando cat é canalizada para o comando at 'now + 1 minute' , que não é executado como root. Portanto, at tenta agendar o trabalho como o usuário não raiz que o executou (você).
Se você quiser que o trabalho em seja executado como root, corrija-o para:
cat << EOF | sudo at 'now + 1 minute'
echo "hello"
EOF
Se mais tarde você configurar uma conta de usuário não-root que esteja usando para ser executada em jobs, então você executaria nenhum comando como root:
cat << EOF | at 'now + 1 minute'
echo "hello"
EOF