HERE-Script und "su - c"

HERE-Script und "su - c"

am 21.04.2006 13:38:48 von Retep Grubanov

Hi,

ich möchte folgendes KSH-Programmfragment in Perl übersetzten, weiss aber
nicht wie :

su - ${ORAUSER} -c sqlplus /nolog <<-\/EOF | grep -q $SID
connect / as sysdba
select * from v$instance;
/EOF

Hat mir da jemand ein Tipp?

Danke Retep

Re: HERE-Script und "su - c"

am 21.04.2006 13:48:12 von Christian Lackas

* Retep Grubanov [2006-04-21]:

Hallo Retep,

> ich möchte folgendes KSH-Programmfragment in Perl übersetzten, weiss aber
> nicht wie :
> su - ${ORAUSER} -c sqlplus /nolog <<-\/EOF | grep -q $SID
> connect / as sysdba
> select * from v$instance;
> /EOF

nimm IPC::Open2, damit kannst du einen Prozess zum Lesen und Schreiben
öffnen.

Gruß
Christian

--
Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne
Mitwirkung von Juristen zustandegekommen sind.
(Charles de Gaulle, franz. Politiker & General, 1890-1970)
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: HERE-Script und "su - c"

am 21.04.2006 14:14:14 von Retep Grubanov

Christian Lackas wrote:

> * Retep Grubanov [2006-04-21]:
>
> Hallo Retep,
>
>> ich möchte folgendes KSH-Programmfragment in Perl übersetzten, weiss aber
>> nicht wie :
>> su - ${ORAUSER} -c sqlplus /nolog <<-\/EOF | grep -q $SID
>> connect / as sysdba
>> select * from v$instance;
>> /EOF
>
> nimm IPC::Open2, damit kannst du einen Prozess zum Lesen und Schreiben
> öffnen.
>
> Gruß
> Christian
>

Christian,
danke für den Tipp. Eigentlich möchte ich nur eine Folge von Shell-Kommandos
unter einer anderen USER-ID laufen lassen und schwierigerweise in der Shell
nochmals ein HERE-Script aufrufen.

Etwas in der Art (perl):

$output = <<`EOF`;
su - ${ORAUSER} -c sqlplus /nolog <<-ORA
connect / as sysdba
select * from v$instance;
ORA
EOF

Das grep kann ich dann mit dem perl-grep in der folge ausführen.

Habe ich damit eine Chance?

Leider verstehe ich das IPC::Open2 nicht wirklich. Mit dem sqlplus zu
kommunizieren ist noch eins aber wie kann ich das ganze unter dem $ORAUSER
Kontext ausführen?

Retep

Re: HERE-Script und "su - c"

am 21.04.2006 17:14:51 von Ingo Menger

Retep Grubanov schrieb:

> Christian Lackas wrote:
>
> > * Retep Grubanov [2006-04-21]:
> >
> > Hallo Retep,
> >
> >> ich möchte folgendes KSH-Programmfragment in Perl übersetzten, wei=
ss aber
> >> nicht wie :
> >> su - ${ORAUSER} -c sqlplus /nolog <<-\/EOF | grep -q $SID
> >> connect / as sysdba
> >> select * from v$instance;
> >> /EOF
> >
> > nimm IPC::Open2, damit kannst du einen Prozess zum Lesen und Schreiben
> > öffnen.
> >
> > Gruß
> > Christian
> >
>
> Christian,
> danke für den Tipp. Eigentlich möchte ich nur eine Folge von Shell-Ko=
mmandos
> unter einer anderen USER-ID laufen lassen und schwierigerweise in der She=
ll
> nochmals ein HERE-Script aufrufen.
>
> Etwas in der Art (perl):
>
> $output =3D <<`EOF`;
> su - ${ORAUSER} -c sqlplus /nolog <<-ORA
> connect / as sysdba
> select * from v$instance;
> ORA
> EOF
>
> Das grep kann ich dann mit dem perl-grep in der folge ausführen.

Also, wie wäre es mit:

open RESULT, "echo 'select * from v\$instance' | su - \$ORAUSER -c
sqlplus '/ as sysdba' | "
or die "can't run sqlplus";

