Echt een probleem kan ik het niet noemen, meer een ongewenste manier van een script moeten gebruiken. En ik heb op zich al wel een workaround in gedachten, maar vraag mij af of het eleganter kan.
Wat ik nu heb is een script voor het decrypten van Amanda backup files:
... en het geheel roep ik aan met:
En dat werkt. Maar, ik weet nu al dat ik deze manier van aanroepen ga vergeten en zou het script willen verbouwen naar iets dat dan zo werkt:
Zoals ik denk dat het werkt:
De regels 5, 10, 12, 16, 21 en 26 met de 'dd' en 'aespipe' commando's eten geleidelijk aan de data van STDIN op. De eerste 'dd' haalt er 10 bytes/characters uit, de volgende weer 10, die op regel 12 slechts 1, enzovoort. Wat overblijft wordt door 'aespipe' verwerkt.
De workaround die ik in gedachte heb is 'dd' uit een file laten lezen ipv STDIN, met telkens de juiste 'skip' om het begin over te slaan. En uiteindelijk een extra 'dd' met offset-skippen en doorvoeren aan aespipe. Maar, vind ik niet fraai aanvoelen. Dus, ik ben benieuwd of er mooie oplossingen zijn waar ik zelf nog niet op ben gekomen.
M'n zoekterm tot nu toe was 'redirect file to stdin'. M'n eerste idee was, als al die 'dd' en 'aespipe' uit STDIN lezen, om dat eerst in dat script de gewenste file naar STDIN te redirecten:
Ja, vind ik eigenlijk ook best smerig. En werkte niet eens, alles werd naar m'n terminal geprint.
Vervolgens ben in gaan proberen met 'coproc': Precieze code weet ik niet meer, maar een 'cat' als coproc starten, vervolgens een cat van de inputfile *naar* dat coproc-process toe en vervolgend dd en aespipe uit dat coprocess laten lezen. Nee, het wordt er niet fraaier op. Waarbij 'ie ook bleef hangen op de cat naar het coproc toe.
Wellicht dat ik het moet zoeken in named pipes en dergelijke, maar meestal als ik zo ingewikkeld aan het denken ben, is er een hele simpele charmante oplossing waar ik straal overheen kijk. Iemand suggesties, afgezien van die eerste workaround die ik hierboven noem?
Wat ik nu heb is een script voor het decrypten van Amanda backup files:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| GPGKEY=".gnupg/am_key.gpg" AM_PASSPHRASE=".am_passphrase" FDNUMBER=3 n=`/bin/dd bs=10 count=1 2> /dev/null | tr -d -c 0-9a-zA-Z` if test x${n} != xbz2aespipe ; then echo "bz2aespipe: wrong magic - aborted" >/dev/tty exit 1 fi itercountk=`/bin/dd bs=10 count=1 2> /dev/null | tr -d -c 0-9` if test x${itercountk} = x ; then itercountk=0; fi n=`/bin/dd bs=1 count=1 2> /dev/null | tr -d -c 0-9` encryption=AES128 if test x${n} = x1 ; then encryption=AES192; fi if test x${n} = x2 ; then encryption=AES256; fi n=`/bin/dd bs=1 count=1 2> /dev/null | tr -d -c 0-9` hashfunc=SHA256 if test x${n} = x1 ; then hashfunc=SHA384; fi if test x${n} = x2 ; then hashfunc=SHA512; fi if test x${n} = x3 ; then hashfunc=RMD160; fi seedstr=`/bin/dd bs=24 count=1 2> /dev/null | tr -d -c 0-9a-zA-Z+/` echo "itercountk = $itercountk" echo "encryption = $encryption" echo "hashfunc = $hashfunc" echo "seedstr = $seedstr" aespipe -K ${GPGKEY} -p ${FDNUMBER} -e ${encryption} -H ${hashfunc} \ -S ${seedstr} -C ${itercountk} -d 3< $AM_PASSPHRASE > decrypted.tgz |
... en het geheel roep ik aan met:
code:
1
| ./decrypt.sh < CryptedFile |
En dat werkt. Maar, ik weet nu al dat ik deze manier van aanroepen ga vergeten en zou het script willen verbouwen naar iets dat dan zo werkt:
code:
1
| ./decrypt.sh CryptedFile |
Zoals ik denk dat het werkt:
De regels 5, 10, 12, 16, 21 en 26 met de 'dd' en 'aespipe' commando's eten geleidelijk aan de data van STDIN op. De eerste 'dd' haalt er 10 bytes/characters uit, de volgende weer 10, die op regel 12 slechts 1, enzovoort. Wat overblijft wordt door 'aespipe' verwerkt.
De workaround die ik in gedachte heb is 'dd' uit een file laten lezen ipv STDIN, met telkens de juiste 'skip' om het begin over te slaan. En uiteindelijk een extra 'dd' met offset-skippen en doorvoeren aan aespipe. Maar, vind ik niet fraai aanvoelen. Dus, ik ben benieuwd of er mooie oplossingen zijn waar ik zelf nog niet op ben gekomen.
M'n zoekterm tot nu toe was 'redirect file to stdin'. M'n eerste idee was, als al die 'dd' en 'aespipe' uit STDIN lezen, om dat eerst in dat script de gewenste file naar STDIN te redirecten:
code:
1
| cat $1 >&0 |
Ja, vind ik eigenlijk ook best smerig. En werkte niet eens, alles werd naar m'n terminal geprint.
Vervolgens ben in gaan proberen met 'coproc': Precieze code weet ik niet meer, maar een 'cat' als coproc starten, vervolgens een cat van de inputfile *naar* dat coproc-process toe en vervolgend dd en aespipe uit dat coprocess laten lezen. Nee, het wordt er niet fraaier op. Waarbij 'ie ook bleef hangen op de cat naar het coproc toe.
Wellicht dat ik het moet zoeken in named pipes en dergelijke, maar meestal als ik zo ingewikkeld aan het denken ben, is er een hele simpele charmante oplossing waar ik straal overheen kijk. Iemand suggesties, afgezien van die eerste workaround die ik hierboven noem?