Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск машин в сети  (Прочитано 18275 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« : 22-11-2006 07:35 » 

Может данный вопрос немного не в тему. Но он касается Perl-a.

Можно написать скрипт на Perl-e для нахождения всех доступных машин в локальной сети, а также открытых для записи папок на этих машинах?
Если да то подскажите в какую сторону надо начинать копать.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 22-11-2006 07:54 » 

Serg79, я так понимаю, речь идет о perl на винде? Быстрее всего  - об ActivePerl.

Думаю, нужно попробовать стандартные методы работы с директориями. Сам не пробовал.
Попробуй opendir() для '\\\\'.

Сообщи об результатах - это интересно!

/offtopic: пора сделать раздел Perl...
« Последнее редактирование: 15-12-2007 16:44 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 22-11-2006 08:55 » 

Да именно ActivePerl Улыбаюсь

Прежде чем что то открывать "opendir() надо знать имя ресурса.
Вот и требуется сначало определить, пресутствуют ли в сети машины. Если да, то какие у них имена. Ну и в конце, какие на этой машине есть открытые ресурсы. И уже в конце можно и opendir() использовать.

Задача скорее похожа на сканирование сети.
У меня есть такая мысль, если нам известна маска подсети и адрес шлюза, то впринципе мы можем перебрать весь диапазон адресов этой сети исключая шлюз.  Здесь была моя ладья... Может можно что-то попроще придумать?  Не понял
Записан
PooH
Глобальный модератор

ru
Offline Offline
Пол: Мужской
... и можно без хлеба!


« Ответ #3 : 22-11-2006 09:28 » 

 А результат
Код:
c:\>net view
никак нельзя использовать? (ActivePerl-а воообще не знаю и не видел)
Записан

Удачного всем кодинга! -=x[PooH]x=-
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 22-11-2006 09:34 » 

Посмотри это:
http://www.cpan.org/modules/by-category/22_Microsoft_Windows_Modules/Win32/
http://www.cpan.org/modules/by-category/22_Microsoft_Windows_Modules/Win32/Win32-NetName-0.3.readme


Добавлено через 1 минуту и 26 секунд:
PooH, ActivePerl отличается только малым количеством базовых пакетов.
« Последнее редактирование: 22-11-2006 09:36 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 22-11-2006 10:36 » 

Спасибо RXL, толкнул в нужном направлении.
Вот вроде бы то что мне нужно: http://search.cpan.org/~jdb/libwin32-0.26/NetResource/NetResource.pm

Добавлено через 7 дней, 1 час, 16 минут и 4 секунды:
PooH, ты прав. Можно действительно рулить net view.

Получаем все рабочие группы:
net view /domain

Получаем все машины в рабочей группе:
net view /domain:[имя_рабочей_группы]

Получаем все доступные ресурсы на машине:
net view [\\имя_машины]

Спасибо всем. Улыбаюсь

Добавлено через 6 дней, 23 часа и 37 минут:
Здесь такая жо.., у меня уже крышу начинает сносить от этого  С ума сойти...
Есть такой скрипт:
Код:
#!perl

use strict;
use Win32::NetResource qw(:DEFAULT GetSharedResources);

my (@domain,@komp);

#
# получаем все рабочие группы в сети
#
do
{
    my $list = `net view /domain`;
    my @temp = split /\n/, $list;
    push @domain, $temp[$_] for ( 3 .. $#temp - 1 );
};

#
# вот этот код отлично показывает все рабочие группы
#
#foreach my $temp (@domain) { print "$temp\n"; }
#

#
# Вот здесь самое интересное.......
# Находим все открытые папки на машинах
#
foreach my $temp (@domain) {
    if( GetSharedResources(my $resources, RESOURCETYPE_ANY,{ RemoteName => $temp }) ) {
        foreach my $href (@$resources) {
            push @komp, $href->{RemoteName} if $href->{Usage} == ESOURCEUSAGE_CONNECTABLE;
        }
    }
}

#
# а вот этот код уже не хочет показывать открытые папки
#
#foreach my $temp (@domain) { print "$temp\n"; }
#
Все проблемы вот в этом месте:
Код:
GetSharedResources(my $resources, RESOURCETYPE_ANY,{ RemoteName => $temp })
Я для эксперемента написал вот так:
Код:
...
...
...
@domain = ( "WORK1", "WORK2" );
foreach my $temp (@domain) {
    if( GetSharedResources(my $resources, RESOURCETYPE_ANY,{ RemoteName => $temp }) ) {
...
...
...
И все работает нормально.

Как мне лечить эту беду, может кто знает ? ? ?
« Последнее редактирование: 29-11-2006 11:52 от Serg79 » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 29-11-2006 13:03 » 

Цитата
#
# а вот этот код уже не хочет показывать открытые папки
#
#foreach my $temp (@domain) { print "$temp\n"; }
#

Нестыковочка...


У меня ни ActivePerl нет, ни пакета Win32::NetResource - проверить не могу.
Если не секрет, выложи результаты:

print "\"", join("\"\n\"", @domain), "\"\n";

print "\"", join("\"\n\"", @komp), "\"\n";
« Последнее редактирование: 29-11-2006 13:08 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 30-11-2006 05:39 » 

Да RXL, ты прав.  Да-да Мне тажа мысль пришла когда я домой ехал.  Улыбаюсь

Все дело в пробельных символах. Оказывается как просто забыть, что строка может быть и такой "WORK1\t\t", хотя в консоле ее видишь как "WORK1".
Потправил код:
Код:
#
# получаем все рабочие группы в сети
#
do
{
    my $list = `net view /domain`;
    my @temp = split /\n/, $list;
    for my $i ( 3 .. $#temp - 1 ) {
        $temp[$i] =~ s/\s//g;
        push @domain, $temp[$i];
    }
};
И все заработало как часики.

А в нестыковочках виноват Copy - Paste  Да-да
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 30-11-2006 08:04 » 

Serg79, нет, еще не все.
Цитата
$temp[$i] =~ s/\s//g;
Эта строчка удалит все пробельные символы, а не до+после имени.

Как я бы написал:
Код: (Perl)
open IN, "net view /domain|" or die "Don't run 'net' command!";
my @domain = ();
while (<IN>)
{
        s/^\s*|\s*$//;
        push @domain, $_;
}
close IN;

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

Ээээ... Я не учел, что вывод начинается с четвертой строки. Это можно исправить добавив после цикла обрезание массива.
« Последнее редактирование: 15-12-2007 16:45 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 30-11-2006 08:26 » 

Код:
open IN, "net view /domain|"
Интересная конструкция, я не знал что так можно вызывать программы. Я так понимаю весь результат отправленный в STDOUT прогой net view /domain| будет занесен в IN. Еще что меня интересует, данный вызов также записывает код возврата программы в переменную '$?' или нет? И еще, обязательно надо дабавлять вертикальный слеш '|' в конце передоваемой строки "net view /domain|" или нет?
« Последнее редактирование: 15-12-2007 16:45 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 30-11-2006 09:17 » 

Serg79, ну, теперь не могу не порекомендовать литературку: O'Reilly, Programming Perl. Я пользуюсь переведенным изданием от Символ (Программирование на Perl), третье издание, 1152стр. Это лучшая книга по Perl-у. Где-то на сайте O'Reilly можно найти английский pdf.

Не "занесен" в IN - это FILEHANDLE, а не массив.

Возвращаемое значение помещается в $?, ошибка ОС (если была) - в $!.

Если ты не указываешь режим открытия, то по умолчанию это чтение. Ну и зачем тебе чтение неведомого файла 'domain' в поддиректории 'net view'?

"Прямая косая" - это новое слово Ага Предлагаю: "вертикальная черта".
« Последнее редактирование: 15-12-2007 16:46 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 30-11-2006 10:17 » new

Попробовал, работает. И обрабатывать потом намного проще и наглядне.  Улыбаюсь
Спосибо, теперь буду знать.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines