Il tuo comando non funziona perché il reindirizzamento viene eseguito dalla tua shell che non ha il permesso di scrivere su /root/test.out . Il reindirizzamento dell'output non è eseguita da sudo.
Ci sono più soluzioni:
-
Esegui una shell con sudo e dai il comando usando
-copzione:sudo sh -c 'ls -hal /root/ > /root/test.out' -
Crea uno script con i tuoi comandi ed esegui quello script con sudo:
#!/bin/sh ls -hal /root/ > /root/test.outEsegui
sudo ls.sh. Vedi la risposta di Steve Bennett se non vuoi creare un file temporaneo. -
Avvia una shell con
sudo -squindi esegui i tuoi comandi:[example@unixlinux.online]$ sudo -s [example@unixlinux.online]# ls -hal /root/ > /root/test.out [example@unixlinux.online]# ^D [example@unixlinux.online]$ -
Usa
sudo tee(se devi scappare molto quando usi il-copzione):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/nullIl reindirizzamento a
/dev/nullè necessario per fermare tee dall'output sullo schermo. Da aggiungere invece di sovrascrivere il file di output (>>), utilizzaretee -aotee --append(l'ultimo è specifico per GNU coreutils).
Grazie a Jd, Adam J. Forster e Johnathan per la seconda, terza e quarta soluzione.
Qualcuno qui ha appena suggerito di sudo tee:
sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Questo potrebbe anche essere usato per reindirizzare qualsiasi comando, a una directory a cui non hai accesso. Funziona perché il programma tee è effettivamente un programma "eco a un file" e il reindirizzamento a /dev/null serve a interrompere anche l'output sullo schermo per mantenerlo uguale all'esempio originale inventato sopra.
Un trucco che ho scoperto io stesso era
sudo ls -hal /root/ | sudo dd of=/root/test.out