Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2014, 14:06   #1
[MoNAMur]
читер
Форумчанин
 
Аватар для [MoNAMur]
 
Регистрация: 05.10.2009
Сообщений: 150
По умолчанию SSH авторизация по ключу

Доброго времени суток!
Давненько не посещал вас...

Появилась задача авторизоваться через ssh по ключу средствами php.

Почитал мануалы http://www.php.net/manual/ru/book.ssh2.php
Сгенерировал ключи, настроил авторизацию по ключу.
Попробовал из консоли - ssh root@server - сработало.

Дошло дело до php:
PHP код:
<?php
$server_ip 
'192.168.56.101';
$connection ssh2_connect($server_ip22, array('hostkey'=>'ssh-rsa'));
if (
$connection) {
    
$authorization ssh2_auth_pubkey_file($connection'root''/home/testuser/.ssh/id_rsa.pub''/home/testuser/.ssh/id_rsa');
    if (
$authorization) {
        echo 
'authorization success';
    }
    else {
        echo 
'authorization failed';
    }
}
?>
Если запустить скрипт из консоли php /var/www/testssh.php то авторизация проходит и вижу в консоли "authorization success".

Если запустить скрипт из браузера http://127.0.0.1/testssh.php то авторизация не проходит и вижу в окне браузера "authorization failed".

На сервере, где авторизуюсь по ключу смотрю логи sshd:
tail -f /var/log/secure
При успешной авторизации
Код:
May 20 13:08:35 Ast01 sshd[6870]: Accepted publickey for root from xxx.xxx.xxx.xxx port 59704 ssh2
May 20 13:08:35 Ast01 sshd[6870]: pam_unix(sshd:session): session opened for user root by (uid=0)
May 20 13:08:35 Ast01 sshd[6870]: Received disconnect from xxx.xxx.xxx.xxx: 11: PECL/ssh2 (http://pecl.php.net/packages/ssh2)
May 20 13:08:35 Ast01 sshd[6870]: pam_unix(sshd:session): session closed for user root
При неуспешной авторизации
Код:
May 20 13:07:58 Ast01 sshd[6848]: Received disconnect from xxx.xxx.xxx.xxx: 11: PECL/ssh2 (http://pecl.php.net/packages/ssh2)
Вопросы: что за странное поведение? где я накосячил? как правильно подобное реализовывать?
$me = $me == $me ? $me : $me;
[MoNAMur] вне форума Ответить с цитированием
Старый 24.05.2014, 08:49   #2
vasiatka
Пользователь
 
Аватар для vasiatka
 
Регистрация: 18.02.2014
Сообщений: 90
По умолчанию

Я делаю это примерно так:
PHP код:
  protected function _ssh2Connection()
  {
    if(
function_exists('ssh2_connect'))
    {
      
$this->connection ssh2_connect($this->server['host'], $this->server['port']);
      if(!
$this->connection)
        throw new 
Exception("No connection to the ssh server!");
      if(!
ssh2_auth_pubkey_file(
          
$this->connection$this->server['user'],
          
$this->server['key'] . '.pub',
          
$this->server['key'], $this->server['password']))
        throw new 
Exception("Public Key Authentication Failed!");
    }
    else
    {
      
$this->connection true;
    }
  }

 protected function 
_execCmdSshNoException($cmd, &$out='')
  {
    try
    {
      if(!
$this->connection)
        
$this->_ssh2Connection();
      
$out $this->_execCmdSsh($cmd);
      return 
true;
    }
    catch(
Exception $e)
    {
      
$this->errors[] = $e->getMessage();
      return 
false;
    }
  }

  protected function 
_execCmdSsh($cmd)
  {
    
$log '';
    if(!
$cmd)
      return;
    if(
function_exists('ssh2_exec'))
    {
      if(!
$this->connection)
        throw new 
Exception("No connection to the ssh server!");
      
$proc ssh2_exec($this->connection$cmd);
      if(
$proc == false)
        throw new 
Exception("Ssh command '$cmd' execution failed!");
      else
      {
        
$err_stream ssh2_fetch_stream($proc1);

        
stream_set_blocking($err_streamtrue);
        
stream_set_blocking($proctrue);

        
$err_log $this->_writeOutputInLog($err_stream"ssh-err@:~$ ".$cmd);
        
$log $this->_writeOutputInLog($proc"ssh-out@:~$ ".$cmd);

        if(
$err_log !== '')
          throw new 
Exception("Ssh command '$cmd' execution failed! Out: '$err_log'");
      }
    }
    else
    {
      
$this->_execCmd('ssh -i ' $this->server['key'] . " " $this->getRemoteUserWithHost() . " " $cmd);
    }

    return 
$log;
  }

  protected function 
_execCmd($cmd$log_file null)
  {
    if(!
$cmd)
      return;

    
$proc popen("$cmd 2>&1"'r');

    
$log $this->_writeOutputInLog($proc$cmd$log_file);

    
$res pclose($proc);

    if(
$res != 0)
      throw new 
Exception("Command '$cmd' execution failed, return status is '$res'");

    return 
$log;
  } 
тут скопированы требуемые методы класса. Смысл недостающих методов должен быть понятен интуитивно.
В бинарной системе счет ведут не по пальцам, а по кулакам.
Пенза - мой город - я из Пензы.
vasiatka вне форума Ответить с цитированием
Старый 26.05.2014, 17:35   #3
[MoNAMur]
читер
Форумчанин
 
Аватар для [MoNAMur]
 
Регистрация: 05.10.2009
Сообщений: 150
По умолчанию

Не в коде проблема была) В правах и владельце файла с ключом.
Но все равно спасибо за ответ.
$me = $me == $me ? $me : $me;
[MoNAMur] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Связь по ключу viks1 БД в Delphi 4 07.05.2013 13:57
Удалить строку по id ключу... Tatiana_91 C/C++ Базы данных 3 15.02.2013 15:11
Совпадение по номеру (ключу) DJTreeno Microsoft Office Excel 31 07.12.2011 17:10
Поиск по ключу asd874 Помощь студентам 1 19.04.2010 00:02
Протокол SSH, клиенты SSH, как подключиться, как пользоваться Air Свободное общение 14 24.03.2010 00:31