Ihr Befehl funktioniert nicht, da die Umleitung von Ihrer Shell durchgeführt wird, die keine Berechtigung zum Schreiben in /root/test.out
hat . Die Umleitung der Ausgabe ist nicht durchgeführt von sudo.
Es gibt mehrere Lösungen:
-
Führen Sie eine Shell mit sudo aus und geben Sie ihr den Befehl mit
-c
Möglichkeit:sudo sh -c 'ls -hal /root/ > /root/test.out'
-
Erstellen Sie ein Skript mit Ihren Befehlen und führen Sie dieses Skript mit sudo:
aus#!/bin/sh ls -hal /root/ > /root/test.out
Führen Sie
sudo ls.sh
aus . Sehen Sie sich die Antwort von Steve Bennett an, wenn Sie keine temporäre Datei erstellen möchten. -
Starten Sie eine Shell mit
sudo -s
Führen Sie dann Ihre Befehle aus:[[email protected]]$ sudo -s [[email protected]]# ls -hal /root/ > /root/test.out [[email protected]]# ^D [[email protected]]$
-
Verwenden Sie
sudo tee
(wenn Sie bei der Verwendung von-c
viel entkommen müssen Option):sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Die Weiterleitung zu
/dev/null
wird benötigt, um tee zu stoppen von der Ausgabe auf dem Bildschirm. Zum Anhängen anstatt die Ausgabedatei zu überschreiben (>>
), verwenden Sietee -a
odertee --append
(Der letzte ist spezifisch für GNU Coreutils).
Vielen Dank an Jd, Adam J. Forster und Johnathan für die zweite, dritte und vierte Lösung.
Jemand hier hat gerade sudoing tee vorgeschlagen:
sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null
Dies könnte auch verwendet werden, um jeden Befehl in ein Verzeichnis umzuleiten, auf das Sie keinen Zugriff haben. Es funktioniert, weil das tee-Programm effektiv ein "echo to a file"-Programm ist, und die Weiterleitung nach /dev/null soll verhindern, dass es auch auf dem Bildschirm ausgegeben wird, um es so zu halten wie das ursprünglich erfundene Beispiel oben.
Ein Trick, den ich selbst herausgefunden habe, war
sudo ls -hal /root/ | sudo dd of=/root/test.out