Re: $ARGV[0] breaks the script



Hi thanks for looking at the script..

Just to clarify, the scipt runs perfectly if $input it hardcoded eg
$input="httpd".
thus if the process is running then it exits, if the process is not
running then it exicutes
exec "/etc/init.d/$input restart &";

But if I use $input=$ARGV[0] to give the process name from the command
line, it runs as if the process is running if if I have stoped/killed
it..

the only reason for this is that there is a hidden character, but
where is it comming from ?



On 12/14/06, D. Bolliger <info@xxxxxxxxxxxx> wrote:
Gregory Machin am Donnerstag, 14. Dezember 2006 13:24:
> hi

Hi Gregory

> the script will not work

"Not work?" :-)

> if I use $ARGV[0] but works 100% if I hard
> code the $input variable;
> what have i missed ?

You can give anything as cmd line argument, and the script will tell you that
it is not running, because of

a) open PROS, "ps -ef|grep $input |";
combined with
b) unless ($line =~ m/grep/){...}

This script is running as root... that makes it even more important to check
user provided data, what exactly is executed in the shell, and what binaries
are called.

- use absolute paths for binaries (ps and grep in this case)
- make sure that $input only contains ascii characters
for example, in this case, only a to z:

my ($input) = $ARGV[0]=~/([a-z]{,16})/; # untested
die unless $input;

btw: /etc/init.d/grep start ???

This is a hint to also check if $input corresponds to a binary
in /etc/init.d at the beginning of the script :-)

This would solve the grep-not-allowed/script-uses-grep-and-does-not-work
problem :-)

What about also using /etc/init.d/some_daemon status and check if this
information is in sync with the ps output (it isn't always, and the restart
could therefore fail - what you don't test)

hope this helps

Dani

> #!/usr/bin/perl
>
> # if your prgram has the string "grep" in the name or in the path
> # this program won't work.
>
> use strict;
> use warnings;
>
> my $line;
> my $input;
>
> $input=$ARGV[0]; #$input="httpd";
> chomp $input;
> open PROS, "ps -ef|grep $input |";
>
> while ($line = <PROS>){
> unless ($line =~ m/grep/){
> print "$input is running\n";
> exit;
> }
> }
>
> print "$input isn't running\n";
> exec "/etc/init.d/$input restart &";
>
> Many thanks
>
> --
> Gregory Machin
> gregory.machin@xxxxxxxxx
> www.linuxpro.co.za

--
To unsubscribe, e-mail: beginners-unsubscribe@xxxxxxxx
For additional commands, e-mail: beginners-help@xxxxxxxx
<http://learn.perl.org/> <http://learn.perl.org/first-response>





--
Gregory Machin
gregory.machin@xxxxxxxxx
www.linuxpro.co.za
.



Relevant Pages

  • Re: Parsing a text file line-by-line: skipping badly-formed lines?
    ... splits it into several smaller files, ... line contains binary or control characters), and the script just exits ... cause the script to exit. ...
    (comp.lang.perl.misc)
  • Re: Orderly shutdown of running programs when quitting X
    ... >> Is there a way to run a script before X exits, ... > Why not just lock your console instead, ...
    (Debian-User)
  • Re: exit application script
    ... user out of the application if it's been idle for a set amount of time. ... Is there a way to write a script that exits the application if the user ... Perhaps constantly monitoring the CPU usage of the process? ...
    (microsoft.public.scripting.wsh)
  • Re: Background processes from a script
    ... > - interacts with that application and then exits. ... > X-application to be killed when the script exits or if the script is killed ... > I'll use xterm as a sample application (the real one is different but the ... > echo Sleeping for 60 seconds ...
    (comp.unix.shell)