Re: HERE-Script und "su - c"

am 22.04.2006 01:01:09 von Christian Lackas

* Retep Grubanov [2006-04-21]:

Hallo Retep,

> > > ich möchte folgendes KSH-Programmfragment in Perl übersetzten, weiss aber
> > > nicht wie :
> > > su - ${ORAUSER} -c sqlplus /nolog <<-\/EOF | grep -q $SID
> > > connect / as sysdba
> > > select * from v$instance;
> > > /EOF
> > nimm IPC::Open2, damit kannst du einen Prozess zum Lesen und Schreiben
> > öffnen.
> danke für den Tipp. Eigentlich möchte ich nur eine Folge von Shell-Kommandos
> unter einer anderen USER-ID laufen lassen und schwierigerweise in der Shell
> nochmals ein HERE-Script aufrufen.

was du oben machst ist ein Programm aufrufen, ihm etwas auf STDIN
füttern und seine Ausgabe auf STDOUT einzulegen (und an grep zu
schicken).

use IPC::Open2;
my $ORAUSER = 'foo';
my $instance = 'bar';
my $SID = 'burp';

my $pid = open2(\*CHLD_OUT, \*CHLD_IN, "su - $ORAUSER -c sqlplus /nolog");
print CHLD_IN < connect / as sysdba
select * from v$instance;
EOF
my $res = join '', grep /$SID/, ;

> Leider verstehe ich das IPC::Open2 nicht wirklich.

Habe dein Beispiel jetzt quasi 1:1 in das Beispiel aus der Dokumentation
fliessen lassen.

> Mit dem sqlplus zu kommunizieren ist noch eins aber wie kann ich das
> ganze unter dem $ORAUSER Kontext ausführen?

Statt das externe su(1) zu nehmen, kannst du natürlich auch per $< und
$> deine UID wechseln. Details findest du in perlvar(1). Ich empfehle
auch einen Blick in die Doku von POSIX::setuid() und setuid(2).

Kannst du das ganze nicht auch über DBI machen? Dann hättest du alle
externen Programme eliminiert.

Gruß
Christian

--
Keine Rose ohne Dornen sprach der Igel, als er die Igelin freite.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker

Re: HERE-Script und "su - c"

am 24.04.2006 09:47:36 von Retep Grubanov

Christian Lackas wrote:

Hallo Christian

