FAQ Perl::Журнал СА 1.2002
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Подписка
Архив номеров
Где купить
Наука и технологии
Авторам
Рекламодателям
Контакты
   

  Опросы
  Статьи

Дата-центры  

Дата-центры: есть ли опасность утечки данных?

Российские компании уже несколько лет испытывают дефицит вычислительных мощностей. Рост числа проектов,

 Читать далее...

Событие  

В банке рассола ждет сисадмина с полей фрактал-кукумбер

Читайте впечатления о слете ДСА 2024, рассказанные волонтером и участником слета

 Читать далее...

Организация бесперебойной работы  

Бесперебойная работа ИТ-инфраструктуры в режиме 24/7 Как обеспечить ее в нынешних условиях?

Год назад ИТ-компания «Крок» провела исследование «Ключевые тренды сервисного рынка 2023». Результаты

 Читать далее...

Книжная полка  

Читайте и познавайте мир технологий!

Издательство «БХВ» продолжает радовать выпуском интересных и полезных, к тому же прекрасно

 Читать далее...

СУБД PostgreSQL  

СУБД Postgres Pro

Сертификация по новым требованиям ФСТЭК и роль администратора без доступа к данным

 Читать далее...

Критическая инфраструктура  

КИИ для оператора связи. Готовы ли компании к повышению уровня кибербезопасности?

Похоже, что провайдеры и операторы связи начали забывать о требованиях законодательства

 Читать далее...

Архитектура ПО  

Архитектурные метрики. Качество архитектуры и способность системы к эволюционированию

Обычно соответствие программного продукта требованиям мы проверяем через скоуп вполне себе понятных

 Читать далее...

Как хорошо вы это знаете  

Что вам известно о разработках компании ARinteg?

Компания ARinteg (ООО «АРинтег») – системный интегратор на российском рынке ИБ –

 Читать далее...

Графические редакторы  

Рисование абстрактных гор в стиле Paper Cut

Векторный графический редактор Inkscape – яркий представитель той прослойки open source, с

 Читать далее...

День сисадмина  

Учите матчасть! Или как стать системным администратором

Лето – время не только отпусков, но и хорошая возможность определиться с профессией

 Читать далее...

День сисадмина  

Живой айтишник – это всегда движение. Остановка смерти подобна

Наши авторы рассказывают о своем опыте и дают советы начинающим системным администраторам.

 Читать далее...

Виртуализация  

Рынок решений для виртуализации

По данным «Обзора российского рынка инфраструктурного ПО и перспектив его развития», сделанного

 Читать далее...

Книжная полка  

Как стать креативным и востребованным

Издательский дом «Питер» предлагает новинки компьютерной литературы, а также книги по бизнесу

 Читать далее...

Книжная полка  

От создания сайтов до разработки и реализации API

В издательстве «БХВ» недавно вышли книги, которые будут интересны системным администраторам, создателям

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 6227
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 6933
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

12.03.2018г.
Просмотров: 4216
Комментарии: 0
Глубокое обучение с точки зрения практика

 Читать далее...

12.03.2018г.
Просмотров: 3006
Комментарии: 0
Изучаем pandas

 Читать далее...

12.03.2018г.
Просмотров: 3807
Комментарии: 0
Программирование на языке Rust (Цветное издание)

 Читать далее...

19.12.2017г.
Просмотров: 3821
Комментарии: 0
Глубокое обучение

 Читать далее...

19.12.2017г.
Просмотров: 6316
Комментарии: 0
Анализ социальных медиа на Python

 Читать далее...

19.12.2017г.
Просмотров: 3170
Комментарии: 0
Основы блокчейна

 Читать далее...

19.12.2017г.
Просмотров: 3460
Комментарии: 0
Java 9. Полный обзор нововведений

 Читать далее...

16.02.2017г.
Просмотров: 7278
Комментарии: 0
Опоздавших не бывает, или книга о стеке

 Читать далее...

17.05.2016г.
Просмотров: 10646
Комментарии: 0
Теория вычислений для программистов

 Читать далее...

30.03.2015г.
Просмотров: 12365
Комментарии: 0
От математики к обобщенному программированию

 Читать далее...

18.02.2014г.
Просмотров: 13999
Комментарии: 0
Рецензия на книгу «Читаем Тьюринга»

 Читать далее...

13.02.2014г.
Просмотров: 9124
Комментарии: 0
Читайте, размышляйте, действуйте

 Читать далее...

12.02.2014г.
Просмотров: 7079
Комментарии: 0
Рисуем наши мысли

 Читать далее...

