Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Bash: Создать многопоточный ping  (Прочитано 1313 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн lexasub

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Bash: Создать многопоточный ping
« : 19 Января 2017, 08:31:43 »
Вылетает ошибка. Помогите решить
Код: (html5) [Выделить]
строка 14: ((:
from=atoi 192.168.1.1
to=atoi 300.1.1.1
for (( i= ; i<=; i++)); do
((
tmp=itoa
#thping
))

: синтаксическая ошибка в выражение (ошибочная метка "192.168.1.1
to=atoi 300.1.1.1
for (( i= ; i<=; i++)); do
((
tmp=itoa
#thping
))

")

Код: (bash) [Выделить]
#!/bin/bash


function pinger
((
from=atoi $1
to=atoi $2
for (( i=$from ; i<=$to; i++)); do
((
tmp=itoa $i
#thping $tmp
))

))
function thping
((
#$[$1]
echo 'hi';
))
function atoi
((i++
IP=$1; IPNUM=0
for (( i=0 ; i<4 ; ++i )); do
((IPNUM+=${IP%%.*}*$((256**$((3-${i}))))))
IP=${IP#*.}
done
echo $IPNUM
))

function itoa
((
echo -n $(($(($(($((${1}/256))/256))/256))%256)).
echo -n $(($(($((${1}/256))/256))%256)).
echo -n $(($((${1}/256))%256)).
echo $((${1}%256))
))
#//////////////////////////////////
mode=$1
mode1="ping"
if [ "$mode" = "$mode1" ];then
pinger $2 $3


fi


Пользователь добавил сообщение 19 Января 2017, 09:00:16:
А вообще задача состоит в многопоточном пинге ip's
Код: (bash) [Выделить]
#!/bin/bash

function atoi
((i++
IP=$1; IPNUM=0
for (( i=0 ; i<4 ; ++i )); do
((IPNUM+=${IP%%.*}*$((256**$((3-${i}))))))
IP=${IP#*.}
doneIPNUM
echo $IPNUM
))

function itoa
((
echo -n $(($(($(($((${1}/256))/256))/256))%256)).
echo -n $(($(($((${1}/256))/256))%256)).
echo -n $(($((${1}/256))%256)).
echo $((${1}%256))
))
function pinger
((
from=atoi ${1}
to=atoi ${2}
for (( i=$from ; i<=$to; i++)); do
((
tmp=itoa $i
thping $tmp
))

))
function thping #если вызываем данную функцию, то она открывает поток, в котором запускает пинг и записывает в файл
((
//хз
echo "ping $1 -c 1 -s 3>//как записать в бд ip если пинг прошел?"
#$tmp=ip
#echo 'mysql -D ping -u root -p root -e "[INSERT INTO `ping`(`ip_address`) VALUES (`"'$tmp'"`)]"'
//хз
))

#//////////////////////////////////
mode=$1
mode1="ping"
if [ "$mode" = "$mode1" ];then
pinger $2 $3
fi
« Последнее редактирование: 19 Января 2017, 10:33:28 от Azure »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #1 : 19 Января 2017, 10:45:57 »
1. Функции записываются в фигурных скобках {}, двойные простые (()) это арифметические вычисления.
2. Для присвоения переменной результата выполнения команды используют конструкцию variable=$(command_with/without_argument)
3. Видел я и более «кривые» коды, но Ваш тоже «хорош». Конкретно поставьте задачу, что надо делать (с базами, перебором и т.д.)
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн lexasub

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #2 : 19 Января 2017, 11:10:40 »
1. Функции записываются в фигурных скобках {}, двойные простые (()) это арифметические вычисления.
2. Для присвоения переменной результата выполнения команды используют конструкцию variable=$(command_with/without_argument)
3. Видел я и более «кривые» коды, но Ваш тоже «хорош». Конкретно поставьте задачу, что надо делать (с базами, перебором и т.д.)
Я с bash первый раз работаю(ничего не знаю)
А задача такая: ассинхронно пингуем диапазон ip(передаются в параметрах) и записываем в бд ip, которые получается пингануть

Пользователь добавил сообщение 19 Января 2017, 11:24:46:
Немного переделал, благодаря рекомендациям, но многопоточность не получается прилепить
#!/bin/bash

function atoi
{
i++
IP=$1; IPNUM=0
for (( i=0 ; i<4 ; ++i )); do
((IPNUM+=${IP%%.*}*$((256**$((3-${i}))))))
IP=${IP#*.}
doneIPNUM
echo $IPNUM
}

function itoa
{
echo -n $(($(($(($((${1}/256))/256))/256))%256)).
echo -n $(($(($((${1}/256))/256))%256)).
echo -n $(($((${1}/256))%256)).
echo $((${1}%256))
}
function pinger
{
from=$(atoi ${1})
to=$(atoi ${2})
for (( i=$from ; i<=$to; i++)); do
{
$(thping $(itoa $i))
}

}
function thping #должно быть: если вызываем данную функцию, то она открывает поток, в котором запускает пинг и записывает в файл
{
//хз
echo "ping $1 -c 1 -s 3>//как записать в бд ip если пинг прошел?"
#$tmp=ip
#echo 'mysql -D ping -u root -p root -e "[INSERT INTO `ping`(`ip_address`) VALUES (`"'$tmp'"`)]"'
//хз
}

#//////////////////////////////////
mode=$1
mode1="ping"
if [ "$mode" = "$mode1" ];then
pinger $2 $3


fi
« Последнее редактирование: 19 Января 2017, 11:28:38 от lexasub »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #3 : 19 Января 2017, 12:32:02 »
Не лучше воспользоваться nmap например?

Пользователь добавил сообщение 19 Января 2017, 12:35:29:
пингуем диапазон ip(передаются в параметрах)
Приведите пример что передаем и какой «диапазон» надо пропинговать.
записываем в бд ip
Что Вы подразумеваете под «БД» и в каком формате нужна запись(тоже пример).
« Последнее редактирование: 19 Января 2017, 12:35:29 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн lexasub

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #4 : 19 Января 2017, 13:50:56 »
nmap не пойдет. (почему-не хочу обьяснять)
./my.sh ping 192.1.1.1 200.1.1.1


Пользователь добавил сообщение 19 Января 2017, 14:15:18:
записываем в бд ip
Что Вы подразумеваете под «БД» и в каком формате нужна запись(тоже пример).
mysql вот таким способом:
echo 'mysql -D ping -u root -p root -e "[INSERT INTO `ping`(`ip_address`) VALUES (`"'$ip'"`)]"'
« Последнее редактирование: 19 Января 2017, 14:35:51 от lexasub »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #5 : 19 Января 2017, 16:46:19 »
Код: (perl) [Выделить]
#!/usr/bin/perl -w

use Net::IP;
use Net::Ping;

my ($ip1, $ip2) = @ARGV;
my $timeout = 1;
my $ip = new Net::IP ("$ip1 - $ip2") || die;
my $ping = new Net::Ping ("icmp") || die;

do {
    if ( $ping->ping($ip->ip(), $timeout) ) {
        print $ip->ip(), "\n";     
    }
} while (++$ip);

$ping->close();
« Последнее редактирование: 19 Января 2017, 16:49:50 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн lexasub

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #6 : 19 Января 2017, 16:57:20 »
А как параметры передавать?
« Последнее редактирование: 19 Января 2017, 17:01:48 от lexasub »

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #7 : 19 Января 2017, 17:01:54 »
perl не понимаю
А не надо понимать. Вы этот скрипт вызваете с 2 аргументами (./script_name.pl IP_address1 IP_address2) он Вам отдаст работающие адреса из диапазона.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн lexasub

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #8 : 19 Января 2017, 17:06:07 »
Спасибо огромное за скриптик, все работает.
Но все-таки нужна многопоточность


Пользователь добавил сообщение 19 Января 2017, 17:35:31:
Попробовал написать многопоточку,но
(Нажмите, чтобы показать/скрыть)

#!/usr/bin/perl -w
 
use Net::IP;
use Net::Ping;
use threads;

my ($ip1, $ip2) = @ARGV;
my $timeout = 1;
my $thread = "";
my $ip = new Net::IP ("$ip1 - $ip2") || die;
my $ping = new Net::Ping ("icmp") || die;

function job{
if ( $ping->ping($ip->ip(), $timeout) ) {
$db=Mysql->Connect("127.0.0.1","scaner","root","root");
$db->SelectDB("ping")->Query('INSERT INTO `ping`(`ip_address`) VALUES (`"'.$ip->ip().'"`)');
    }
}

do {
$thread=threads->create(\&job());
} while (++$ip);

foreach my $t (@threads) {
  $t->join();
}
$ping->close();
В perl я ничего не знаю, исправьте пожалуйста ошибочки

Пользователь добавил сообщение 19 Января 2017, 19:09:22:
Вот работающий многопоточный пингер:
#!/usr/bin/perl -w
 
use Net::IP;
use Net::Ping;
use threads;
use DBI;

my ($ip1, $ip2) = @ARGV;
my $timeout = 1;
my $thread = "";
my $ip = new Net::IP ("$ip1 - $ip2") || die;
my $ping = new Net::Ping ("icmp") || die;

sub job{
if ( $ping->ping($ip->ip(), $timeout) ) {
$db=DBI->connect("DBI:mysql:scaner:127.0.0.1","root","root");
$db->do('INSERT INTO `ping`(`ip_address`) VALUES ("'.$ip->ip().'")');
print($ip->ip);
    }
}

do {
$thread=threads->create(\&job)->join();
} while (++$ip);

$ping->close();

Пользователь добавил сообщение 20 Января 2017, 16:34:54:
Многопоточка в том примере не работала(оказывается). А в этом она работает, но в бд попадает только первый(в диапазоне)&пингующийся ip
#!/usr/bin/perl -w
 
use Net::IP;
use Net::Ping;
use threads;
use DBI;

my ($ip1, $ip2) = @ARGV;
my $ip = new Net::IP ("$ip1 - $ip2") || die;
my $ping = new Net::Ping ("icmp") || die;
my $timeout=1;
my @threads;

sub job{
if ( $ping->ping($ip->ip(), $timeout) ) {
my $db=DBI->connect("DBI:mysql:scaner:127.0.0.1","root","root");
$db->do('INSERT INTO `ping`(`ip`) VALUES ("'.$ip->ip().'")');
print($ip->ip()."\n");
    }
print("scaned: ".$ip->ip()."\n");
}


do {
push @threads,threads->create(\&job);#->join();
} while (++$ip);

foreach my $t (@threads) {
 $t->join();
}

$ping->close();
« Последнее редактирование: 20 Января 2017, 16:34:54 от lexasub »

 

Страница сгенерирована за 0.04 секунд. Запросов: 23.