Как постоянно пинговать IP-адрес, используя PHP [duplicate]

Также вы можете изменить принятый ответ отсюда: Аутентификация с Active Directory с Java на Linux со следующим:

String group="name of the group";
Iterator ig = groups.iterator();
Boolean bool=false;
while (ig.hasNext()) {
      String a=ig.next().toString();
      if (a.equals(group)) { 
                JOptionPane.showMessageDialog(this, "Authentication succeeded!");   
                bool=true;
                // here you can do smth in case of success  
      }
}
if (bool==false){
             JOptionPane.showMessageDialog(this, "Permission denied");   
}

34
задан TRiG 14 July 2016 в 17:21
поделиться

9 ответов

59
ответ дан Community 15 August 2018 в 17:26
поделиться

Попробуйте следующее:

echo exec('ping -n 1 -w 1 72.10.169.28');
3
ответ дан David Bélanger 15 August 2018 в 17:26
поделиться
  • 1
    exec является опасной функцией и должен быть отключен по умолчанию в вашем php.ini. – markus 23 March 2012 в 17:18
  • 2
    как насчет порта, куда я его положу – user1288533 23 March 2012 в 17:19
  • 3
    @ markus-tharkun Согласен. Но его можно защитить. Если вы просто используете ввод, такой как IP, преобразовываете IP в int и т. Д. И проверяете его, но да, это правда. – David Bélanger 23 March 2012 в 17:23
  • 4
    Но для этой задачи вам не нужен exec. – markus 23 March 2012 в 17:25
  • 5
    @markus, что делает его опасным? или ТОЛЬКО это, если вы передаете пользовательский ввод в exec? – Brandito 19 July 2018 в 04:29

Проверить различные порты:

$wait = 1; // wait Timeout In Seconds
$host = 'example.com';
$ports = [
    'http'  => 80,
    'https' => 443,
    'ftp'   => 21,
];

foreach ($ports as $key => $port) {
    $fp = @fsockopen($host, $port, $errCode, $errStr, $wait);
    echo "Ping $host:$port ($key) ==> ";
    if ($fp) {
        echo 'SUCCESS';
        fclose($fp);
    } else {
        echo "ERROR: $errCode - $errStr";
    }
    echo PHP_EOL;
}


// Ping example.com:80 (http) ==> SUCCESS
// Ping example.com:443 (https) ==> SUCCESS
// Ping example.com:21 (ftp) ==> ERROR: 110 - Connection timed out
2
ответ дан Geo 15 August 2018 в 17:26
поделиться

Вы можете использовать функцию exec

 exec("ping ".$ip);

здесь пример

-1
ответ дан Jackie 15 August 2018 в 17:26
поделиться
  • 1
    exec является опасной функцией и должен быть отключен по умолчанию в вашем php.ini. – markus 23 March 2012 в 17:17
  • 2
    вы правы, но много раз exec - это простой способ решения проблем: D. Конечно, я должен контролировать и дезинфицировать все, что я буду использовать в функции exec. – Jackie 23 March 2012 в 18:04
  • 3
    exec опасен только в том случае, если вы достаточно сумасшедший, чтобы слепо бросить вход пользователя туда – Kenneth Wilke 23 October 2014 в 02:36

Если вы хотите отправить ICMP-пакеты в php, вы можете взглянуть на эту реализацию PHP-протокола Native-PHP ICMP , но я ее не тестировал.

0
ответ дан jcubic 15 August 2018 в 17:26
поделиться

socket_create должен запускаться как root в системе UNIX с:

$socket = socket_create(AF_UNIX, SOCK_STREAM, 0);
0
ответ дан kleopatra 15 August 2018 в 17:26
поделиться

Для этого вам не нужны хакеры exec или shell_exec, это можно сделать на PHP. Книга «Вы хотите сделать ЧТО с PHP?»

Он использует сокеты и функцию pack(), которая позволяет читать и записывать двоичные протоколы. Вам нужно создать пакет ICMP, который вы можете сделать, используя формат CCnnnA * для создания вашего пакета.

