• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Problem mit tee in einer Pipe

crotchmaster

happy BSD user
Themenstarter #1
Moin Forenmitglieder,

ich bin wieder dabei, mein Backup weiter zu verbessern. Die neueste Idee ist, eine Datei mit einer Prüfsumme der Backupdatei zu erstellen.
Der Hintergrund ist, dass die Downloads der Backupdateien manchmal fehlschlagen. Da die Downloads automatisch erfolgen sollen,
möchte ich sicher gehen, dass die Downloads korrekt gezogen wurden, bevor sie auf dem SFTP-Server automatisch gelöscht werden.

In dem Backup-Script mache ich folgendes:
Code:
openssl rand -base64 128 > ${BASE_DIR}/${PASSWD_FILE}                                                                                              
                                                                                                                                                       
openssl rsautl -encrypt -inkey ${PUBKEY} -pubin -in ${BASE_DIR}/${PASSWD_FILE} -out ${BASE_DIR}/${ENCRYPTED_PASSWD_FILE}                           
                                                                                                                                                       
cat ${BASE_DIR}/${ENCRYPTED_PASSWD_FILE}|\                                                                                                         
    lftp sftp://${SFTP_USER}@${SFTP_HOST} -e "put /dev/stdin -o /users/${SFTP_USER}/${ENCRYPTED_PASSWD_FILE}"                                          
                                                                                                                                                       
zfs send zroot/postgresdb@${SNAPSHOT_NAME}|\                                                                                                   
    gzip -2 -c|\                                                                                                                                   
    openssl enc -aes-256-cbc -salt -pbkdf2 -pass file:${BASE_DIR}/${PASSWD_FILE}|\                                                                 
    mbuffer -m 256M -P 50 -W 30 -q|\                                                                                                               
    lftp sftp://${SFTP_USER}@${SFTP_HOST} -e "put /dev/stdin -o /users/${SFTP_USER}/${SNAPSHOT_NAME}.gz.enc"
Das funktioniert bisher richtig gut.

Jetzt möchte die Prüfsumme erstellen und da scheitere ich im Moment.
Der letzte Befehl wird zu:
Code:
zfs send zroot/postgresdb@${SNAPSHOT_NAME}|\                                                                                                   
    gzip -2 -c|\                                                                                                                                   
    openssl enc -aes-256-cbc -salt -pbkdf2 -pass file:${BASE_DIR}/${PASSWD_FILE}|\                                                                 
    mbuffer -m 256M -P 50 -W 30 -q|\                                                                                                               
    tee >$(shasum -a 256 -bqs - >${BASE_DIR}/${CHECKSUM_FILE})|\                                                                                   
    lftp sftp://${SFTP_USER}@${SFTP_HOST} -e "put /dev/stdin -o /users/${SFTP_USER}/${SNAPSHOT_NAME}.gz.enc"
Als Ausgabe erhalte ich:
Code:
mbuffer: error: outputThread: error writing to <stdout> at offset 0x0: Broken pipe                                                                     
mbuffer: warning: error during output to <stdout>: Broken pipe
Die verschlüsselte Passwortdatei wird dabei normal hochgeladen, aber die Backupdatei und die Prüfsummendatei sind leer.
Mit der Position des tee-Befehls innerhalb der Pipe habe ich erfolglos rumgespielt.

Was mache ich falsch?
 

Kamikaze

Warrior of Sunlight
#2
Nun, Dein shasum wird nicht als Teil der Pipe ausgeführt sondern zuerst.

Was Du machen kannst (ungetestet):

Code:
mkfifo suminput.pipe
shasum -a 256 -bqs suminput.pipe >${BASE_DIR}/${CHECKSUM_FILE} &
zfs send … | tee suminput.pipe | lftp …
wait $! || echo "shasum failed"
rm suminput.pipe
 

Yamagi

Possessed With Psi Powers
Mitarbeiter
#3
Wieso im Jahr 2020 noch gzip? zstd ist bedeutend schneller, kann ohne Hacks mehrere Kerne nutzen und komprimiert besser.
 

medV2

Well-Known Member
#4
Ich denke die Lösung von @Kamikaze sollte tun.

Aber wieso nimmst du nicht anstatt openssl, gpg2 -c (also symetrisch)?

Die Kompression ist da gleich dabei (leider kein zstd, default zlib was deinem gzip -2 sehr nahe kommen dürfte), und du hast das Ergebniss integritätsgeschüzt (Achtung, nicht Kryptografisch, aber das ist ja nicht deine Anforderung).
 

crotchmaster

happy BSD user
Themenstarter #5
Nun, Dein shasum wird nicht als Teil der Pipe ausgeführt sondern zuerst.

Was Du machen kannst (ungetestet):

Code:
mkfifo suminput.pipe
shasum -a 256 -bqs suminput.pipe >${BASE_DIR}/${CHECKSUM_FILE} &
zfs send … | tee suminput.pipe | lftp …
wait $! || echo "shasum failed"
rm suminput.pipe
Danke, Kamikaze, ich werde das ausprobieren. Bei kleineren Textdateien hat mein Ansatz funktioniert. Ich muss mich wohl eingehender mit Pipes beschäftigen müssen.
 

crotchmaster

happy BSD user
Themenstarter #7
Ich denke die Lösung von @Kamikaze sollte tun.

Aber wieso nimmst du nicht anstatt openssl, gpg2 -c (also symetrisch)?

Die Kompression ist da gleich dabei (leider kein zstd, default zlib was deinem gzip -2 sehr nahe kommen dürfte), und du hast das Ergebniss integritätsgeschüzt (Achtung, nicht Kryptografisch, aber das ist ja nicht deine Anforderung).
Das muss ich mir ebenfalls mal anschauen. Danke für den Hinweis.
 

crotchmaster

happy BSD user
Themenstarter #8
Ich muss sagen, von zstd bin ich beeindruckt. Mit gzip -2 kam ich auf eine Dateigröße von ca. 230MB für das Backup des PostgreSQL datasets. Höhere Kompressionslevel hatte ich mir bei gzip gespart, da sie länger dauerten, ohne groß was zu bringen.
Mit zstd -13 bin ich nun bei ca. 168MB für das dataset, also ein gutes Viertel weniger.

Die Pipe habe ich nach anfänglichen Schwierigkeiten ebenfalls an den Start gebracht. Ich musste bei shasum die Optionen -qs entfernen. Das hat auf eine Eingabe gewartet, so dass mbuffer einen Timeout meldete. Da hatte ich die man-Page falsch gelesen bzw. verstanden.

Danke nochmal für Eure Hilfe.
 
Themenstarter #10
So, jetzt hab ich auch die Option --long ausprobiert. Ich lieg nun bei knapp 119MB für das Backup des PostgreSQL datasets, ca. die Hälfte von gzip. Also, ich bin schwer begeistert. Danke für den Tipp.