10.02.2014г.
Просмотров: 5388
Комментарии: 3
Страна в цифрах

 Читать далее...

18.12.2013г.
Просмотров: 4617
Комментарии: 0
Большие данные меняют нашу жизнь

 Читать далее...

18.12.2013г.
Просмотров: 3427
Комментарии: 0
Компьютерные технологии – корень зла для точки роста

 Читать далее...

04.12.2013г.
Просмотров: 3155
Комментарии: 0
Паутина в облаках

 Читать далее...

03.12.2013г.
Просмотров: 3402
Комментарии: 0
Рецензия на книгу «MongoDB в действии»

 Читать далее...

02.12.2013г.
Просмотров: 3025
Комментарии: 0
Не думай о минутах свысока

 Читать далее...

Друзья сайта  

 FAQ Perl

Архив номеров / 2002 / Выпуск №1 (1) / FAQ Perl

Рубрика: Администрирование /  Продукты и решения

ДМИТРИЙ ГОРЯИНОВ

FAQ Perl

По материалам www.xpoint.ru

Чем отличается синтаксис скриптов на UNIX- и WIN-платформах?

Юниксовые скрипты плохо воспринимает досовский перевод строки – CR LF. Если открыть такой файл в vi в конце строк будут ^M. Удалить их можно, например таким скриптом:

#!/bin/bash
install -d -m 0775 orig
cp $1 orig/$1.orig.“date +%m-%d-%H.%M“
sed -e "s/^M//g" $1 >oooo
mv -f oooo $1

Как мне получить зашифрованный пароль?

Стандартной функцией crypt(), например вот так:

