Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1




 złodziej wirków ]:->
 złodziej wirków ]:->
	Pasuje mi napisać wrapera dla kilku binarek, m.in dla perla. Po przestudiowaniu kilku dziwnych hałtu czy innych poradników doszedłem do wniosku, że wykorzystam do tego... perla ;)
Spłodziłem sobie taki oto kod:
#!/usr/bin/perl -w
use strict;
use Unix::Lsof;
use Cwd;
use File::stat;
use Data::Dump 'dump';
my $USER;
my $FILE;
my $PATH;
my $ARG;
my $STATS;
my $PID;
my $LO;
my @output;
my $error;
my $LOGFILE;
$PATH=getcwd;
$USER=getlogin();
foreach $ARG (@ARGV) {
  $FILE="$PATH/$ARG";
  if (-e $FILE) {
   $LOGFILE="/tmp/perl-wraper-$USER.log";
   open (LOG, ">$LOGFILE");
   $STATS=stat($FILE);
   print LOG "Polecenie: /usr/bin/perl @ARGV\n\n";
   print LOG "Plik: $FILE\nSzczegoly:\n\t";
   printf LOG "Rozmiar: %s\n\tPrawa:  %04o\n\tCzas modyfikacji: %s\n",$STATS->size, $STATS->mode & 07777, scalar localtime $STATS->mtime;
  }
}
$PID=fork();
if ($PID == 0){
 exec("/usr/bin/perl @ARGV");
}
(@output,$error)=lsof("-p",$PID);
print LOG dump  @output;
close(LOG);Do tego jeszcze tylko wysyłanie pliku loga mailem muszę dorobić ale to chwila moment.
W każdym razie fragment 
$PID=fork();
if ($PID == 0){
 exec("/usr/bin/perl @ARGV");
}Nie bangla ;/
W pliku loga jest takie coś:
vidharr@nilfheim ~ $ cat /tmp/perl-wraper-vidharr.log 
Polecenie: /usr/bin/perl x.pl
Plik: /home/vidharr/x.pl
Szczegoly:
        Rozmiar: 40
        Prawa:  0711
        Czas modyfikacji: Tue Jan 24 16:43:09 2012
(
  {},
  "lsof: WARNING: can't stat() usbfs file system /proc/bus/usb\n      Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/etc/bind\n      Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/bind\n      Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/log/named\n      Output information may be incomplete.\n",Czyli nie puszcza lsofa ;/
plik pomocniczy x.pl
#!/usr/bin/perl -w print "dupadupa\n";
Natomiast jak podmienię forka na takie coś:
$PID=fork();
if ($PID == 0){
 exec("/home/vidharr/x.sh");
}to robi co ma robić i w logu jest taki wpis:
Polecenie: /usr/bin/perl x.sh
Plik: /home/vidharr/x.sh
Szczegoly:
        Rozmiar: 34
        Prawa:  0644
        Czas modyfikacji: Tue Jan 24 17:43:12 2012
(
  {},
  "lsof: WARNING: can't stat() usbfs file system /proc/bus/usb\n      Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/etc/bind\n      Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/bind\n      Output information may be incomplete.\nlsof: WARNING: can't stat() ext4 file system /chroot/named/var/log/named\n      Output information may be incomplete.\n",
)(
  {
    13612 => {
          "command name"     => "perl",
          files              => [
                                  {
                                    "access mode"               => " ",
                                    "file descriptor"           => "cwd",
                                    "file name"                 => "/home/vidharr",
                                    "file size"                 => 4096,
                                    "file type"                 => "DIR",
                                    "inode number"              => 2621441,
                                    "link count"                => 20,
                                    "lock status"               => " ",
                                    "major/minor device number" => "0xfd07",
                                  },plik x.sh
#!/bin/bash echo dupa echo dupa2
I na końcu też są warningi z lsofa. Czy ktoś wie o co w tym wszystkich chodzi ? Dlaczego raz wywoła się poprawnie a raz odwali manianę ;/
Ostatnio edytowany przez winnetou (2012-01-24 21:44:01)
Offline




 złodziej wirków ]:->
 złodziej wirków ]:->
	ehhh. Szkolny błąd ;/
$PID=fork();
if ($PID == 0){
 exec("/usr/bin/perl @ARGV");
}skoro forkuje proces to przecież on dostaje swój wektor parametrów więc wywołanie @ARGV jest bez sensu ;/
Wystarczyło dopisać
my @X; @X=@ARGV;
na początku a wywołanie forka zmienić na :
$PID=fork();
if ($PID == 0){
 system("/usr/bin/perl @X");
}(nie wiem dla czego ale nie działało z exec ;]) 
Za mało piwa przy kodzeniu, na sucho jednak nie można ;)
Offline
Strony: 1