> * Retep Grubanov [2006-04-21]:
>
> Hallo Retep,
>
>> > > ich möchte folgendes KSH-Programmfragment in Perl übersetzten, weiss
>> > > aber nicht wie :
>> > > su - ${ORAUSER} -c sqlplus /nolog <<-\/EOF | grep -q $SID
>> > > connect / as sysdba
>> > > select * from v$instance;
>> > > /EOF
>> > nimm IPC::Open2, damit kannst du einen Prozess zum Lesen und Schreiben
>> > öffnen.
>> danke für den Tipp. Eigentlich möchte ich nur eine Folge von
>> Shell-Kommandos unter einer anderen USER-ID laufen lassen und
>> schwierigerweise in der Shell nochmals ein HERE-Script aufrufen.
>
> was du oben machst ist ein Programm aufrufen, ihm etwas auf STDIN
> füttern und seine Ausgabe auf STDOUT einzulegen (und an grep zu
> schicken).
>
> use IPC::Open2;
> my $ORAUSER = 'foo';
> # my $instance = 'bar';
> my $SID = 'burp';
>
> my $pid = open2(\*CHLD_OUT, \*CHLD_IN, "su - $ORAUSER -c sqlplus
> /nolog");
> print CHLD_IN < > connect / as sysdba
> # select * from v$instance;
select * from v\$instance; # $instance ist keine Perl-Variable
> EOF

close (CHLD_IN); # Sonst bleibt das Script hängen

> my $res = join '', grep /$SID/, ;
>
>> Leider verstehe ich das IPC::Open2 nicht wirklich.
>
> Habe dein Beispiel jetzt quasi 1:1 in das Beispiel aus der Dokumentation
> fliessen lassen.
>

Mit der kleinen Änderung (siehe oben)funktioniert es wunderbar, vielen Dank.

>> Mit dem sqlplus zu kommunizieren ist noch eins aber wie kann ich das
>> ganze unter dem $ORAUSER Kontext ausführen?
>
> Statt das externe su(1) zu nehmen, kannst du natürlich auch per $< und
> $> deine UID wechseln. Details findest du in perlvar(1). Ich empfehle
> auch einen Blick in die Doku von POSIX::setuid() und setuid(2).
>
> Kannst du das ganze nicht auch über DBI machen? Dann hättest du alle
> externen Programme eliminiert.
>

Das werde ich noch studieren, danke für den Tipp.

> Gruß
> Christian
>

Herzlichen Dank nochmals und Grüsse .. Retep

Re: HERE-Script und "su - c"

am 24.04.2006 09:56:53 von Retep Grubanov

Hallo Ingo,

vielen Dank für deine Idee.

> Ingo Menger wrote:
>
> Also, wie wäre es mit:
>
> open RESULT, "echo 'select * from v\$instance' | su - \$ORAUSER -c
> sqlplus '/ as sysdba' | "
> or die "can't run sqlplus";

Ich muss nach dem sqlplus-Aufruf, also auf dem sqlplus-Prompt den Befehl ..

connect / as sysdba

... eingeben können.

Du gehst davon aus, dass direkt beim sqlplus-Aufruf den Connect-String
mitgeben werden kann. Dies geht aber leider nicht.

In der KSH würde es so aussehen:

su - ${ORAUSER} -c sqlplus /nolog <<-\/EOF
connect / as sysdba
select * from v$instance;
/EOF

Ich werde mal die Lösung von Christian weiter verfolgen.

Hier noch ein nützlicher Link:
http://www.stormloader.com/yonghuang/computer/OracleAndPerl. html

Viele Grüsse, Retep

Re: HERE-Script und "su - c"

am 24.04.2006 10:29:43 von Ingo Menger

Retep Grubanov schrieb:

> Hallo Ingo,
>
> vielen Dank für deine Idee.
>
> > Ingo Menger wrote:
> >
> > Also, wie wäre es mit:
> >
> > open RESULT, "echo 'select * from v\$instance' | su - \$ORAUSER -c
> > sqlplus '/ as sysdba' | "
> > or die "can't run sqlplus";
>
> Ich muss nach dem sqlplus-Aufruf, also auf dem sqlplus-Prompt den Befehl =
..
>
> connect / as sysdba
>
> .. eingeben können.

Nein. Wozu denn.


> Du gehst davon aus, dass direkt beim sqlplus-Aufruf den Connect-String
> mitgeben werden kann. Dies geht aber leider nicht.

Warum soll das nicht gehen? Das mache ich immer so.
Außerdem, wenn es denn unbedingt sein muß, geht auch sowas:

(echo connect as sysdba; echo 'select * from v$instance') | sqlplus
/nolog

Re: HERE-Script und "su - c"

am 24.04.2006 11:17:11 von Retep Grubanov

Hallo Christian,

ich habe mir noch die beiden letzen Punkte zu Gemüte geführt.

> Christian Lackas wrote:
>
> Statt das externe su(1) zu nehmen, kannst du natürlich auch per $< und
> $> deine UID wechseln. Details findest du in perlvar(1). Ich empfehle
> auch einen Blick in die Doku von POSIX::setuid() und setuid(2).
>

Mit dem POSIX::setuid(3330) Aufruf konnte ich im Script die EUID ändern:

use POSIX;

$ORAUID = 3316;

print "\$< = $<\n";
print "\$> = $>\n";

print `/usr/bin/id`;
$> = POSIX::setuid($ORAUID);
print `/usr/bin/id`;
$> = POSIX::setuid(0);
print `/usr/bin/id`;

OUTPUT:

$< = 0
$> = 0
uid=0(root) gid=0(root) groups=0(root)
uid=3316(orapmo) gid=0(root) groups=0(root)
uid=3316(orapmo) gid=0(root) groups=0(root)

Was jetzt fehlt ist das Environment des ORAUSERS. Der Vorteil von der 'su -'
Lösung ist, dass ich das aktuelle ORAUSER Environment zur Verfügung habe.

Ich konnte jedoch mit dem setuid nicht mehr auf den Root zurückswitchen.

Habe ich da was falsch verstanden?

> Kannst du das ganze nicht auch über DBI machen? Dann hättest du alle
> externen Programme eliminiert.
>

Ich denke, dass damit mit den Kanonen auf die Spatzen geschossen würde. Wir
brauchen nur rudimentäre SQL-Abfragen. Und dafür auf allen Plattformen (ca.
80) DBI zu installieren und zu unterhalten wäre zu aufwendig.

> Gruß
> Christian
>

Grüsse, Retep

Re: HERE-Script und "su - c"

am 24.04.2006 14:49:13 von Retep Grubanov

Ingo Menger wrote:

>
> Retep Grubanov schrieb:
>
>> Hallo Ingo,
>>
>> vielen Dank für deine Idee.
>>
>> > Ingo Menger wrote:
>> >
>> > Also, wie wäre es mit:
>> >
>> > open RESULT, "echo 'select * from v\$instance' | su - \$ORAUSER -c
>> > sqlplus '/ as sysdba' | "
>> > or die "can't run sqlplus";

Super funktioniert im Prinzip, musste den Aufruf jedoch wie folgt abändern:

open (RESULT, "echo 'select * from v\$instance;' | su - $ORAUSER -c
\"sqlplus ' / as sysdba'\" | ") || die "can't run sqlplus";

>>
>> Ich muss nach dem sqlplus-Aufruf, also auf dem sqlplus-Prompt den Befehl
>> ..
>>
>> connect / as sysdba
>>
>> .. eingeben können.
>
> Nein. Wozu denn.
>
>
>> Du gehst davon aus, dass direkt beim sqlplus-Aufruf den Connect-String
>> mitgeben werden kann. Dies geht aber leider nicht.
>
> Warum soll das nicht gehen? Das mache ich immer so.
> Außerdem, wenn es denn unbedingt sein muß, geht auch sowas:
>
> (echo connect as sysdba; echo 'select * from v$instance') | sqlplus
> /nolog

Das habe ich nicht hingekriegt.

Herzlichen Dank, Retep

Re: HERE-Script und "su - c"

am 24.04.2006 15:12:20 von Ingo Menger

Retep Grubanov schrieb:

> Ingo Menger wrote:

> > (echo connect as sysdba; echo 'select * from v$instance') | sqlplus
> > /nolog
>
> Das habe ich nicht hingekriegt.

Naja, das ist shell-Syntax (muß wohl auch connect / heißen).
Das hat für mich den Vorteil, daß man es erst auf shell-Ebene
ausprobieren kann und wenn es funktioniert, hängt man noch ein "|"
hinten dran und schreibt q{} drumherum, dies sollte dann als "Filename"
auch im perl-Open funktionieren. Also

$pipe =3D q{(echo connect / as sysdba; echo 'select * from v$instance') |
su - $ORA -c "sqlplus /nolog"|}
open PIPE, $pipe or die "...";

Re: HERE-Script und "su - c"

am 24.04.2006 15:47:29 von Retep Grubanov

Ingo Menger wrote:

>
> Retep Grubanov schrieb:
>
>> Ingo Menger wrote:
>
>> > (echo connect as sysdba; echo 'select * from v$instance') | sqlplus
>> > /nolog
>>
>> Das habe ich nicht hingekriegt.
>
> Naja, das ist shell-Syntax (muß wohl auch connect / heißen).
> Das hat für mich den Vorteil, daß man es erst auf shell-Ebene
> ausprobieren kann und wenn es funktioniert, hängt man noch ein "|"
> hinten dran und schreibt q{} drumherum, dies sollte dann als "Filename"
> auch im perl-Open funktionieren. Also
>
> $pipe = q{(echo connect / as sysdba; echo 'select * from v$instance') |
> su - $ORA -c "sqlplus /nolog"|}
> open PIPE, $pipe or die "...";

Spitze, funktioniert tiptop, nur noch das ";" nach v$instance einfügen.