# Calculate salt value for crypt function
@saltair= split //,"ABCDEFGHIJKLMNOPQRSTUVWXYZ abcedfghijklmnopqrstuvwxyz0123456789.";
sub get_salt {
  srand();
  $iOff = int(rand($#saltair));
  $iOff2 = int(rand($#saltair));
return join("",$saltair[$iOff],
$saltair[$iOff2]);
}
$crypted_passwd = crypt($plain_passwd,get_salt());

А как мне проверить соответствие введенного пароля зашифрованному?

Первых два символа пароля соджержат шифровальный ключ. Если, взяв их, зашифровать проверяемый пароль, то зашифрованные строки должны совпасть. Пример:

if (crypt($entered_passwd,
subst($crypted_passwd,0,2))
  eq $crypted_passwd) {
# Пароль верен
} else {
# Пароль не верен
}

Как сделать так, чтобы скрипт работал в фоновом режиме, как демон?

Варианта два. Первый – воспользоваться модулем Proc::Daemon, второй – сделать все самому, примерно так:

use strict;
require "sys/syscall.ph";
# Устанавливаем путь по умолчанию
$ENV{PATH} = "/bin:/usr/bin";
# Чисто для прикола
$0="mydaemon";
# Отделяемся от родителя
fork() && exit;
# Отключаемся от терминала
close STDOUT; close STDERR; close STDIN;
# Делаем корень текушим каталогом
chdir "/";
# Создаем новую сессию и становимся лидером группы процессов, чтоб нас случайно не прибили
syscall(&SYS_setsid);
# Перехватываем сигналы, для корректного выхода
$SIG{"INT"} = $SIG{"QUIT"} = $SIG{"TERM"} = "quit";
$SIG{"HUP"} = "ignore";
# Делаем наши темные дела
...
# Выходим
quit();
sub quit {
  # Помещаем сюда код для корректного прекращения работы
   ...
  exit(0);
}

Если вы хотите написать демона, реализующего работу через сеть, рекомендуем ознакомиться с модулем Net::Daemon.

Как защитить мою программу, чтобы никто не смог её прочитать?

Perl-сценарий представляет собой открыто распространяемый код.

Как сделать так, чтобы программа гарантированно работала только в одном экземпляре?

Способ первый, принятый в мире UNIX:

$pidfile = "/var/run/mydaemon.pid";

if (-e $pidfile) {
  # aha, pid file is here, but process could be dead
by now
  my $myfile=file_name($0);
  unless (open(PIDFILE,$pidfile)) {
    # too dangerous to start because I can’t read old
PID
    exit 1;
  }
  my $oldpid=;
  close PIDFILE;
  # see if there is a process with such pid
  if ($oldpid > 1 && kill(0,$oldpid)) {
    # another proccess is running already
    exit 1;
  } else {
    # that process is long dead
  }
}
# write pid file
open (PID, ">$pidfile") or die;
print PID $$;
close(PID);
# do some work
...
# remove pid file
unlink $pidfile;
exit(0);

Способ второй, основанный на блокировании файлов:

# make a lock
$lockfilename="/tmp/mydaemon.lock";
unless (open (LOCKFILE,">$lockfilename")) {
  die "cannot open lock file ";
}
unless (flock (LOCKFILE,LOCK_EX|LOCK_NB)){
  print "my copy is already running ";
  exit(0);
}
# do some work
...
# unlock lock file
close(LOCKFILE);
unlink($lockfilename);

Можно ли скомпилировать из Perl исполняемый файл?

Вы можете воспользоваться программой Perl2Exe. Это утилита для преобразования Perl-сценариев в выполняемые файлы, не требующие присутствия интерпретатора языка Perl.

Perl2Exe может сгенерировать модули для Win32 и многих клонов UNIX.

Perl2Exe также позволяет вам создавать не консольные программы, с использованием Tk.

http://www.indigostar.com/perl2exe.htm – разработчик IndigoSTAR Software.

Еще один продукт IndigoSTAR Software – SendMail for Windows(TM) – Windows версия популярной программы Unix Sendmail. Она позволяет отправлять сообщений из командной строки, CGI сценария или BAT-файла.

Proc::Background – Общий ли для UNIX и Win32 интерфейс управление фоновыми процессами?

Это общий интерфейс для управления фоновыми процессами как на UNIX, так и на Win32 платформах. Модуль позволяет вам запускать и завершать фоновые процессы, получать выходные данные и отслеживать состояние фоновых процессов.

P.S. Рекомендую при использовании под Win32 брать архив со CPAN и посмотреть прилагаемые примеры и скрипты.

Proc::Background – http://search.cpan.org/search?dist=Proc-Background.

Как можно стандартизировать (оформить в виде процедуры) получение выборки из БД, чтобы получать набор записей с именованными полями?

Это можно сделать так:

sub QueryArrayOfHashes

my ($DB, $query) = @_;
my ($result,$data_hash,@items,$key,
$val,%hash);
 $result = $DB->prepare($query);
 $result->execute or return;
 while ($data_hash=$result->fetchrow_hashref)
    %hash=%$data_hash;
    push @items,{%hash};
  }
  $result->finish;
  @items;
}

Комментарии:

  • $data_hash – ссылка на хэш;
  • %$data_hash == %{$data_hash} – получение самого хэша из ссылки;
  • {%hash} = разименованный хэш чтоб получился массив хэшей, а не просто один массив;
  • @items == return @items в данном случае.

Пример использования:

use DBI;
...
$dbh=DBI->connect("DBI:mysql:mysql:localhost", $user, $password, {RaiseError => 1})
or die "connecting : $DBI::errstr ";
@res = QueryArrayOfHashes($dbh, "select user, password from user");
for ($i=0; $i<=$#res; $i++) {
    print " [Record #$i]:: ";
    foreach $key (sort keys %{$res[$i]}) {
    # запись вида $a[1]{b} эквивалентна $a[1]->{b}
    print  $key, " ", $res[$i]{$key}, " ";   
}

$dbh->disconnect;

Как удалить дерево каталогов?

В «Perl Cookbook» by Tom Christiansen and Nathan Torkington, O’Reilly («Библиотека программиста: Perl», издательство «Питер»), приводится два примера рекурсивного удаления каталога вместе с его содержимым. В одном используется функция finddepth из модуля File::Find, во втором - функция rmtree из File::Path.

Вот еще один способ:

# в качестве параметров скрипт принимает список директорий для удаления
die "usage: $0 [ ... ] " unless @ARGV; 

foreach $path (@ARGV) {
  del_folder($path);
}
sub del_folder {
    my $dir=shift;
    return 0 unless $dir;
    my (@dirs,@files,$filename,
$newdir,$list);
    opendir(DIR,$dir) or (warn "Can’t rmdir $dir: $!" and return 0);
@dirs=grep {!(/^./) && -d "$dir/$_"} readdir(DIR);
    rewinddir(DIR);
    @files=grep {!(/^.(.)?$/) && -f "$dir/$_"}
    readdir(DIR);
closedir (DIR);
for $list(0..$#dirs) {
    $newdir=$dir."/".$dirs[$list];
    del_folder($newdir);
}
for $list(0..$#files) {
    $filename=$dir."/".$files[$list];
    unlink $filename or (warn "Can’t unlink $filename: $!" and next);
}
rmdir $dir or (warn "Can’t rmdir $dir: $!" and return 0);
return 1;
}


Комментарии отсутствуют

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-45
E-mail: sa@samag.ru