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


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

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

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

Оффлайн lexasub

  • Автор темы
  • Новичок
  • *
  • Сообщений: 34
    • Просмотр профиля
Bash: Создать многопоточный ping
« : 19 Январь 2017, 08:31:43 »
Вылетает ошибка. Помогите решить
Код: HTML5
  1. строка 14: ((:
  2.         from=atoi 192.168.1.1
  3.         to=atoi 300.1.1.1
  4.         for (( i= ; i<=; i++)); do
  5.         ((
  6.                 tmp=itoa
  7.                 #thping
  8.         ))
  9.  
  10. : синтаксическая ошибка в выражение (ошибочная метка "192.168.1.1
  11.         to=atoi 300.1.1.1
  12.         for (( i= ; i<=; i++)); do
  13.         ((
  14.                 tmp=itoa
  15.                 #thping
  16.         ))
  17. ")

Код: Bash
  1. #!/bin/bash
  2.  
  3.  
  4. function pinger
  5. ((
  6.         from=atoi $1
  7.         to=atoi $2
  8.         for (( i=$from ; i<=$to; i++)); do
  9.         ((
  10.                 tmp=itoa $i
  11.                 #thping $tmp
  12.         ))
  13.  
  14. ))
  15. function thping
  16. ((
  17.                 #$[$1]
  18.         echo 'hi';
  19. ))
  20. function atoi
  21. ((i++
  22. IP=$1; IPNUM=0
  23. for (( i=0 ; i<4 ; ++i )); do
  24. ((IPNUM+=${IP%%.*}*$((256**$((3-${i}))))))
  25. IP=${IP#*.}
  26. done
  27. echo $IPNUM
  28. ))
  29.  
  30. function itoa
  31. ((
  32. echo -n $(($(($(($((${1}/256))/256))/256))%256)).
  33. echo -n $(($(($((${1}/256))/256))%256)).
  34. echo -n $(($((${1}/256))%256)).
  35. echo $((${1}%256))
  36. ))
  37. #//////////////////////////////////
  38. mode=$1
  39. mode1="ping"
  40. if [ "$mode" = "$mode1" ];then
  41.         pinger $2 $3
  42.        
  43.  
  44. fi


Пользователь добавил сообщение 19 Январь 2017, 09:00:16:
А вообще задача состоит в многопоточном пинге ip's
Код: Bash
  1. #!/bin/bash
  2.  
  3. function atoi
  4. ((i++
  5. IP=$1; IPNUM=0
  6. for (( i=0 ; i<4 ; ++i )); do
  7. ((IPNUM+=${IP%%.*}*$((256**$((3-${i}))))))
  8. IP=${IP#*.}
  9. doneIPNUM
  10. echo $IPNUM
  11. ))
  12.  
  13. function itoa
  14. ((
  15. echo -n $(($(($(($((${1}/256))/256))/256))%256)).
  16. echo -n $(($(($((${1}/256))/256))%256)).
  17. echo -n $(($((${1}/256))%256)).
  18. echo $((${1}%256))
  19. ))
  20. function pinger
  21. ((
  22.         from=atoi ${1}
  23.         to=atoi ${2}
  24.         for (( i=$from ; i<=$to; i++)); do
  25.         ((
  26.                 tmp=itoa $i
  27.                 thping $tmp
  28.         ))
  29.  
  30. ))
  31. function thping #если вызываем данную функцию, то она открывает поток, в котором запускает пинг и записывает в файл
  32. ((
  33. //хз
  34.         echo "ping $1 -c 1 -s 3>//как записать в бд ip если пинг прошел?"
  35.         #$tmp=ip
  36.         #echo 'mysql -D ping -u root -p root -e "[INSERT INTO `ping`(`ip_address`) VALUES (`"'$tmp'"`)]"'
  37. //хз
  38. ))
  39.  
  40. #//////////////////////////////////
  41. mode=$1
  42. mode1="ping"
  43. if [ "$mode" = "$mode1" ];then
  44.         pinger $2 $3
  45. fi
« Последнее редактирование: 19 Январь 2017, 10:33:28 от Azure »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • 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

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • 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

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Bash: Создать многопоточный ping
« Ответ #5 : 19 Январь 2017, 16:46:19 »
Код: Perl
  1. #!/usr/bin/perl -w
  2.  
  3. use Net::IP;
  4. use Net::Ping;
  5.  
  6. my ($ip1, $ip2) = @ARGV;
  7. my $timeout = 1;
  8. my $ip = new Net::IP ("$ip1 - $ip2") || die;
  9. my $ping = new Net::Ping ("icmp") || die;
  10.  
  11. do {
  12.     if ( $ping->ping($ip->ip(), $timeout) ) {
  13.         print $ip->ip(), "\n";      
  14.     }
  15. } while (++$ip);
  16.  
  17. $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

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 6015
  • 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.147 секунд. Запросов: 22.