SSH puede transferir datos a través de la tecnología de cifrado de paquetes en línea; utilizando SSH, todos los datos transmitidos se pueden cifrar. Incluso si alguien intercepta los datos, no se puede obtener información útil. Al mismo tiempo, los datos se comprimen, lo que acelera enormemente la velocidad de transmisión. En resumen, mediante el uso de SSH, se puede garantizar que la transmisión de datos sea relativamente segura y eficiente.
Sin embargo, no todo el mundo sabe que PHP puede conectarse a SSH y ejecutar comandos remotos, pero es muy útil. Dado que podemos aprovechar PHP de tantas maneras diferentes, tiene muchas opciones de configuración para controlar su comportamiento. Un gran conjunto de parámetros opcionales le permite usar PHP para muchos propósitos diferentes, pero también significa que la combinación de estos parámetros y la configuración del lado del servidor puede introducir algunos problemas de seguridad. El autor ha estado usando SSH en una aplicación PHP CLI. Lo usé desde cronjobs, pero al principio no fue muy simple. Se puede decir que fue bastante difícil. El manual sobre el uso seguro de las funciones de Shell2 no es muy práctico. El autor realizó muchos experimentos antes de publicar este pequeño artículo de hoy. Espero que después de leerlo pueda ahorrarle algo de tiempo en la configuración de PHP.
En este artículo, debo asumir que
el sistema operativo que está ejecutando es Debian/Ubuntu. Si no está ejecutando Debian/Ubuntu, es posible que deba reemplazar el contenido correspondiente de este artículo con el administrador de paquetes proporcionado por su distribución de Linux.
Estás ejecutando PHP5. Si no estás ejecutando PHP5, puedes usar PHP4 en su lugar.
Tienes conocimientos básicos de PHP y administración de servidores.
Ya tienes PHP instalado.
Requisitos previos
Paquetes de instalación
Primero, instalemos los siguientes paquetes:
sudo aptitude update
sudo aptitude install php5-dev php5-cli php-pear buid-essential
openssl-dev zlib1g-dev
La instalación está completa y vaya al siguiente paso.
Compilar libssh2
Después de descargar Libssh2 del sitio web de sourceforge, necesitamos compilarlo, pero no te preocupes, solo necesitas hacer lo siguiente:
cd /usr/src
wget
// inicia sesión en server1.example.com en el puerto 22
si ( !($con = ssh2_connect("server1.example.com", 22))){
echo "fallo: no se puede establecer la conexiónn";
else {
// intenta autenticarse con el nombre de usuario raíz, contraseña contraseña secreta
if(! ssh2_auth_password ($con, "root", "secretpassword")) {
echo "fail: no se puede autenticarn";
else {
// ¡bien, ya estamos!
echo "ok: iniciado sesión...n" ;
// ejecuta un comando
if(!($stream = ssh2_exec($con, "ls -al")) ){
echo "fail: no se puede ejecutar el comandon"
} else{
// recopila los datos devueltos del comando
stream_set_blocking; ( $flujo, verdadero );
$datos = "";
mientras( $buf = fread($flujo,4096) ){
$datos .= $buf
}
fclose($flujo
}
}
Segundo método: Shell
De la misma manera, también puedes escribir una función o una clase para el siguiente código. Sin embargo, este artículo solo proporciona los conceptos básicos:
if (!function_exists("ssh2_connect")) die("la función ssh2_connect no existe")
// inicia sesión en server1.example.com en el puerto 22
if(!($con = ssh2_connect ("server1.example.com", 22))){
echo "falla: no se puede establecer la conexiónn";
} else {
// intenta autenticarse con el nombre de usuario raíz, contraseña contraseña secreta
if(!ssh2_auth_password($con, "root ", "secretpassword")) {
echo "fail: no se puede autenticarn";
else {
// ¡bien, ya estamos!
echo "ok:iniciado
sesión...n";
shell
if (!($shell = ssh2_shell($con, 'vt102', null, 80, 40, SSH2_TERM_UNIT_CHARS))){
echo "falla: no se puede establecer shelln"
} else{
stream_set_blocking( $shell, true ) ;
// envía un comando
fwrite($shell,"ls -aln");
sleep(
1);
// y recopila los datos devueltos
$data = "";
){
$data .= $buf;
}
fclose($shell);
}
}
}
Consejo:
A veces el servidor está ocupado o se produce un error de conexión y no hay datos en el búfer y el script PHP dejará de generarse. un comando (¡incluso si el comando no se completa!) para recopilar datos. Puede hacer lo siguiente para esto:
ssh2_exec($con, 'ls -al; echo "__COMMAND_FINISHED__"' );
Ahora, en su bucle que verifica constantemente el búfer, solo mire COMMAND_FINISHED. Porque entonces sabes que tienes todos los datos. Para evitar bucles infinitos (bucles infinitos), puede utilizar un límite de tiempo de espera de 10 segundos:
$time_start = time();
$data = ""
while( true ){
$data .= fread($stream, 4096) ;
if( strpos($data,"__COMMAND_FINISHED__") !== false){
echo "ok: comando finalizadon";
break
}
if( (time()-$time_start) > 10 ){
echo "fail: tiempo de espera Se ha alcanzado el límite de 10 segundosn";
break;
}
}
En el ejemplo anterior, será mejor que establezcas stream_set_blocking en false.
Enviar archivos a través de SSH
ssh2_scp_send($con, "/tmp/source.dat", "/tmp/dest.dat", 0644);
Si no funciona correctamente,
verifique los siguientes aspectos:
Siga este artículo para verificar cada paso. de su operación
En el lado del servidor, "PasswordAuthentication sí" debe estar habilitado en sshd_config. El valor predeterminado en la mayoría de los servidores es sí, pero en algunos casos es posible que necesite agregar la siguiente línea al archivo para activar esta función usted mismo:
/etc/ssh/sshd_config:
# Cambie a yes para habilitar contraseñas de texto sin cifrar tunelizadas
PasswordAuthentication yes
Si realiza cambios, debe reiniciar SSH:
/etc/init.d/ssh restart