Apresentação feita na PHP Conference 2014 sobre a utilização do PHP para conexões SSH com outros equipamentos. Comparação entre as bibliotecas disponíveis e casos de uso.
2. 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
3. ●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
4. 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
5. 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
6. 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');
}
7. 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);
8. 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
9. 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
10. 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('$');
12. 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
13. 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