File naar STDIN redirecten

Pagina: 1
Acties:

Acties:
  • +1 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 19:06
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:
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?

Acties:
  • +3 Henk 'm!

  • hcQd
  • Registratie: September 2009
  • Laatst online: 21:39
Je kunt STDIN aanpassen met exec:
code:
1
exec < $1

Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 19:06
hcQd schreef op donderdag 8 maart 2018 @ 17:49:
Je kunt STDIN aanpassen met exec:
code:
1
exec < $1
Ofwel, hoe je een startpost van 1 A4-tje met twee korte regels kan afhandelen. Ofwel: super, geprobeerd en doet precies wat ik nodig heb op een simpele en elegante manier.

Dank! :)

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 20:21

Hero of Time

Moderator LNX

There is only one Legend

Als je bang bent dat je < eens vergeet bij het aanroepen van je script, kan je ook dit met je script doen:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
# Je standaard variabelen
# Even checken of je wel een parameter opgeeft
if [ $# != 1 ] ; then
    echo "Geen parameter of te veel opgegeven."
    exit 1
fi

# Dan vanaf regel 5 doe je dit
(
# alle code die je gebruikt
) < $1
# klaar

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Of andersom:
Bash:
1
[ -t 0 ] && echo "Pipe een file naar stdin" && exit 1

Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 19:06
Ja, dat zijn zeker wel opties, maar geen fraaie opties. Je wilt iets intuitief maken en als dat niet kan, dan maar een handleiding met uitleg voor de gebruiker. Natuurlijk, als het niet anders kan, maar liever de oplossing van @hcQd.

Daarbij, ik stelde de vraag niet alleen omdat ik deze oplossing wilde - het voelde als iets dat vast wel moest kunnen, dus ik was zeker ook benieuwd naar OF er een betere manier was. Iets nieuws leren, niet alleen een probleem oplossen. :)

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 20:21

Hero of Time

Moderator LNX

There is only one Legend

Ik vraag mij wel af waarom de externe 'test' gebruikt en niet de build-in [ sluitende met ].

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 19:06
Hero of Time schreef op vrijdag 9 maart 2018 @ 07:20:
Ik vraag mij wel af waarom de externe 'test' gebruikt en niet de build-in [ sluitende met ].
In dat script van mij, bedoel je?
Waarschijnlijk omdat het geen origineel script van mij is, maar in basis afkomstig is uit de Amanda softwareverzameling. En het script niet voor bash, maar voor /bin/sh gemaakt was. Wellicht dat dan de vierkante-haken-constructie niet werkt.

Acties:
  • 0 Henk 'm!

  • hcQd
  • Registratie: September 2009
  • Laatst online: 21:39
Hero of Time schreef op vrijdag 9 maart 2018 @ 07:20:
Ik vraag mij wel af waarom de externe 'test' gebruikt en niet de build-in [ sluitende met ].
Zowel test als [ zijn externe commando's (al zijn ze vaak wel built-in, maar zonder speciale status). Ik denk dat je [[ bedoelt, wat wel altijd built-in is en wat een aantal extra mogelijkheden heeft en word-splitting uitgeschakeld is zodat je niet elke shellvariabele hoeft te quoten.
Pagina: 1