2016-01-15 3 views
0

У меня есть магазин, имеющий около 10 компьютеров Mac. тока я в состоянии выключения/перезагрузки их удаленно с помощью функции PHP SSH2, используя этот кодЗапуск нескольких PHP-скриптов SSH2

<?php 
       include('Net/SSH2.php'); 

       $server = "hostname"; 
       $username = "user"; 
       $password = "pwd"; 
       $command = "sudo shutdown -r now"; 

       $ssh = new Net_SSH2($server); 
       if (!$ssh->login($username, $password)) { 
        exit('Login Failed'); 
       } 

       echo $ssh->exec($command); 
       echo "Sucessfully Restarted blah blah blah"; 
      ?> 

Но для того, чтобы выключения/перезагрузки 10 терминалов, я должен работать 10 различных сценария для достижения этой цели. Существуют ли какие-либо методы, когда я могу подключиться к нескольким серверам и выполнять одну и ту же команду?

+0

У вас есть список имен хостов и учетных данных? Вы можете сохранить их в массиве и пропустить через них, выдавая команду каждому хосту SSH. –

+0

Есть ли какой-нибудь сайт для посещения, чтобы помочь мне с массивом и петлей? Просто выучил php для вышеупомянутой функции. Не совсем уверен, что я должен искать! Спасибо :) – Cytan

+0

Голые со мной. Какую версию вы используете на PHP? –

ответ

0

Вы можете сохранить имена хостов и учетные данные в многомерном array. Это позволит вам перебирать каждый элемент с помощью foreach и выполнять требуемую команду на каждом хосте. Вот пример того, что вам нужно сделать:

<?php 
include('Net/SSH2.php'); 

$hosts = array(
    array(
     'hostname' => 'hostname1', 
     'username' => 'user1', 
     'password' => 'pwd1' 
    ), 
    array(
     'hostname' => 'hostname2', 
     'username' => 'user2', 
     'password' => 'pwd2' 
    ) 
); 

$command = "sudo shutdown -r now"; 

foreach ($hosts as $host) { 
    $ssh = new Net_SSH2($host['hostname']); 

    if (!$ssh->login($host['username'], $host['password'])) { 
     echo "Login Failed for host '{$host['hostname']}'\n"; 

     continue; 
    } 

    echo $ssh->exec($command); 
    echo "Sucessfully Restarted {$host['hostname']}\n"; 
} 

Надеюсь, это поможет.

В режиме безопасности: рекомендуется использовать ключи SSH, а не имена пользователей и пароли. Кроме того, убедитесь, что вы храните mac в сети, которая не открыта, например, для клиентов, вы должны использовать частную сеть.

+0

Большое спасибо! Я попробую это завтра, когда я вернусь в магазин :) Erm Я пробовал использовать SSH-ключи, я могу получить только один терминал. После генерации keygen я сделал это '' cat ~/.ssh/id_rsa.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" ' I может только успешно переносить публикацию на один хост, когда я пытался сделать это на другом хосте, он продолжал говорить, что id_rsa.pub не найден. :(Пробовал это с двумя серверами, но оба не удалось. Есть ли в любом случае я могу добавить его в свой thumbdrive и передать его вручную? :) – Cytan

+0

Ваши решения для массива работают! Большое спасибо :) – Cytan

+0

Возможно ли, чтобы каждый хост выдавал ошибку или успех переменной? так, например, позже на локальном сайте Я могу вызывать '$ host1status, $ host2status, $ host3status' и т. Д., И он вернет значение, было ли оно успешно введено в систему или нет. В настоящий момент все возвращается обратно в один кусок. n заранее! @Yottatron – Cytan

0

После некоторых проб и ошибок и попыток понять код. Я решил это с небольшой модификацией вашего кода. Добавлено еще одно «имя» в каждом массиве. Затем снимите эхо и замените его на переменную. Поэтому всякий раз, когда я хочу получить статус, я могу просто вызвать значение.

<?php 
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib'); 
include('Net/SSH2.php'); 

$hosts = array(
    array(
     'hostname' => 'hostname1', 
     'username' => 'user', 
     'password' => 'pwd', 
     'name' => '1sthost' 
    ), 
    array(
     'hostname' => 'hostname2', 
     'username' => 'user', 
     'password' => 'pwd', 
     'name' => '2ndhost' 
    ) 
); 

$command = "shutdown -r now"; 

foreach ($hosts as $host) { 
    $ssh = new Net_SSH2($host['hostname']); 

    if (!$ssh->login($host['username'], $host['password'])) { 
     $$host['name'] = "{$host['hostname']}\n failed"; 

     continue; 
    } 

    echo $ssh->exec($command); 
    $$host['name'] = "{$host['hostname']}\n success"; 

} 

?> 


<?php echo $1sthost; ?> 
<?php echo $2ndhost; ?> 
Смежные вопросы