Forums Neueste Beiträge
 

Binärdatenstrom mit der Bash aufteilen

11/11/2008 - 13:14 von Stefan Tomanek | Report spam
Hallo,
mir stellt sich folgendes Problem:

Ich habe einen Strom von Binàrdaten, der über eine Pipe hereinströmt. Danach
wandern die Daten in ein FTP-Programm, dass sie "on-the-fly" auf einen Server
làdt. Das funktioniert alles super, nur scheint es auch FTP-Server zu geben,
die ein recht niedriges Limit bezüglich der Dateigröße haben. Ich muss also den
Datenstrom in mehrere Teile spalten, um ihn auf den Server zu laden. In Perl
habe ich soetwas schonmal realisiert, in reinem Bash-Code fàllt es mir jedoch
schwer. Ich skizziere mal grob, wie das ganze laufen soll:

chunk=1; tar ... | ( while readBinary 1000m | ftp-programm ...$chunk... ; do let chunk++; done );

Ich suche also ein Programm, dass eine definierte Anzahl Bytes liest, diese per
STDOUT ausgibt und im Exit-Code anzeigt, ob es über EOF gestolpert ist. Das
builtin "read" scheint leider keine Binàrdaten verarbeiten zu können, und dd
làsst nicht durchblicken, ob es EOF erreicht hat.

Hat jemand eine Idee dazu?

Ich muss es leider in bash machen, da "ftp-programm" u.U. auch eine
Shellfunktion sein kann.

stefan@pico.ruhr.de
GPG available and welcome
http://stefans.datenbruch.de/
 

Lesen sie die antworten

#1 Stefan Tomanek
11/11/2008 - 14:37 | Warnen spam
Hauke Laging schrieb:

Zweimal lesen, zur Not zweimal mit dd. Warum soll eigentlich read
keine Binàrdaten lesen können?



Ich habe damit schon etwas experimentiert, aber Zeichen wie Nullbytes, Newlines
etc. machen da vermutlich probleme, zumal read auch nicht auf stdout ausgibt,
sondern das ganze in eine Variable schreibt, die dann der Gnade von "echo"
ausgeliefert ist.

Wenn der erste dd-Aufruf die gesamten anstehenden Daten verarbeitet
hat, sieht der zweite (auf stderr!) so aus:



Das ist mir klar.

Wenn nicht, steht da statt 0+0 halt was anderes. Das sollte man
auswerten können. Oder halt ein Zeichen mit read lesen und den exit
code angucken. Ich sehe da kein Problem, lasse mich aber gerne
belehren ;-)



Ich sehe keine elegante Möglichkeit, das ganze im Rahmen einer Pipe
zu verarbeiten, außer den Kram in eine temporàre Datei zu schreiben und
dann von dort zu lesen. Außerdem veràndert sich der Exit-Code von dd eben
nicht, sonst wàre das ganze ziemlich einfach:

:~$ echo -n f | dd of=/dev/null bs=1 count=1; echo "exit code: $?"
1+0 records in
1+0 records out
1 byte (1 B) copied, 2.7657e-05 s, 36.2 kB/s
exit code: 0
:~$ echo -n | dd of=/dev/null bs=1 count=1; echo "exit code: $?"
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.0114e-05 s, 0.0 kB/s
exit code: 0
:~$


GPG available and welcome
http://stefans.datenbruch.de/

Ähnliche fragen