Endprogrammausgabe in Datei unter Linux

9

Ich weiß, dass wir das folgende Format verwenden können, um die Bildschirmausgabe in eine Datei umzuleiten:

$ your_program > /tmp/output.txt

Wenn ich jedoch den folgenden Befehl verwendet habe, heißt es "-bash: /home/user/errors.txt: Berechtigung verweigert".

sudo tail /var/log/apache2/error.log > ~/errors.txt

Darf ich wissen, wie diese Ausgabe funktioniert? Die Datei ~ / Errors.txt existiert nicht. Muss ich diese txt-Datei zuerst erstellen, bevor ich den Umleitungsbefehl verwende?

Xianlin
quelle
1
Was passiert, wenn Sie tippen echo hi > ~/errors.txt? Ist /home/userIhr korrektes Home-Verzeichnis (oder hat Bash irgendwie verwirrt, wo sich Ihr Home-Verzeichnis befindet)?
cjm
Ist userder Benutzer, der den Befehl ausführt?
Benutzer unbekannt
Ja, der Benutzer ist der Benutzer, der den Befehl
ausführt
Dies ist normales Verhalten für sudo. sudoerlaubt keine Umleitung. Zu viele Möglichkeiten, damit die Leute damit ungezogene Dinge tun können, die nicht in der sudoers.confDatei enthalten sind. Alternativ können Sie sudo bash -c "tail /var/log/apache2/error.log > ~/errors.txt"das Ende von Errors.log in die Datei in Ihrem Home-Verzeichnis verschieben.
Tim Kennedy

Antworten:

17

Hinter dem Rohr funktioniert der Sudo nicht. Ich weiß nicht, warum Sie nicht zu Ihnen nach Hause schreiben können - vielleicht gehört die Datei zu root?

 sudo tail /var/log/apache2/error.log | sudo tee ~/errors.txt

Vielleicht brauchen Sie einen anderen Benutzer hinter dem Rohr. Natürlich benötigen Sie keine bereits vorhandene Datei.

Benutzer unbekannt
quelle
Ja, das hat funktioniert ...
Xianlin
Was das Berechtigungsproblem betrifft, ist $ HOME möglicherweise NFS-gemountet mit Rootsquash?
Ansgar Esztermann
Das $ HOME ist nicht NFS-gemountet.
Xianlin
6

Wenn Sie schreiben sudo somecommand > ~/errors.txt, ist die Shell, die aufruft sudo(und wie Sie ausgeführt wird), diejenige, die die Umleitung und das Öffnen ausführt ~/errors.txt. Siehe Umleiten von stdout in eine Datei, für die Sie keine Schreibberechtigung haben . Normalerweise besteht das Problem in diesem Fall darin, dass root in die Datei schreiben soll. In der verknüpften Frage finden Sie Möglichkeiten dazu.

Hier ist es seltsam, dass Sie nicht in eine Datei in Ihrem Home-Verzeichnis schreiben können. Möglicherweise haben Sie zuvor eine Ausgabe als root in gespeichert /home/user/errors.txt, und diese Datei ist jetzt vorhanden und gehört zu root. Entfernen Sie die Datei (Sie können dies tun, solange Sie über Schreibberechtigung verfügen /home/user, und können sie dann als Benutzer erstellen.

rm ~/errors.txt
sudo tail /var/log/apache2/error.log > ~/errors.txt

Wenn die Datei wirklich nicht vorhanden ist, haben Sie keine Schreibberechtigung in Ihrem Home-Verzeichnis. Obwohl dies technisch möglich und gelegentlich für einige eingeschränkte Benutzer nützlich ist, ist es sehr ungewöhnlich.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich habe versucht, '/home/user/errors.txt' zu löschen und den obigen Befehl zu verwenden. Es hat nicht funktioniert, verbiete mir trotzdem, in das Home-Verzeichnis zu schreiben. Wie auch immer, ich denke, der von Ihnen angegebene Link kann als meine Lösung verwendet werden. Es ist das gleiche wie die erste Antwort in diesem Beitrag. Sie haben jedoch einige ausführliche Erklärungen zur Umleitung von stdout in eine Datei gegeben, und ich danke Ihnen dafür.
Xianlin