I segreti della linea di comando – Command substitution
Posted: Marzo 6th, 2009 | Author: packz | Filed under: Bash, Hack | 1 Comment »Esistono dei casi in cui un comando prende come argomento uno o più file, mentre noi necessitiamo di dover passare a questo programma il risultato di un altro comando; la prima cosa che verrebbe in mente è sarebbe quella di usare un file intermedio da usare appositamente, ma la shell bash ha pensato anche a questo, la command substitution!!!
La sintassi generale in questo caso è
<( command )
>( command )
il primo caso è da usare nel caso in cui si vuole l’output di command come contenuto di un file di input, mentre il secondo nel caso ci interessi per un file di output.
Faccio un esempio un po’ particolare che ho usato per scoprire se facebook modifica le immagini uploadate: facciamo finta che abbiamo l’immagine di paula maugeri (attenti a quel gruppo di flickr, può farvi perdere ore) e vogliamo vederele differenze fra questa immagine e quella che scarichi una volta uploadata su FB; identify(1) è un comando della famiglia imagemagick che stampa le caratteristiche di una immagine, mentre diff(1) mostra le differenze fra due files passati come argomenti (W la command substitution)
$ diff -Nur <( identify -verbose paola-maugeri-vinile.jpg ) <( identify -verbose paola-maugeri-vinile-fb.jpg )
@@ -1,4 +1,4 @@
-Image: paola-maugeri-vinile.jpg
+Image: paola-maugeri-vinile-fb.jpg
Format: JPEG (Joint Photographic Experts Group JFIF format)
Class: DirectClass
Geometry: 422×500+0+0
@@ -13,23 +13,23 @@
Channel statistics:
Red:
Min: 0 (0)
– Max: 189 (0.741176)
– Mean: 77.2321 (0.302871)
– Standard deviation: 38.8228 (0.152246)
+ Max: 193 (0.756863)
+ Mean: 77.232 (0.302871)
+ Standard deviation: 38.7657 (0.152022)
Green:
Min: 0 (0)
– Max: 216 (0.847059)
– Mean: 99.3681 (0.389679)
– Standard deviation: 62.7955 (0.246257)
+ Max: 215 (0.843137)
+ Mean: 99.378 (0.389718)
+ Standard deviation: 62.668 (0.245757)
Blue:
Min: 0 (0)
– Max: 214 (0.839216)
– Mean: 32.9495 (0.129214)
– Standard deviation: 49.6714 (0.19479)
+ Max: 215 (0.843137)
+ Mean: 33.1042 (0.12982)
+ Standard deviation: 49.59 (0.194471)
Rendering intent: Undefined
Resolution: 72×72
Units: PixelsPerInch
– Filesize: 101.754kb
+ Filesize: 30.8066kb
Interlace: None
Background color: white
Border color: rgb(223,223,223)
@@ -39,10 +39,10 @@
Dispose: Undefined
Iterations: 0
Compression: JPEG
– Quality: 96
+ Quality: 85
Orientation: Undefined
Jpeg:colorspace: 2
– Jpeg:sampling-factor: 1×1,1×1,1×1
– Signature: 72f58c7cefbafdf5a976cb3d31514669738bf13b3187203348f9c799a40f0062
+ Jpeg:sampling-factor: 2×2,1×1,1×1
+ Signature: d1e74389ddc06c269a3d21c0b3baafa2bafa9dd5effcc400ccbd76035c2905ed
Tainted: False
Version: ImageMagick 6.3.7 12/10/08 Q16 http://www.imagemagick.org
Come potete vedere quel napoli di FB usa un Jpeg sampling 2×2,1×1,1×1, una quality di 85, ma anche riuplodandola con quei parametri, usando convert(1)
$ convert -quality 85 -sampling-factor 2×2,1×1,1×1 paola-maugeri-vinile.jpg paola-maugeri-vinile-quality-85-sampling.jpg
purtroppo ci sono dei parametri nello spazio dei colori (?) che vengono modificati… quindi niente steganografia, a meno che non la stiano già facendo loro ;-).
Un’altra ficata che è possibile con la command substitution consiste nel suo uso combinato con ssh e tee: il primo è il comando standard per il lavoro da remoto (usa la crittografia a chiave asimmetrica) mentre il secondo splitta lo standard input e lo ristampa nello standard output, salvandolo al contempo in un file passatogli come argomento. Bene, possiamo sparare uno stesso file in diversi server utilizzando il comando
wget -O – http://ftp.mozilla.org/…/thunderbird-3.0b2-i686.tar.bz2
| tee >(ssh host1 ‘tar xjvf -‘) | tee >(ssh host2 ‘tar xjvf -‘) | ssh host3 ‘tar xjvf -‘
wget(1) è il programma per il download di file da command line nella unix-way…questo ultimo trucco by shell-fu…
Addio data squatting allora =(, ma hai provato a vedere se le fluttuazioni del colore sono volute e variabili (per evitare proprio steganografia e simili) o se sono sempre uguali?