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/.
Jak pobrać w perlu zmienną bashową?
np chce pobrać zmienną $IMG
Offline
Najpierw export IMG='costam'. W perl-u:
print $ENV{'IMG'} . "\n"
Alternatywnie możesz użyć modułu Env::Bash.
Offline
Minio napisał(-a):
Najpierw export IMG='costam'. W perl-u:
Kod:
print $ENV{'IMG'} . "\n"Alternatywnie możesz użyć modułu Env::Bash.
Coś mi to nie działa, ale napiszę o co mi chodzi, może wtedy będzie łatwiej,
Chciałem napsiać sobie prosty skrypt w perlu do smtp-gated, i w examplu (który jest w bashu) wykorzystuje zmienne jak $FOUND, $SOURCE_IP i ja ich potrzebuje, tylko coś nie mogę sobie z tym poradzić! Chyba że się nie da czegoś takie zrobić?
W perlu to ja raczej raczkuje dopiero dlatego proszę o wyrozumiałość
Pozdrawiam
Offline
Nie znam tego programu. Mówisz o tym „examplu”?
Jeżeli tak, to nie mam pojęcia skąd on bierze te zmienne. Może pokaż wyniki poleceń:
env set | grep "^[A-Z]"
Najlepiej by było gdybyś opisał po kolei co się dzieje w systemie, ale obawiam się że to może przerosnąć Twoje możliwości (no offence).
Offline
env:
SHELL=/bin/bash TERM=xterm USER=root LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36: SUDO_USER=maro SUDO_UID=1000 USERNAME=root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MAIL=/var/mail/maro PWD=/root LANG=pl_PL.UTF-8 PS1=\h:\w\$ SHLVL=1 SUDO_COMMAND=/bin/bash HOME=/root LOGNAME=root SUDO_GID=1000 _=/usr/bin/env
set | grep "^[A-Z]"
BASH=/bin/bash BASH_ARGC=() BASH_ARGV=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="3" [1]="2" [2]="39" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu") BASH_VERSION='3.2.39(1)-release' COLUMNS=80 DIRSTACK=() EUID=0 GROUPS=() HISTFILE=/root/.bash_history HISTFILESIZE=500 HISTSIZE=500 HOME=/root HOSTNAME=flower HOSTTYPE=x86_64 IFS=$' \t\n' LANG=pl_PL.UTF-8 LINES=24 LOGNAME=root LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:' MACHTYPE=x86_64-pc-linux-gnu MAIL=/var/mail/maro MAILCHECK=60 OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PIPESTATUS=([0]="0") PPID=1965 PS1='\h:\w\$ ' PS2='> ' PS4='+ ' PWD=/root SHELL=/bin/bash SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor SHLVL=1 SUDO_COMMAND=/bin/bash SUDO_GID=1000 SUDO_UID=1000 SUDO_USER=maro TERM=xterm UID=0 USER=root USERNAME=root
Generalnie jest to mail proxy, przechwytuje sesje na port 25 i skanuje maile za pomoca spamassassin pod kątem spamu,
i clamav pod kątem wirusów, w momencie wykrycia spamu lub wirusa odpala skrypt!Np własnie ten który podałeś w linku
Offline
Wydaje mi się że ten program ustawia jakieś wewnętrzne zmienne i przekazuje je do podprocesu. Generalnie jedynym sposobem jaki widzę jest działanie naokoło, przy pomocy odpowiedniego wrappera napisanego w shellu. Będzie to skrypt, który będzie wywoływany przez smtp-gated, na którego końcu znajdzie się wywołanie skryptu właściwego, który pierwotnie chciałeś podpiąć pod to zdarzenie. Wyglądać on powinien mniej więcej tak:
#!/bin/bash export FOUND="$FOUND" # tutaj eksportujesz wszystkie zmienne do których chcesz mieć dostęp w skrypcie perl-owym /sciezka/do/skryptu.pl
Zaś w skryptu.pl zmienne to powinny być już w hashu %ENV, i do poszczególnych wartości odwołujesz się poprzez podanie nazwy zmiennej jako klucza (przykład masz w pierwszym moim poście).
Nie gwarantuję że to będzie działać. Widzę że autor jest Polakiem, więc może zapytaj go drogą mailową czy zna jakiś sposób na osiągnięcie tego co chcesz osiągnąć?
Alternatywnie możesz zmodyfikować źródła programu, aby ustawiane zmienne exportował (były zmiennymi środowiskowymi, nie lokalnymi). Być może takie zachowanie jest pomyślane przez autora, tylko domyślnie nie jest włączone? Sprawdź w pliku konfiguracyjnym i dokumentacji (czy nie istnieje odpowiedni przełącznik).
Offline
Ten sposób na około działa dopóki nie próbuje użyć use Pg;
wtedy dostaje coś takiego:
Can't load '/usr/lib/perl5/auto/Pg/Pg.so' for module Pg: libssl.so.0.9.8: odwzorowanie segmentu z obiektu dzielonego nie powiodło się: Nie można przydzielić pamięci at /usr/lib/perl/5.10/DynaLoader.pm line 196. at /etc/test line 3 Compilation failed in require at /etc/test line 3. BEGIN failed--compilation aborted at /etc/test line 3.
Gdy ręcznie odpale skrypt to wszytsko jest ok :/
Ale zauważyłem że w skrypcie którego kiedyś używałem dzieje się to samo,
od czasu aktualnizacji z eth do lenny
Offline
Gdyby udało Ci się otrzymać informację o błędzie po angielsku (LC_MESSAGES=en_EN), być może google by pomogło w zlokalizowaniu problemu.
Nie napisałeś czy podczas ręcznego odpalania skryptu smtp-gated działa sobie gdzieś w tle. Czy jest możliwe że Twojemu systemowi naprawdę brakuje pamięci? Czy ustawiłeś na komputerze ograniczenie ilości pamięci która może zostać przydzielona jednemu procesowi?
Być może jest to błąd z używaną wersją modułu libdbd-pg-perl. Zobacz czy wersja z sida działa lepiej. Jeżeli nie, zawsze możesz wrócić do wersji z oldstable (repozytoria etcha dalej są dostępne). Choć sądząc po numerkach wersji, program przeszedł od tego czasu naprawdę wiele.
Offline
Minio napisał(-a):
Gdyby udało Ci się otrzymać informację o błędzie po angielsku (LC_MESSAGES=en_EN), być może google by pomogło w zlokalizowaniu problemu.
Nie udało mi się uzyskać angielskiego komunikatu mimo iż pokazuje, że LC_MESSAGES=en_EN to i tak błąd jest taki jak wyżej.
Nie napisałeś czy podczas ręcznego odpalania skryptu smtp-gated działa sobie gdzieś w tle. Czy jest możliwe że Twojemu systemowi naprawdę brakuje pamięci? Czy ustawiłeś na komputerze ograniczenie ilości pamięci która może zostać przydzielona jednemu procesowi?
Tak smtp-gated działa cały czas w tle, pamięci raczej mu nie brakuje zwłaszcza ze htop pokazuje prawie 400MB wolnej, Ja takiego ograniczenia nie ustawiałem, chyba że ustawiło się podczas migracji z etch -> lenny wtedy też zaczęły się problemy również z innymi skryptami. Gdzie mogę sprawdzić czy coś takiego jest ustawione?
Być może jest to błąd z używaną wersją modułu libdbd-pg-perl. Zobacz czy wersja z sida działa lepiej. Jeżeli nie, zawsze możesz wrócić do wersji z oldstable (repozytoria etcha dalej są dostępne). Choć sądząc po numerkach wersji, program przeszedł od tego czasu naprawdę wiele.
Nie używam libdbd-pg-perl tylko libpg-perl
Offline
maro napisał(-a):
Nie udało mi się uzyskać angielskiego komunikatu mimo iż pokazuje, że LC_MESSAGES=en_EN to i tak błąd jest taki jak wyżej.
Wyłącz smtp-gated. Ustaw powyższą zmienną. Albo w ogóle LC_ALL=en_EN. Uruchom smtp-gated, tak aby przejął ustawienia tej zmiennej. Jeżeli działa jako daemon, musisz zmodyfikować skrypt inicjujący.
maro napisał(-a):
Ja takiego ograniczenia nie ustawiałem, chyba że ustawiło się podczas migracji z etch -> lenny wtedy też zaczęły się problemy również z innymi skryptami. Gdzie mogę sprawdzić czy coś takiego jest ustawione?
ulimit -a
Ale upewnij się, że wyknujesz to dokładnie w tym środowisku w jakim jest uruchamiany smtp-gated.
maro napisał(-a):
Nie używam libdbd-pg-perl tylko libpg-perl
Szkoda, bo widzę że ten moduł prawie w ogóle się nie zmienił, więc raczej wina nie leży po jego stronie. Dalej zalecam spróbowanie wersji z oldstable, jeśli jeszcze tego nie zrobiłeś.
Offline
Minio napisał(-a):
maro napisał(-a):
Nie udało mi się uzyskać angielskiego komunikatu mimo iż pokazuje, że LC_MESSAGES=en_EN to i tak błąd jest taki jak wyżej.
Wyłącz smtp-gated. Ustaw powyższą zmienną. Albo w ogóle LC_ALL=en_EN.
Albo LANG i LANGUAGE.
Offline
azhag napisał(-a):
Minio napisał(-a):
Wyłącz smtp-gated. Ustaw powyższą zmienną. Albo w ogóle LC_ALL=en_EN.
Albo LANG i LANGUAGE.
W kwestii formalnej — zmienna LANG określa locale które mają być użyte w sytuacji gdy interesująca zmienna (np. LC_MESSAGES) jest pusta. To taka siatka bezpieczeństwa, która w naturalnych warunkach raczej rzadko jest używana.
Offline
tyle ze zmiana LANG zmienia zawartosc (prawie) wszystkich LC_* - zobacz
LANG=C locale
btw. =C jest wygodniejsze w pisaniu niz jakies =en_EN ...
Offline
Pisząc swojego posta posiłkowałem się wiedzą z tej wiadomości. Oczywiście masz rację, co może znaczyć że ten post już się zdezaktualizował (wcześniej nie zwróciłem uwagi, że liczy już prawie 7 lat).
Offline
Próbowałem zainstalować ten pakiet z oldstable ale niestety kłopoty z zależnościami za nowa wersja perl-base i jeszcze innych paru.
Angielski komunikat:
Can't load '/usr/lib/perl5/auto/Pg/Pg.so' for module Pg: libssl.so.0.9.8: failed to map segment from shared object: Cannot allocate memory at /usr/lib/perl/5.10/DynaLoader.pm line 196. at /etc/test line 3 Compilation failed in require at /etc/test line 3. BEGIN failed--compilation aborted at /etc/test line 3.
Niesety google tez nie wiele mówi.
Offline
Radziłbym zapytać w jakimś miejscu gdzie siedzi wielu perl-owych ekspertów, np. perl Monks.
Offline