Conexões SSH com PHP 
Felipe Weckx
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
2/15 
Agenda 
● Para que usar SSH no PHP? 
● Bibliotecas disponíveis 
● Métodos de autenticação 
● Execução de comandos 
● Transferência de arquivos
●Para que usar SSH no PHP? 
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
3/15 
● Automação! 
● Deploy 
● Levantamento de dados de servidores 
● Execução de rotinas de manutenção 
● Start/Stop de serviços 
● Monitoramento logs
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
4/15 
Bibliotecas Disponíveis 
● ext/ssh2 
– Extensão em C 
– Somente SSHv2 
– Utiliza libssh2 
– Instalação no 
servidor 
– Procedural 
● PHPSecLib 
– Totalmente em 
PHP 
– Suporte SSH v1 e 
v2 
– Fácil de embutir 
na aplicação 
– Orientada a 
Objetos
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
5/15 
Métodos de Autenticação 
● Password 
– Keyboard-interactive (>= 0.12) 
● Chave RSA 
– Com senha 
● Multi-fator 
● Sem autenticação
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
6/15 
Conectando e Autenticando 
$con = ssh2_connect('ssh.com', 22); 
//Autenticação por senha 
if (!ssh2_auth_password($con, 'user', 'pass') { 
die('Erro no login com senha') 
} 
//Autenticação por chave RSA 
if (!ssh2_auth_pubkey_file($con, 'user','id_rsa.pub', 'id_rsa', 
'secret')) { 
Die('Erro no login com chave'); 
}
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
7/15 
Executando Comandos 
$stream = ssh2_exec($con, $cmd); 
if (!$stream) { 
die('Erro ao executar comando'); 
} 
stream_set_blocking($stream, true); 
stream_set_timeout($stream, 15); 
$result = stream_get_contents($stream); 
fclose($stream);
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
8/15 
Considerações 
● ssh2_exec Executa um comando 
simples 
● Comandos interativos podem dar 
problema 
● Sempre defina o tempo de timeout
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
9/15 
Comandos interativos 
● Utilizar fwrite e fread 
● Enviar o comando com no final n 
● Ler e interpretar a resposta 
● Enviar próxima informação 
● PHPSecLib tem o método read que já 
suporta expressões regulares
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
10/15 
Comandos Interativos 
$ssh = new Net_SSH2($host); 
if (!$ssh->login($user, $pass)) { 
exit('Login Failed'); 
} 
//Aguarda o prompt 
$output = $ssh->read('$'); 
//Executa o comando com sudo 
$ssh->write("sudo ls -lan"); 
//Aguarda o prompt da senha e envia a senha 
$output .= $ssh->read('/[pP]assword[^:]*:/', NET_SSH2_READ_REGEX); 
$ssh->write("{$pass}n"); 
//Lê o restante até o próximo prompt 
$output .= $ssh->read('$');
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
11/15 
Transferindo Arquivos 
● ssh2_scp_send( 
$con, 
'/tmp/teste_local.txt', 
'/tmp/teste_remoto.txt); 
● ssh2_scp_recv( 
$con, 
'/tmp/teste_remoto.txt', 
'/tmp/teste_local.txt' 
);
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
12/15 
Laravel 
● Utiliza PHPSecLib 
● Classes de abstração 
– SSH::into('staging')->run(array( 
'cd /var/www', 
'git pull origin master', 
)); 
● Envoy Task Runner 
– @task('deploy', ['on' => ['web-1', 'web-2']]) 
cd site 
git pull origin {{ $branch }} 
php artisan migrate 
@endtask
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
13/15 
Segurança 
● Nunca manter username e senha no 
código fonte 
● Preferir uso de arquivos de chaves 
– Trocar as chaves periodicamente 
● Log de todas as operações
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
14/15 
Perguntas?
PHP Conference 2014 Conexões SSH com PHP 
Felipe Weckx 
15/15 
Obrigado 
Felipe Weckx 
felipe@weckx.net 
@weckx 
github.com/weckx 
linkedin.com/in/felipeweckx 
http://blog.weckx.net

Conexões SSH com PHP

  • 1.
    Conexões SSH comPHP Felipe Weckx
  • 2.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 2/15 Agenda ● Para que usar SSH no PHP? ● Bibliotecas disponíveis ● Métodos de autenticação ● Execução de comandos ● Transferência de arquivos
  • 3.
    ●Para que usarSSH no PHP? PHP Conference 2014 Conexões SSH com PHP Felipe Weckx 3/15 ● Automação! ● Deploy ● Levantamento de dados de servidores ● Execução de rotinas de manutenção ● Start/Stop de serviços ● Monitoramento logs
  • 4.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 4/15 Bibliotecas Disponíveis ● ext/ssh2 – Extensão em C – Somente SSHv2 – Utiliza libssh2 – Instalação no servidor – Procedural ● PHPSecLib – Totalmente em PHP – Suporte SSH v1 e v2 – Fácil de embutir na aplicação – Orientada a Objetos
  • 5.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 5/15 Métodos de Autenticação ● Password – Keyboard-interactive (>= 0.12) ● Chave RSA – Com senha ● Multi-fator ● Sem autenticação
  • 6.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 6/15 Conectando e Autenticando $con = ssh2_connect('ssh.com', 22); //Autenticação por senha if (!ssh2_auth_password($con, 'user', 'pass') { die('Erro no login com senha') } //Autenticação por chave RSA if (!ssh2_auth_pubkey_file($con, 'user','id_rsa.pub', 'id_rsa', 'secret')) { Die('Erro no login com chave'); }
  • 7.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 7/15 Executando Comandos $stream = ssh2_exec($con, $cmd); if (!$stream) { die('Erro ao executar comando'); } stream_set_blocking($stream, true); stream_set_timeout($stream, 15); $result = stream_get_contents($stream); fclose($stream);
  • 8.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 8/15 Considerações ● ssh2_exec Executa um comando simples ● Comandos interativos podem dar problema ● Sempre defina o tempo de timeout
  • 9.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 9/15 Comandos interativos ● Utilizar fwrite e fread ● Enviar o comando com no final n ● Ler e interpretar a resposta ● Enviar próxima informação ● PHPSecLib tem o método read que já suporta expressões regulares
  • 10.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 10/15 Comandos Interativos $ssh = new Net_SSH2($host); if (!$ssh->login($user, $pass)) { exit('Login Failed'); } //Aguarda o prompt $output = $ssh->read('$'); //Executa o comando com sudo $ssh->write("sudo ls -lan"); //Aguarda o prompt da senha e envia a senha $output .= $ssh->read('/[pP]assword[^:]*:/', NET_SSH2_READ_REGEX); $ssh->write("{$pass}n"); //Lê o restante até o próximo prompt $output .= $ssh->read('$');
  • 11.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 11/15 Transferindo Arquivos ● ssh2_scp_send( $con, '/tmp/teste_local.txt', '/tmp/teste_remoto.txt); ● ssh2_scp_recv( $con, '/tmp/teste_remoto.txt', '/tmp/teste_local.txt' );
  • 12.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 12/15 Laravel ● Utiliza PHPSecLib ● Classes de abstração – SSH::into('staging')->run(array( 'cd /var/www', 'git pull origin master', )); ● Envoy Task Runner – @task('deploy', ['on' => ['web-1', 'web-2']]) cd site git pull origin {{ $branch }} php artisan migrate @endtask
  • 13.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 13/15 Segurança ● Nunca manter username e senha no código fonte ● Preferir uso de arquivos de chaves – Trocar as chaves periodicamente ● Log de todas as operações
  • 14.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 14/15 Perguntas?
  • 15.
    PHP Conference 2014Conexões SSH com PHP Felipe Weckx 15/15 Obrigado Felipe Weckx felipe@weckx.net @weckx github.com/weckx linkedin.com/in/felipeweckx http://blog.weckx.net