[PERL] zowel if en else true?

Pagina: 1
Acties:

  • kauwgomballen
  • Registratie: Oktober 2001
  • Laatst online: 23-06-2025
Allereerst wil ik even melden dat ik absoluut geen Perl-guru ben. Desondanks probeer ik toch een Perl CGI scriptje draaiend te krijgen, namelijk http://rucus.ru.ac.za/~bvi/utils/webpass/

Ik heb het script zelf uitgebreid zodat het huidige password op een andere manier wordt gecheckt. De check gaat goed, dus tot dusverre geen probleem. Nu komt het script aan bij het daadwerkelijke wachtwoord-wijzigen.

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
die derror("Cannot fork!: $!") unless defined($pid = open (PASSW, "|-"));
$SIG{ALRM}= sub {die derror("PIPE to $program broke! $!\n"); };

#parent
if ($pid)
{ print "Changing password to $npassword -->\n";
  print PASSW $npassword;
  close PASSW ; #or die derror("Child Died!");
   droproot(); return 1;
} else { #child
#print $user;
exec($program,@program_args,$user) ||die derror("Can't spawn and exec $program : $!");
}


$pid wordt geset, en deze bevat ook een waarde. De if is dus true, en wordt uitgevoerd (gecheckt door wat te printen). Mijn script geeft echter een error op de exec regel. De exec regel staat in de else, die dus helemaal niet uitgevoerd zou moeten worden. Als ik hier dus ook wat print om te testen, dan wordt dat óók geprint. Ik heb gezocht op google, maar overal waar ik kijk, staat dat óf het een, óf het ander wordt uitgevoerd, en NOOIT beiden! Hoe kan het dat hier wél beiden wordt uitgevoerd?!

[ Voor 4% gewijzigd door kauwgomballen op 09-03-2006 21:52 ]


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Mijn script geeft echter een error op de exec regel.
Is dat niet gewoon een compile error; aangezien je de string daar niet afsluit?
edit:
Moet je je startpost niet aan gaan passen :P

[ Voor 18% gewijzigd door Spider.007 op 09-03-2006 21:54 ]

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • kauwgomballen
  • Registratie: Oktober 2001
  • Laatst online: 23-06-2025
Heb het net aangepast, was een copy-paste foutje. De exacte error die ik daar krijg:

Insecure dependency in exec while running setuid at <<script locatie>> line 473.

  • Semyon
  • Registratie: April 2001
  • Laatst online: 08:49
Euhm gezien je met threads lijkt te werken:

In de ene thread neem je het ene pad van de if en doe je niet de else.
In de andere thread neem je het andere pad en neem je alleen de else

Je voert dus inderdaad alleen maar of alleen het ene of het andere uit. Maar omdat het jet het 2x draait (parallel) en de uitput naar hetzelfde stuurt krijg je inderdaad beide dingen uitgevoerd.

Maar dat is toch het idee van forken?

Only when it is dark enough, can you see the stars


  • Harrie
  • Registratie: November 2000
  • Laatst online: 15:19

Harrie

NederVlaming

Vreemd... Doet hij dat ook als je die return 1 weghaalt?

  • kauwgomballen
  • Registratie: Oktober 2001
  • Laatst online: 23-06-2025
Semyon schreef op donderdag 09 maart 2006 @ 21:54:
Euhm gezien je met threads lijkt te werken:

In de ene thread neem je het ene pad van de if en doe je niet de else.
In de andere thread neem je het andere pad en neem je alleen de else

Je voert dus inderdaad alleen maar of alleen het ene of het andere uit. Maar omdat het jet het 2x draait (parallel) en de uitput naar hetzelfde stuurt krijg je inderdaad beide dingen uitgevoerd.

Maar dat is toch het idee van forken?
uuuuuhm... threads? forken? dit gaat me even te snel... zoals ik in de startpost al zei: ben geen Perl-guru :)
Kan prima met PHP overweg, maar wat ik met dit script wil bereiken, lukt me niet in PHP
Harrie schreef op donderdag 09 maart 2006 @ 21:55:
Vreemd... Doet hij dat ook als je die return 1 weghaalt?
Ja, plus dat ik dan een error krijg (error-afhandeling van script) dat mijn wachtwoord niet correct is

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Kauwgomballen schreef op donderdag 09 maart 2006 @ 21:59:
[...]

Kan prima met PHP overweg, maar wat ik met dit script wil bereiken, lukt me niet in PHP

[...]
offtopic:
Weet je het zeker?

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • kauwgomballen
  • Registratie: Oktober 2001
  • Laatst online: 23-06-2025
Hahaha, ja, ik weet het zeker :P

Heb er al wel naar gekeken om het via PHP te doen, maar dit perl script biedt opzich goede security (voor zover passwords wijzigen via webbased interface secure is :P), dus ga ik liever voor dit perl script...

  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

Kauwgomballen schreef op donderdag 09 maart 2006 @ 21:59:
[...]

uuuuuhm... threads? forken? dit gaat me even te snel... zoals ik in de startpost al zei: ben geen Perl-guru :)
The fork() emulation is implemented at the level of the Perl interpreter. What this means in general is that running fork() will actually clone the running interpreter and all its state, and run the cloned interpreter in a separate thread, beginning execution in the new thread just after the point where the fork() was called in the parent. We will refer to the thread that implements this child ``process'' as the pseudo-process.