2
ответ дан markus 15 August 2018 в 17:26
поделиться
  • 1
    Существует целая куча предложений по созданию пинга через socket_create в PHP сокет-создать справочные страницы пользователя . Однако для его запуска требуются права root в linux. – icc97 16 April 2013 в 15:35
  • 2
    ОДНА БОЛЬШОЕ ПРИМЕЧАНИЕ. чтобы иметь возможность создавать ICMP-пакет в Linux, вам необходимо работать с RAW-сокетами и пакетами, для которых требуется административный предел. это означает, что вам нужно запустить apache как root, чтобы это можно было сделать! , тогда это безопаснее, чем просто exec! – Ronan Dejhero 23 April 2013 в 05:24
function ping($ip){
    $output = shell_exec("ping $ip");
    var_dump($output);
}
ping('127.0.0.1');

UPDATE: если вы передаете жестко закодированный IP-адрес (например, в этом примере и большинстве реальных сценариев), этой функции может быть достаточно.

Но, поскольку некоторые пользователи, похоже, очень обеспокоены безопасностью, напомните, чтобы никогда не передавать пользовательские входы в функцию shell_exec: если IP-адрес поступает из ненадежного источника, по крайней мере, проверьте его с фильтром перед его использованием.

2
ответ дан T30 15 August 2018 в 17:26
поделиться
  • 1
    Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объяснив, как он работает и когда его использовать. Ответы только на код не полезны в долгосрочной перспективе. – Bono 23 April 2016 в 14:04
  • 2
    Небезопасный переход IP не проверен в shell_exec .. – PodTech.io 9 May 2016 в 16:17
  • 3
    Спасибо. Имо-безопасность зависит от контекста: конечно, рекомендуется всегда проверять входные данные, но это не тема. Здесь я хочу предоставить простейший код, который может ответить на вопрос. В любом случае, любое предложение / изменение приветствуется! – T30 9 May 2016 в 16:30
  • 4
    Ну, мне это нравится! Простой и точный. Делает то, что задает вопрос. Поместите IP-адрес и получите выход! – Adsy2010 7 June 2017 в 09:22
  • 5
    @ Adsy2010, так что вы знаете, что произойдет, если мой $ ip $ip = "-n 1 -w 1 localhost; rm -rf /home/;" в этом случае? – Richard Rodriguez 25 March 2018 в 22:46

В случае, если OP действительно хочет ICMP-Ping, есть некоторые предложения в пользовательских примечаниях к socket_create() [link] , в которых используются сырые сокеты. Имейте в виду, что в UNIX-подобных системах необходим root-доступ.

Обновление: обратите внимание, что аргумент usec не имеет функции в окнах. Минимальный тайм-аут составляет 1 секунду.

В любом случае, это код верхней проголосовавшей функции ping:

function ping($host, $timeout = 1) {
    /* ICMP ping packet with a pre-calculated checksum */
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
    $socket  = socket_create(AF_INET, SOCK_RAW, 1);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
    socket_connect($socket, $host, null);
    $ts = microtime(true);
    socket_send($socket, $package, strLen($package), 0);
    if (socket_read($socket, 255)) {
        $result = microtime(true) - $ts;
    } else {
        $result = false;
    }
    socket_close($socket);
    return $result;
}
14
ответ дан user1931751 15 August 2018 в 17:26
поделиться
  • 1
    OP явно заявляет, что хочет использовать порт – icc97 12 November 2013 в 14:18
  • 2
    изменил пакет $ var на $ package = & quot; \ x08 \ x00 \ x19 \ x2f \ x00 \ x00 \ x00 \ x00 \ x70 \ x69 \ x6e \ x67 & quot ;; получил лучшие результаты в окнах, когда время ожидания IP. Это было из документации по вашей ссылке. благодаря – PodTech.io 9 May 2016 в 16:35
Другие вопросы по тегам:

Похожие вопросы: