Alternative zum tee-Befehl ohne STDOUT

37

Ich verwende | sudo tee FILENAME, um in der Lage zu sein, eine Datei zu schreiben oder an sie anzuhängen, für die häufig Superuser-Berechtigungen erforderlich sind.

Obwohl ich verstehe, warum es in manchen Situationen hilfreich ist, dass teees seine Eingaben auch wieder an STDOUT sendet, habe ich diesen Teil von nie wirklich teefür irgendetwas Nützliches verwendet. In den meisten Situationen führt diese Funktion nur dann dazu, dass mein Bildschirm mit unerwünschtem Jitter gefüllt wird, wenn ich den zusätzlichen Schritt nicht gehe und ihn manuell stummschalte tee 1> /dev/null.

Meine Frage: Gibt es einen Befehl in der Nähe, der genau das Gleiche tut tee, aber standardmäßig nichts an STDOUT ausgibt?

aef
quelle
Wenn Sie die ersetzen teemit cat >filename, erhalten Sie die Ergebnisse , die Sie wollen?
Sägemehl
4
catschreibt nicht selbst in Dateien. Und der >Operator funktioniert nicht, da die Dateien von meinem aktuellen Benutzer nicht beschreibbar sind. Also nein, das hilft kein bisschen. Und bitte hören Sie alle 2 Sekunden auf, die Bedeutung Ihres Kommentars vollständig zu ändern. Erstellen Sie stattdessen eine neue.
11.
Wenn Sie die ersetzen | sudo tee FILENAMEmit | sudo cat >filename, erhalten Sie die Ergebnisse , die Sie wollen?
Sägemehl
4
Nein, der >Operator verwendet den aktuellen Shell-Benutzer, um in die Datei zu schreiben. Dieser Benutzer hat nicht die erforderlichen Berechtigungen. catist dafür völlig nutzlos.
11.
2
Siehe auch stackoverflow.com/questions/82256/…
Joachim Breitner

Antworten:

30

Eine andere Option, die es vermeidet, das Zeug zurück und dann zu leiten, /dev/zeroist

sudo command | sudo dd of=FILENAME
Joachim Breitner
quelle
1
Genau das, wonach ich gesucht habe. Vielen Dank.
7.
4
superuser.com/a/850294/68284 beschreibt die zusätzlichen oflag=append conv=notruncOptionen zum ddAnhängen.
22.
6

Die ddLösung druckt immer noch Junk-to-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

Mit der statusOption kann das vermieden werden :

command | sudo dd status=none of=FILENAME

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

command | sudo cp /dev/stdin FILENAME

So kopieren Sie TTY-Eingaben in eine Datei:

sudo cp /dev/tty FILENAME

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

Curt
quelle
4

Sie könnten ein Skript verwenden. Dh setzte 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

Nun mache zB:

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

Luca Stein
quelle
1
Ein Skript zu schreiben und es auf allen Systemen bereitzustellen, auf denen ich arbeite, ist nicht genau das, was ich wollte, aber bis jemand ein bereits vorhandenes Tool benennt, werde ich mit Ihrer Lösung weitermachen.
12.
2
Tatsächlich. Würde es gerne selbst sehen. Ich habe vor langer Zeit ein Programm in C geschrieben, das genau das gemacht hat, was Sie gefragt haben, aber es ist lange her und vergessen. Damals gab es fast kein Interesse daran. Aber andererseits habe ich eigentlich nicht viel dafür geworben.
Luca Stein
2

Sie können Ihren gesamten Befehl in sudo einbinden, sodass die Shell selbst sowie die Weiterleitungen wie folgt ausgeführt werden root:

sudo sh -c 'do_something > FILENAME'
Thunderbeef
quelle
-1

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


quelle
-2

Ich weiß, dass es etwas zu spät ist, aber was ich in solchen Fällen tue (wenn eine "flache" Standardausgabe, aber auch eine temporäre Datei benötigt wird), ist:

tee whatever | grep -v ""
Juan Camilo Gomez Martinez
quelle
Können Sie näher erläutern, was dieser Befehl bewirkt?
Vylix
Dasselbe wie tee> / dev / null, aber stattdessen mit einem grep weitergeleitet, das mit nichts übereinstimmt.
00prometheus
Das klingt noch abgedrehter als das Umleiten der Ausgabe auf /dev/nullund verkürzt den Befehl nicht. Was wäre der Vorteil, wenn Sie diese anstelle der ursprünglichen Methode verwenden würden?
Waldyrious