Toon posts:

Perl uitvoeren van system command en piping

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor een Perl script zou ik een verbinding moeten maken met een ms sql database op een windows machine, om dit vanuit linux te laten gebeuren maak ik gebruik van tsql.

Het is de bedoeling om een koppeling te voorzien tussen een perl script en een query die op de databank uitgevoerd moet worden (stred procedure) nu is het probleem dat ik in het perl script er niet in slaag de output van het tsql commando en de daaropvolgende output van de stred op te vangen, ik doe het zo:

code:
1
my @output = qx(echo -e "exec stred_procedure\ngo\n" | tsql -S server -U username -P password);


normaal zou je dan met @output[0] tot @output[x] de verschillende regels output moeten kunnen ophalen, maar in @output komt niet te staan, hij drukt gewoon het resultaat op de terminal.

Ik heb het ipv met qx ook al proberen te doen met backticks, maar ook dat gaf geen soelaas.

Ik weet dat deze manier van werken zeker werkt omdat als ik het test met perl -e <<comando>> hij wel doet wat hij moet doen. (hij maakt connectie en voert meteen de stred uit)
Het zit volgens mij ergens in volgorde van uitwerken.

Iemand enig idee?

  • deadinspace
  • Registratie: Juni 2001
  • Laatst online: 19:20

deadinspace

The what goes where now?

Probeer eens
% echo -e "exec stred_procedure\ngo\n" | tsql -S server -U username -P password > output
% echo -e "exec stred_procedure\ngo\n" | tsql -S server -U username -P password 2> output2

in een shell. Komt de output van het tsql commando in het eerste geval dan gewoon op je scherm terecht, en in het tweede geval in de file 'output2' ? Dan schrijft tsql de berichten waarin jij geinteresseerd bent niet naar stdout, maar naar stderr.

Als dat het geval is, dan kun je de output van stderr redirecten naar stdout door 2>&1 toe te voegen achter het commando.

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 22-01 08:08

TrailBlazer

Karnemelk FTW

kan je niet beter gewoon @output=`command` doen. Dit zijn zogenaamde backticks die bij de tilde ~in de buurt. Overigens is er vast wel een perl modulde om gewoon vanauit je script een sessie naar die db te bouwen.

Verwijderd

Topicstarter
Sorry voor dit antwoord, maar ik ben er nu pas terug aan begonnen.

De oplossing was inderdaad het doorsturen van kanaal2 naar kanaal 1

hartelijk dank voor de hulp !

Verwijderd

Topicstarter
Om hier even op terug te komen,

Via tsql is het ook mogelijk om een domain logon te doen, om dit te doen met er met de username gewoon de domeinnaam worden meegegeven, dus SERVERNAAM\username als ik dit uittest met het command

tsql -S servernaam -U domeinnaam\\username -P paswoord

dan kan ik verbinden let hier vooral op de \\ in de -U parameter , als je deze 2 \\ niet zet dan lukt het niet. Als ik het dan in perl test:

perl -e 'print "exec stred\ngo"' | tsql -S servernaam -U domein\\username -P psw

Dit werkt , als ik dit dan uitvoer in het qx commando:

qx(perl -e 'print "exec stred\ngo"' | tsql -S server -U domain\\user -P paswoord 2>&1);

dan loopt er iets mis dan zegt hij dat hij niet kan aanmelden met de user domainuser, hij haalt dus de \ uit de -U parameter, ik vind dit zeer raar aangezien dit wel werkt met het 'normale' perl -e commando.

Ziet iemand een verklaring hiervoor ?

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 22-01 08:08

TrailBlazer

Karnemelk FTW

Waarschijnlijk gaat perl die string opeens interpreteren. Normaal gebruik je een backslash om speciale characters aan te geven of ze juist te escapen. Je escaped nu dus met de 1e backslash de 2e backslah dus effectief heb je er maar 1 staan
perl -e 'print "exec stred\ngo"' | tsql -S servernaam -U domein\\username -P psw
ik denk dat je er dit van moeten maken.
qx(perl -e 'print "exec stred\ngo"' | tsql -S server -U domain\\\\user -P paswoord 2>&1);
De 1e en 3e backslash escapen de 2e en 4e.

perl -e 'print "exec stred\ngo"' | tsql -S servernaam -U domein\\username -P psw
Hier wordt alles achter de 1e pipe niet meer door perl gedaan lijkt me dus geen string interpretatie.

[ Voor 25% gewijzigd door TrailBlazer op 05-05-2008 10:47 ]

Pagina: 1