Alternative zum Abschlagbefehl ohne STDOUT

14146
aef

Ich verwende | sudo tee FILENAME, um schreiben oder an eine Datei anhängen zu können, für die sehr häufig Superuser-Berechtigungen erforderlich sind.

Obwohl ich verstehe, warum es in manchen Situationen hilfreich ist, das teeauch seine Eingaben erneut an STDOUT sendet, habe ich diesen Teil nie wirklich teefür etwas Nützliches verwendet. In den meisten Situationen führt dieses Feature nur dazu, dass mein Bildschirm mit unerwünschtem Jitter gefüllt wird, wenn ich den zusätzlichen Schritt nicht mehr mache und ihn manuell stummschalte tee 1> /dev/null.

Meine Frage: Gibt es einen Befehl, der genau dasselbe macht wie tee, aber standardmäßig nichts an STDOUT ausgibt?

29
Wenn Sie das `tee` durch` cat> Dateiname` ersetzen, erhalten Sie die gewünschten Ergebnisse? sawdust vor 11 Jahren 0
`cat` schreibt nicht selbst in Dateien. Der Operator ">" funktioniert nicht, da die Dateien von meinem aktuellen Benutzer nicht beschrieben werden können. Nein, das hilft kein bisschen. Halten Sie bitte an, um die Bedeutung Ihres Kommentars alle 2 Sekunden vollständig zu ändern. Machen Sie stattdessen einen neuen. aef vor 11 Jahren 2
Wenn Sie das `| sudo tee FILENAME` mit `| sudo cat> filename`, erhalten Sie die gewünschten Ergebnisse? sawdust vor 11 Jahren 0
Nein, der Operator ">" verwendet den aktuellen Shell-Benutzer, um in die Datei zu schreiben. Dieser Benutzer verfügt nicht über die erforderlichen Berechtigungen. "cat" ist dafür völlig nutzlos. aef vor 11 Jahren 2
Siehe auch http://stackoverflow.com/questions/82256/how-do-i-use-sudo-to-redirect-output-to-a-location-i-dont-have-permission-to-wr Joachim Breitner vor 11 Jahren 2

6 Antworten auf die Frage

22
Joachim Breitner

Eine weitere Option, die verhindert, dass das Zeug zurück und dann wieder zurück geleitet wird, /dev/zeroist

sudo command | sudo dd of=FILENAME 
Genau das, wonach ich gesucht habe. Vielen Dank. aef vor 10 Jahren 0
http://superuser.com/a/850294/68284 beschreibt die zusätzlichen Optionen "oflag = append conv = notrunc", um `dd 'zum Anhängen zu verwenden. aef vor 8 Jahren 2
3
Curt

Die ddLösung druckt immer noch Junk zu stdout:

$ ls | sudo dd of=FILENAME 0+1 records in 0+1 records out 459 bytes (459 B) copied, 8.2492e-05 s, 5.6 MB/s 

Das kann mit der statusOption vermieden werden :

command | sudo dd status=none of=FILENAME 

Eine weitere interessante Möglichkeit (für Linux sowieso):

command | sudo cp /dev/stdin FILENAME 

Um eine TTY-Eingabe in eine Datei zu kopieren, mache ich häufig Folgendes:

sudo cp /dev/tty FILENAME 

Es ist schade, dass tee keine Option hat, um stdout zu unterdrücken.

2
Luca Stein

Sie könnten ein Skript verwenden. Dh setzen so etwas wie dies in dh $HOME/bin/stee, 0teeoder ähnlich:

#!/bin/bash  argv= while [[ "$1" =~ ^- ]]; do argv+=" $1" shift done  sudo tee $argv "$1" > /dev/null 

#!/bin/bash  sudo tee "$@" > /dev/null 

Mach es ausführbar:

$ chmod 755 stee

Jetzt mache:

$ ls -la | stee -a / root / foo

Das Schreiben eines Skripts und das Bereitstellen auf allen Systemen, an denen ich arbeite, ist nicht genau das, was ich wollte, aber bis jemand ein bereits vorhandenes Werkzeug benennt, denke ich, ich gehe mit Ihrer Lösung. aef vor 11 Jahren 0
Tatsächlich. Möchte es selbst sehen. Ich habe vor langer Zeit ein Programm in C geschrieben, das das tat, was Sie fragen, aber es ist lange vorbei und vergessen. Es gab damals fast kein Interesse dafür. Aber dann habe ich es eigentlich nicht viel beworben. Luca Stein vor 11 Jahren 1
1
Thunderbeef

Sie können Ihr gesamtes Kommando in sudo umschließen, sodass die Shell selbst sowie Umleitungen wie folgt ausgeführt werden root:

sudo sh -c 'do_something > FILENAME' 
-1

Es gibt nicht direkt ein Programm, das das tun kann (dies ist so ziemlich das einzige Mal, dass es nützlich wäre), aber Sie könnten leicht Ihr eigenes schreiben. Wenn Sie nicht programmieren möchten, können Sie auch ein einfaches Shell - Skript schreiben, die die gleiche Sache tut: cat > $1. Dies unterscheidet sich von der Inline-Einstellung (wie von Sägemehl vorgeschlagen), da das Sudo für das gesamte Skript gilt, einschließlich der Umleitung.

-2
Juan Camilo Gomez Martinez

Ich weiß, ist etwas zu spät, aber was ich in solchen Fällen mache (wenn ein 'flacher' stdout aber auch eine temporäre Datei benötigt wird) ist:

tee whatever | grep -v "" 
Können Sie näher erläutern, was dieser Befehl bewirkt? Vylix vor 6 Jahren 0
Entspricht tee> / dev / null, leitet jedoch zu einem grep weiter, der mit nichts übereinstimmt. 00prometheus vor 6 Jahren 0
Das hört sich noch hackiger an als das Umleiten der Ausgabe nach `/ dev / null`, und der Befehl wird dadurch nicht kürzer. Was wäre der Vorteil, wenn Sie dies anstelle der Originalmethode verwenden? waldyrious vor 5 Jahren 0