To the Perl program that called fork(), all this is designed to be transparent. The parent returns from the fork() with a pseudo-process ID that can be subsequently used in any process manipulation functions; the child returns from the fork() with a value of 0 to signify that it is the child pseudo-process.
Oftewel; als jij forkt heb je je programma tweemaal runnen; en dan heb je dus twee keer kans op verschillende output

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • kauwgomballen
  • Registratie: Oktober 2001
  • Laatst online: 23-06-2025
Ok, ik weet nu in ieder geval wat forken is :)

Morgen maar eens kijken waarom het nu dus mis gaat in mijn script en wat ik moet veranderen om het werkend te krijgen. Bedankt alvast!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 05-04 18:00
Waarom fork je op die onduidelijke manier in plaats van gewoon met fork. Sterker, waarom fork je überhaupt? Zeker in Perl geldt dat werkende code niet per se een goede code is en in dit geval werkt de code niet eens.

Volgens mij moet je focussen op je doel (wat dat is heb je nog niet eens uitgelegd). Ik krijg bovendien niet de indruk dat wat je wil bereiken niet met PHP kon (niet dat ik je dat nu wil aanraden, maar toch).

  • kauwgomballen
  • Registratie: Oktober 2001
  • Laatst online: 23-06-2025
Soultaker schreef op vrijdag 10 maart 2006 @ 02:22:
Waarom fork je op die onduidelijke manier in plaats van gewoon met fork. Sterker, waarom fork je überhaupt? Zeker in Perl geldt dat werkende code niet per se een goede code is en in dit geval werkt de code niet eens.

Volgens mij moet je focussen op je doel (wat dat is heb je nog niet eens uitgelegd). Ik krijg bovendien niet de indruk dat wat je wil bereiken niet met PHP kon (niet dat ik je dat nu wil aanraden, maar toch).
Dit script heb ik van een andere site, zie mijn startpost. Dat forken is dus door de auteur gedaan, niet door mij.

Mijn doel is het wijzigen van wachtwoorden (/etc/passwd) via een webinterface. Als je de thread daadwerkelijk had doorgelezen, zou je dat wel hebben gezien.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 05-04 18:00
Kauwgomballen schreef op vrijdag 10 maart 2006 @ 10:41:
Dit script heb ik van een andere site, zie mijn startpost. Dat forken is dus door de auteur gedaan, niet door mij.

Mijn doel is het wijzigen van wachtwoorden (/etc/passwd) via een webinterface. Als je de thread daadwerkelijk had doorgelezen, zou je dat wel hebben gezien.
Als je mij beticht van gebrekkig lezen, neem ik aan dat je zelf de FAQ wel gelezen hebt? Daarin staat duidelijk vermeldt dat dit forum bedoeld is voor eigengeschreven code en niet voor het debuggen van code die je ergens anders gevonden hebt.

Ik ga er dus vanuit dat code die je plaatst ofwel zelfgeschreven is ofwel dat je die code bewust geselecteerd hebt. Voor problemen met de code van derden kun je met de betreffende persoon contact opnemen.

Blijkbaar ben je op je pik getrapt als ik je vraag om na te denken over wat de programmacode die je geschreven/gekopieerd hebt doet. Zo'n houding is een programmeur onwaardig en als ik geen kritiek mag geven heb ik verder ook geen zin om je met je probleem te helpen.

  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

If you open a pipe on the command '-', i.e., either '|-' or '-|' with 2-arguments (or 1-argument) form of open(), then there is an implicit fork done, and the return value of open is the pid of the child within the parent process, and 0 within the child process. (Use defined($pid) to determine whether the open was successful.) The filehandle behaves normally for the parent, but i/o to that filehandle is piped from/to the STDOUT/STDIN of the child process. In the child process the filehandle isn't opened--i/o happens from/to the new STDOUT or STDIN. Typically this is used like the normal piped open when you want to exercise more control over just how the pipe command gets executed, such as when you are running setuid, and don't want to have to scan shell commands for metacharacters. The following triples are more or less equivalent:

open(FOO, "|tr '[a-z]' '[A-Z]'");
open(FOO, '|-', "tr '[a-z]' '[A-Z]'");
open(FOO, '|-') || exec 'tr', '[a-z]', '[A-Z]';
open(FOO, '|-', "tr", '[a-z]', '[A-Z]');

open(FOO, "cat -n '$file'|");
open(FOO, '-|', "cat -n '$file'");
open(FOO, '-|') || exec 'cat', '-n', $file;
open(FOO, '-|', "cat", '-n', $file);

The last example in each block shows the pipe as ``list form'', which is not yet supported on all platforms. A good rule of thumb is that if your platform has true fork() (in other words, if your platform is UNIX) you can use the list form.

  • kauwgomballen
  • Registratie: Oktober 2001
  • Laatst online: 23-06-2025
_/-\o_
Ik heb if($pid) nu gewijzigd in if(defined($pid)). Nu krijg ik geen foutmelding meer, en alleen de if wordt uitgevoerd, niet de else. Bedankt!
Pagina: 1