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
-c
opzione: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.out
Esegui
sudo ls.sh
. Vedi la risposta di Steve Bennett se non vuoi creare un file temporaneo. -
Avvia una shell con
sudo -s
quindi esegui i tuoi comandi:[[email protected]]$ sudo -s [[email protected]]# ls -hal /root/ > /root/test.out [[email protected]]# ^D [[email protected]]$
-
Usa
sudo tee
(se devi scappare molto quando usi il-c
opzione):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Il reindirizzamento a
/dev/null
è necessario per fermare tee dall'output sullo schermo. Da aggiungere invece di sovrascrivere il file di output (>>
), utilizzaretee -a
otee --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