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 ]:->
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 ]:->
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