[bash] stdin stream inlezen

Pagina: 1
Acties:

  • _JGC_
  • Registratie: Juli 2000
  • Nu online
Voor ons eerder geposte CUPS/Mac OS X probleem in een multiuser omgeving met alleen windows machines, hebben wij gedacht aan een oplossing met bash:

vervang /usr/libexec/cups/smb met een bash script, laat het bash script de DEVICE_URI met sed verneuken zodat username en password erin komen te staan en stuur vervolgens de hele brut door met smbspool.

Leuk, aardig... hoe krijgen we dat binnen van cups:
postscript op stdin, device URI via environment variabele en de rest op de commandline.

./smb <options> < stream_van_cups

nou is de bedoeling dat die DEVICE_URI met sed aangepast wordt, wat ook wel lukt. Wat een groot probleem is: die stream zonder kleerscheuren zo doorsturen naar smbspool. op google is niet echt veel te vinden voor ons probleem:
code:
1
2
3
4
5
6
7
8
#!/bin/bash
#
#
while read bla; do $bla2+=$bla; done
echo $bla2 > /tmp/bla2
. ~Admin/.printpw
export DEVICE_URI=`echo $DEVICE_URI | sed "s/smb:\/\//smb:\/\/$username:$userpw@/"`
#echo $bla | /usr/bin/smbspool $@

als ik dan in /tmp/bla2 kijk, is dat dus absoluut geen fatsoenlijk postscript document die ik heb gestuurd met CUPS, het lijkt meer op rotzooi overal en nergens van het systeem gepakt, zo zie ik allemaal foldernamen en Adobe Indesign dingen ertussen. Het enige wat tot nu toe klopt is de postscript header.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 22-02 22:40
Erm, ik snap het misschien niet helemaal, maar bedoel je dat het script eigenlijk niks moet doen, behalve de originele input (stdin) + alle argumenten doorsturen naar smbspool, en ondertussen nog even de DEVICE_URI mangelen zodat er iets in staat waar je wel blij van wordt?

Volgens mij denk je dan net even te moeilijk, ik zou denken dat dit gewoon werkt:

Bash:
1
2
3
4
#!/bin/bash
. ~Admin/.printpw
export DEVICE_URI=`echo $DEVICE_URI | sed "s/smb:\/\//smb:\/\/$username:$userpw@/"`
cat - | /usr/bin/smbspool $@


Bonuspunten voor wie de laatste regel nog korter kan schrijven...ik heb inmiddels uitgevonden dat dit mogelijk is (iig met de bash die ik gebruik onder Linux) :)

[ Voor 20% gewijzigd door Wilke op 16-12-2003 15:39 ]


  • Wilke
  • Registratie: December 2000
  • Laatst online: 22-02 22:40
Aangezien niemand nog de kortere versie van de laatste regel gepost heeft, het is:

code:
1
/usr/bin/smbspool $@ <&0


Maar ik weet niet hoe portable dit is; cat - | blaat werkt hoe dan ook onder elke willekeurige sh/bash-achtige shell. Bovenstaande werkt in ieder geval onder Linux/bash 2.x.

Verder had jouw versie waarschijnlijk ook wel moeten werken, als er niet een paar foutjes in hadden gezeten:

$bla2+=$bla

werkt uberhaupt niet, en indien wel was het enorm traag geweest en waarschijnlijk ook niet goed gegaan met files van meer dan 10K ofzo - je kunt niet domweg de inhoud van grote files compleet in een environment var gooien.
Iets aan variabelen toekennen doe je door te schrijven var=waarde, niet $var=waarde (het is geen PHP enzo ;) ).

Zelfs dan werkt bla2+= $bla werkt niet, omdat je in bash uberhaupt niet zo kunt toevoegen (als je '+=' al kunt gebruiken, dan hooguit om op te tellen en niet voor string concatenatie). Again, in de war met PHP misschien?

Verder maak je een /tmp/bla2 file aan die je daarna niet gebruikt. Het nut daarvan gaat ook een beetje aan me voorbij.

Zo had het wel gewerkt:

code:
1
2
3
4
rm /tmp/bla2 >/dev/null 2>&1 # delete als nog bestaat van vorige keer
while read line; do echo $line >>/tmp/bla2; done
[...]
/usr/bin/smbspool $@ </tmp/bla2


Maar erg efficient is dat alsnog niet.

Kortom, tijd voor een bakje koffie denk ik :D

  • _JGC_
  • Registratie: Juli 2000
  • Nu online
Zijn inmiddels een paar uurtjes verder, en hebben uitgevonden dat smbspool met die pipe geen zin heeft om te printen omdat ie zn DEVICE_URI mist. Wat we hebben gedaan is met $RANDOM een random file genereren, hiernaar te catten en als laatste argument aan smbspool dit ding op te geven.
Alles werkt zoals het hoort, denk dat ze hier heel erg blij zullen zijn met de gevonden oplossing :)

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
_JGC_ schreef op 16 december 2003 @ 17:40:
Wat we hebben gedaan is met $RANDOM een random file genereren, hiernaar te catten en als
Je weet dat er een programma is dat dat voor je doet?
mktemp (1) - make temporary filename (unique)
:)

[ Voor 33% gewijzigd door blaataaps op 16-12-2003 17:48 ]