Votre commande ne fonctionne pas car la redirection est effectuée par votre shell qui n'a pas le droit d'écrire dans /root/test.out
. La redirection de la sortie n'est pas réalisé par sudo.
Il existe plusieurs solutions :
-
Exécutez un shell avec sudo et donnez-lui la commande en utilisant le
-c
choix :sudo sh -c 'ls -hal /root/ > /root/test.out'
-
Créez un script avec vos commandes et exécutez ce script avec sudo :
#!/bin/sh ls -hal /root/ > /root/test.out
Exécutez
sudo ls.sh
. Voir la réponse de Steve Bennett si vous ne voulez pas créer de fichier temporaire. -
Lancer un shell avec
sudo -s
puis lancez vos commandes :[[email protected]]$ sudo -s [[email protected]]# ls -hal /root/ > /root/test.out [[email protected]]# ^D [[email protected]]$
-
Utilisez
sudo tee
(si vous devez beaucoup vous échapper lorsque vous utilisez le-c
option):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
La redirection vers
/dev/null
est nécessaire pour arrêter le té de la sortie à l'écran. Pour ajouter au lieu d'écraser le fichier de sortie (>>
), utiliseztee -a
outee --append
(le dernier est spécifique à GNU coreutils).
Merci à Jd, Adam J. Forster et Johnathan pour les deuxième, troisième et quatrième solutions.
Quelqu'un ici vient de suggérer sudoing tee :
sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Cela pourrait également être utilisé pour rediriger n'importe quelle commande vers un répertoire auquel vous n'avez pas accès. Cela fonctionne parce que le programme tee est en fait un programme "écho vers un fichier", et la redirection vers /dev/null consiste à l'empêcher de sortir également à l'écran pour qu'il reste identique à l'exemple artificiel original ci-dessus.
Un truc que j'ai compris moi-même était
sudo ls -hal /root/ | sudo dd of=/root/test.out