O SSH pode transferir dados através da tecnologia de criptografia de pacotes online usando SSH, todos os dados transmitidos podem ser criptografados. Mesmo que alguém intercepte os dados, nenhuma informação útil poderá ser obtida. Ao mesmo tempo, os dados são compactados, o que acelera bastante a velocidade de transmissão. Em suma, através do uso de SSH, a transmissão de dados pode ser garantida de forma relativamente segura e eficiente.
Porém, nem todo mundo sabe que o PHP pode se conectar ao SSH e executar comandos remotos, mas é muito útil. Como podemos aproveitar o PHP de muitas maneiras diferentes, ele possui muitas opções de configuração para controlar seu comportamento. Um grande conjunto de parâmetros opcionais permite que você use o PHP para diversos fins, mas também significa que a combinação desses parâmetros e a configuração do lado do servidor podem apresentar alguns problemas de segurança. O autor tem usado SSH em uma aplicação PHP CLI. Usei-o no cronjobs, mas no início não foi muito simples. O manual sobre o uso seguro das funções do Shell2 não é muito prático. O autor conduziu muitos experimentos antes de escrever este pequeno artigo hoje. Espero que, depois de lê-lo, você possa economizar algum tempo na configuração do PHP.
Neste artigo, preciso assumir que
o sistema operacional que você está executando é Debian/Ubuntu. Se você não estiver executando o Debian/Ubuntu, pode ser necessário substituir o conteúdo correspondente deste artigo pelo gerenciador de pacotes fornecido pela sua distribuição Linux.
Você está executando o PHP5. Se não estiver executando o PHP5, você pode usar o PHP4.
Você tem um conhecimento básico de PHP e administração de servidores.
Você já tem o PHP instalado.
Pré-requisitos
Pacotes de instalação
Primeiro, vamos instalar os seguintes pacotes:
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
A instalação está concluída e vá para a próxima etapa.
Compilar libssh2
Depois de baixar o Libssh2 do site sourceforge, precisamos compilá-lo, mas não se preocupe, você só precisa fazer o seguinte:
cd /usr/src
wget
// faça login em server1.example.com na porta 22
if ( !($con = ssh2_connect("server1.example.com", 22))){
echo "fail: incapaz de estabelecer conexãon";
else {
// tente autenticar com nome de usuário root, senha secretpassword
if(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "falha: não foi possível autenticarn";
else {
// tudo bem, entramos!
echo "ok: logado...n" ;
// executa um comando
if(!($stream = ssh2_exec($con, "ls -al" )) ){
echo "fail: incapaz de executar o comandon"
} else{
// coleta os dados retornados do comando
stream_set_blocking; ( $stream, true );
$data = "";
while( $buf = fread($stream,4096) ){
$data .= $buf
}
fclose($stream
}
}
Segundo método: Shell
Da mesma forma, você também pode escrever uma função ou classe para o código a seguir. No entanto, este artigo fornece apenas os conceitos básicos:
if (!function_exists("ssh2_connect")) die("function ssh2_connect does not exist")
// faça login em server1.example.com na porta 22
if(!($con = ssh2_connect ("server1.example.com", 22))){
echo "falha: não foi possível estabelecer conexãon";
else {
// tente autenticar com nome de usuário root, senha secretpassword
if(!ssh2_auth_password($con, "root ", "secretpassword")) {
echo "falha: não foi possível autenticarn";
else {
//
tudo bem, entramos!
echo "ok: logado...n";
shell
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "falha: não foi possível estabelecer o shelln"
} else{
stream_set_blocking( $shell, true ) ;
// / envia um comando
fwrite($shell,"ls -aln");
//
& coleta dados retornados
$
data = "";
){
$data .= $buf;
}
fclose($shell);
Dica
:
Às
vezes o servidor está ocupado ou ocorre um errode
conexão e não há dados no buffer e o script PHP irá parar de gerar. um comando (mesmo que o comando não seja concluído!) para coletar dados. Você pode fazer o seguinte para isso:
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
Agora, no seu loop que verifica constantemente o buffer, basta olhar para COMMAND_FINISHED. Porque então você sabe que tem todos os dados. Para evitar loops infinitos (loops infinitos), você pode usar um limite de tempo limite de 10 segundos:
$time_start = time();
$data = "";
while( true ){
$data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo
"
ok: comando finalizadon
"
;
de 10 segundos foi atingidon";
break;
}
}
No exemplo acima, é melhor definir stream_set_blocking como false.
Enviar arquivos via SSH
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
Caso não funcione corretamente,
verifique os seguintes aspectos:
Siga este artigo para verificar cada passo); da sua operação
No lado do servidor, "PasswordAuthentication yes" deve estar habilitado em sshd_config. O valor padrão na maioria dos servidores é sim, mas em alguns casos você pode precisar adicionar a seguinte linha ao arquivo para ativar esse recurso:
/etc/ssh/sshd_config:
# Mude para sim para ativar senhas de texto não criptografado em túnel
PasswordAuthentication yes
Se você fizer alterações, será necessário reiniciar o SSH:
/etc/init.d/ssh restart