Ich frage mich, ob es eine Möglichkeit gibt, eine "virtuelle Datei" aus einer Bash-Ausgabe zu erstellen.
Beispiel: Angenommen, ich möchte die Ausgabe von mysqldump
als Anhang an eine externe E-Mail-Adresse senden. Ich kann Mutt dazu benutzen. Die mutt
Option, die ich verwenden muss, ist -a <name of the file I want to attach>
. Ich weiß, dass ich eine temporäre Datei verwenden könnte:
mysqldump mysqldumpoptions > /tmp/tempfile && mutt -a /tmp/tempfile admin@example.org
Aber ich würde die mysqldump
Ausgabe lieber direkt zu Mutt umleiten . Die -a
Option von Mutt akzeptiert nur eine Datei und keinen Stream, aber vielleicht gibt es eine Möglichkeit, eine Art virtuellen Dateideskriptor oder etwas Ähnliches zu übergeben. So etwas wie:
mutt -a $(mysqldump mysqldumpoptions) admin@example.org
Ist es möglich? Wenn nein, warum?
Dies ist vielleicht ein albernes Beispiel und es gibt sicherlich einfachere Möglichkeiten, dies zu tun, aber ich hoffe, es erklärt meine Frage zum Erstellen einer virtuellen Datei aus der Ausgabe eines anderen Befehls.
quelle
Antworten:
Dies ist der sauberste Weg, um das zu tun, was Sie wollen:
Der
<()
Operator ist das, wonach Sie gefragt haben. Es erstellt ein FIFO (oder / dev / fd), gibt einen Prozess aus und verbindet stdout mit dem FIFO.>()
tut dasselbe, außer dass stattdessen stdin mit dem FIFO verbunden wird. Mit anderen Worten, es erledigt alles für Sie hinter den Kulissen. oder auf einem modernen Betriebssystem noch besser.Außer natürlich, dass das mit Mutt nicht funktioniert, heißt es:
Ich vermute, das Problem ist, dass Mutt versucht, in der Datei zu suchen, was Sie mit keiner Pipe tun können. Das Suchen ist wahrscheinlich so etwas wie das Scannen der Datei, um herauszufinden, welcher MIME-Typ es ist und welche Codierungen funktionieren könnten (dh ob die Datei 7-Bit oder 8-Bit ist), und dann das Suchen zum Anfang der Datei, um sie tatsächlich in die Nachricht zu codieren .
Wenn es sich bei dem, was Sie senden möchten, um einfachen Text handelt, können Sie immer so etwas tun, um es zum Hauptinhalt der E-Mail zu machen (nicht ideal, aber es funktioniert tatsächlich):
quelle
Ich denke, was Sie suchen, ist eine Fifo-Verwendung
mknod
Beachten Sie, dass der Schreibvorgang blockiert wird, wenn kein Lesevorgang stattfindet.
z.B
quelle
Muss es ein Anhang sein? Wenn es als Hauptteil einer Nachricht angezeigt werden kann (7-Bit-Clean-ASCII, enthält kein '.' In einer eigenen Zeile usw.), funktioniert Folgendes:
quelle
Möglicherweise können Sie den Dateinamen
/dev/stdin
mit mutt verwenden, der aus dem Standard- Dateinamen liest.Hm, ich habe es gerade ausprobiert und Mutt beschwert sich:
Naja. Ich denke, dies beantwortet Ihre Frage, mit der
-a
Option mutt erwartet eine reguläre Datei, die kein Gerät oder eine Pipe impliziert.quelle
Ein FIFO ist wahrscheinlich der beste Weg. Sie können jedoch
mkfifo /path/to/fifo
stattdessen verwendenquelle
Ich vermisse hier vielleicht etwas, aber warum sollte ich mutt verwenden, wenn dies eher nach einem Job für / usr / sbin / sendmail klingt (oder wo immer es in Ihrer Distribution lebt)?
mysqldump mysqldumpoptions | sendmail [email protected]
Die meisten Unix-MTAs stellen den Befehl / usr / sbin / sendmail zur Verfügung, und alle verstehen mehr oder weniger die gleichen Optionen und arbeiten mehr oder weniger auf die gleiche Weise. In fast allen Fällen müssen Sie sich nicht darum kümmern, welchen MTA / welche Implementierung von sendmail Sie verwenden.
Es gibt auch mehrere andere Alternativen, einschließlich mail / mailx
quelle
Die Option Mutt -a verwendet speziell MIME-Typen, die unter /etc/mime.types definiert sind. Keiner der virtuellen Dateitypen, von denen Sie denken, dass er tatsächlich ein gültiger MIME-Typ ist, ist registriert. Ich glaube also nicht, dass MUTT-Anhänge funktionieren würden. Nur zum Beweis des Konzepts können Sie versuchen, das MIME-Support-Paket zu installieren (das MIME-Dateizugriffs-Binärdateien wie "see", "edit" usw. enthält) und "see" für eine virtuelle Datei (z. B. eine Pipe) auszuführen. Sie werden sehen, dass dies der Fall ist nicht erkennen. Das grundlegende Problem ist, dass normalerweise eine virtuelle Datei den Dateninhalt im Speicher und nicht auf der Festplatte enthält. Das Dateiobjekt ist lediglich ein Zeiger. Sie können sogar versuchen, eine virtuelle Datei mit tar / gz zu verpacken und mutt glücklich zu machen, aber ich bezweifle, dass Sie am anderen Ende irgendetwas Nützliches herausholen werden ... :)
quelle