Toon posts:

[SH] exec en parsen van escapes

Pagina: 1
Acties:

Verwijderd

Topicstarter
Beste lezer,

Ik zit nu al enkele uren aan het volgende probleem:

Ik heb een sh script geschreven die wat in input parsed en als output een command uitvoert richting mijn plesk server

in een lusje ga ik mijn input array af

code:
1
execute_command="$execute_command -$param '$value'"


waarna ik

code:
1
2
                echo $execute_command
                echo "`$execute_command`"


doe. Bij de eerste output kan ik zien dat mijn command goed is opgebouwd en wanneer ik deze c/p dan voert hij het commando ook uit.

Alleen wanneer ik de echo "`$execute_command`" doe dan geeft hij een syntax error.
de `` lijkt de variabelen met spaties niet goed te parsen. ik heb al
code:
1
2
value="`echo \"$value\" | sed 's/ /\\\\\ /g'`"
execute_command="$execute_command -$param '$value'"


dat werkte ook niet.

Ook al heb ik al meerdere mensen met uitgebreide UNIX ervaring gesproken en verschillende opties geprobeerd zoals

exec
$()

Maar niets lijkt te werken

Hebben jullie nog ideeen?

Groet,

Maarten

Verwijderd

Gebruik je BASH als shell? en krijg je een syntax error van je shell of van het commando wat je uit voert?

edit:
quote weg geknipt

[ Voor 69% gewijzigd door Verwijderd op 24-07-2007 18:18 ]


Verwijderd

Topicstarter
ik gebruik bin/sh

de syntax error komt van de het commando dat ik uit wil voeren
het is Plesk aanroep:
bijv:

code:
1
 command = client -c testuser -name Jan\ de\ Vries -pass password


wanneer dit in echo `$command` wordt uitgevoerd krijg ik een error dat hij de optie "de" niet kent van Jan de Vries als ik echter gewoon het commando c/p in mijn shell dan doet hij het gewoon

Ik heb trouwens zowel bin/sh als bin/bash geprobeert. Beide gaven dezelfde error

Verwijderd

Verwijderd schreef op dinsdag 24 juli 2007 @ 19:09:
ik gebruik bin/sh

de syntax error komt van de het commando dat ik uit wil voeren
het is Plesk aanroep:
bijv:

code:
1
 command = client -c testuser -name Jan\ de\ Vries -pass password


wanneer dit in echo `$command` wordt uitgevoerd krijg ik een error dat hij de optie "de" niet kent van Jan de Vries als ik echter gewoon het commando c/p in mijn shell dan doet hij het gewoon
Kan je niet direct het commando uitvoeren zonder het eerst in een variabele te stoppen?
Ik heb trouwens zowel bin/sh als bin/bash geprobeert. Beide gaven dezelfde error
/bin/sh dat zegt niet zoveel, meestal is het ergens naar toe gesymlinked en dat verschilt per besturing systeem.

Verwijderd

Topicstarter
Verwijderd schreef op dinsdag 24 juli 2007 @ 19:36:
[...]


Kan je niet direct het commando uitvoeren zonder het eerst in een variabele te stoppen?


[...]


/bin/sh dat zegt niet zoveel, meestal is het ergens naar toe gesymlinked en dat verschilt per besturing systeem.
Ik kan het commando niet direct uitvoeren want hij bouwt het commando langzaam op. in die in de openingspost beschreven lus

Verwijderd

Verwijderd schreef op dinsdag 24 juli 2007 @ 20:37:
[...]


Ik kan het commando niet direct uitvoeren want hij bouwt het commando langzaam op. in die in de openingspost beschreven lus
okay, dat had ik niet helemaal goed begrepen.

Zo ver ik weet kan je dit niet zo opbouwen met bash. Wat je wel zou kunnen proberen is met perl iets in elkaar knutselen ik weet dat je bijvoorbeeld met system('commando', 'argu', 'men', 'ten') wel zo iets in kan maken.

Als het echt vanuit bash moet zou je bijvoorbeeld ook nog perl kunnen aanroepen vanuit het shellscriptje.

edit:
Bedenk me net dat als je een tweede shell opstart dat dan de argumenten wel op de juiste manier worden verwerkt.

het volgende zou in princiepe wel moeten werken.
output=$(bash -c "${commando}")

[ Voor 14% gewijzigd door Verwijderd op 24-07-2007 23:01 ]


  • serkoon
  • Registratie: April 2000
  • Niet online

serkoon

mekker.

Houd er rekening mee dat shells nogal de neiging hebben om escapes op te vreten, aangezien escapes er voor bedoeld zijn om specifieke tekens te escapen zodat de shell ze niet interpreteert. Een 'echo "$command"' zal dus niet de verwachte uitvoer geven: de backslashes zullen verdwenen zijn.

Ik heb een tijdje terug ook es gezeik hiermee gehad, kwam er toen uiteindelijk op uit om alles dubbel te escapen middels:
code:
1
sed 's/\([ \\'\'']\)/\\\\\1/g'

Verwijderd

Topicstarter
Ik heb beide bovenstaande (zowel dubbel escapen als een eval perl -e) geprobeerd.
Beide hebben gefaald steeds dezelfde error, wanneer ik spaties in mijn argument waarden gebruik gaat hij over zijn huig.

Ik zit hier nu toch al bijna een dag mee, heeft iemand nog tips?

  • igmar
  • Registratie: April 2000
  • Laatst online: 31-01 23:50

igmar

ISO20022

Verwijderd schreef op dinsdag 24 juli 2007 @ 19:09:
code:
1
 command = client -c testuser -name Jan\ de\ Vries -pass password
Waarom zet je geen dingen tussen quotes ?

code:
1
command = client -c testuser -name "Jan de Vries" -pass password


Dat zou im theorie moeten werken.

Verwijderd

Topicstarter
igmar schreef op woensdag 25 juli 2007 @ 10:37:
[...]


Waarom zet je geen dingen tussen quotes ?

code:
1
command = client -c testuser -name "Jan de Vries" -pass password


Dat zou im theorie moeten werken.
Stel ik heb deze command opgebouwd in mijn script
code:
1
/usr/local/psa/bin/client -c Zamma -name "Test user" -passwd wachtwoordje


Dan geeft hij alsnog de fout dat hij de optie 'user"' niet kent.
Hij doet wel iets heel aparts wanneer hij dat probeert uit te voeren met exec of ``

maar als ik dit in mijn command line zou c/p doet hij wel wat hij zou moeten doen.

Daarom dacht ik ook al een zo'n constructie:
code:
1
exec `echo $command`


maar dat baat ook al niet.

Verwijderd

Topicstarter
Nou ik heb het opgelost hoor.

Wanneer je exec, `` e.d probeert met je $command dan zie hij kennelijk niet hoe dat goed geevalueerd moet worden.

Wanneer je eval $command gebruikt, doe je dat niet met escapes op de spaties "\ " maar escapes om de quotes en natuurlijk die toevoegen.

Dan moet zou hij het moeten doen, bij mij wel.

Bedankt voor jullie tips.
Pagina: 1