SSH2 рдореЗрдВ php5 + рдорд┐рдХрд░реЛрдЯрд┐рдХ рд░рд╛рдЙрдЯрд░рдУрдПрд╕, рдиреБрдХрд╕рд╛рди

рдПрдХ рдХрд╛рд░реНрдп рдерд╛: рдПрдХ рд▓реВрдк рдореЗрдВ, php5 рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЧреЛ ssh рд╕реЗ рдорд┐рдХрд░реЛрдЯрд┐рдХ рддрдХ, рд╡рд░реНрддрдорд╛рди рдХреЙрдиреНрдлрд┐рдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдХреБрдЫ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдкрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрдард╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП ~ 500 рд░реВрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдПред рдЪреВрдВрдХрд┐ рдкреНрд░рджрд╛рддрд╛ рд╣рд▓рдХреЛрдВ рдореЗрдВ рдорд┐рдХрд░реЛрдЯрд┐рдХ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирд╡рд░ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИред



рдЪреВрдБрдХрд┐ рдореБрдЭреЗ рдорд╛рдЗрдХреНрд░реЛрдЯрд┐рдХреНрд╕ рдкрд░, рдкреАрд╕реА рдореЗрдВ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ ssh2 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛ рдЬреНрдЮрд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рдордп рдмрд╣реБрдд рд╕реАрдорд┐рдд рд╣реИ, рдореИрдВрдиреЗ рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рд▓рд╛рд▓рд┐рддреНрдп" рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХреАред



рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдерд╛:

1. ssh2_exec рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (!) рдЬрд╡рд╛рдм рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдпрдерд╛ рдХрдорд╛рдВрдб рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (PHP рдореИрдиреБрдЕрд▓ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЦреЛрджрд╛ рдЧрдпрд╛, рдПрдХ рд╢рдмреНрдж рд▓рд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддреИрдпрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдерд╛)ред рдпрджрд┐ рд╣рд╛рдВ, рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрдлрд░рд┐рдВрдЧ рд╣реИред

2. рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдорд┐рдХрд░реЛрдЯрд┐рдХ рдХреЗрд╡рд▓ рдПрдХ рдЕрдиреБрд░реЛрдз (ssh2_exec, ssh2_shell, рдЖрджрд┐) рдХреЛ рдкрдЪрд╛рддрд╛ рд╣реИред рдпрджрд┐, ssh2_exec рдХреЗ рдмрд╛рдж, рдЖрдк рдПрдХ рджреВрд╕рд░реЗ ssh2_exec рдпрд╛ ssh2_shell, рдпрд╛ ssh2_sftp рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рд╕рддреНрд░ (рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ!) "рд╕реНрдЯрд┐рдХреНрд╕" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ (рдореИрдВ 5 рдорд┐рдирдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛)ред

3. рдпрджрд┐ рдЖрдк ssh2_shell рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рд╢реЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рд╕рд╛рд░реНрдердХ рд░реВрдк рд╕реЗ "рд╕рдВрд╡рд╛рдж" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП - рдорд┐рдХреНрд░реЛрдЯрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реИ, рд▓реЗрдХрд┐рди рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╣ рдордЬрд╝реЗрджрд╛рд░ рдФрд░ рдЙрджрд╛рд░рддрд╛ рд╕реЗ рд░рдВрдЧ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕реНрдкреИрдо рдХрд░рддрд╛ рд╣реИ (рдЬреЛ рддрдм рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм ssh2_exec рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЬреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реА рд╣реИ ssh2 рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЖрдЧреЗ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЪреИрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрд╣реБрдд рдХрдо рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдмрдирд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред

4. ssh2 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ NO ssh2_disconnect рдлрдВрдХреНрд╢рди рд╣реИ, рдмреЗрд╢рдХ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦрдХрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкреИрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди ...

5. рдпрджрд┐ рдЖрдк "рдЯрд░реНрдорд┐рдирд▓" рд╕реЗ рд╕реАрдзреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдЗрд╕рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрд╣ рджреВрд╕рд░реА рддрд░рдл рд╕реЗ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рд░рдВрддрд░рддрд╛ рдХрд╛ рдкрд╛рд▓рди рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рд╣реИред



рдЕрджреНрдпрддрди (рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ):

6. ssh2_scp_recv рдиреЗ рд╣рдардкреВрд░реНрд╡рдХ рдХрд╣рд╛ рдХрд┐ рдЬрдм рд╡рд╣ рдорд┐рдХрд░реЛрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рддрдм рднреА рд╡рд╣ рдлрд╛рдЗрд▓ рдХреЛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░ рдкрд╛ рд░рд╣рд╛ рдерд╛ (рднрд▓реЗ рд╣реА рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдпрд╣ рдкрд╣рд▓рд╛ рдФрд░ рдПрдХрдорд╛рддреНрд░ рдЕрдиреБрд░реЛрдз рд╣реИ), рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЙрд╕рдиреЗ рдЙрдмрдВрдЯреВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ (рдХреЗрд╡рд▓ рдЖрдИрдкреА рдмрджрд▓ рджрд┐рдпрд╛) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛ред

/ рдЕрджреНрдпрддрди



рдЬреИрд╕рд╛ рдХрд┐ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛:

1. рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореИрдВ рдХрд╛рдВрдЯрд╛ ()

2. рдЪрд╛рдЗрд▓реНрдб'рдП рдореЗрдВ ssh2_exec рдХрдорд╛рдВрдб '/ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдлрд╛рдЗрд▓ = рдХрд░рдВрдЯ' рдХреЗ рд╕рд╛рдеред рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдХреЛрдб 0 рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реВрдВ, рдЕрдиреНрдпрдерд╛ - 1. рдмрдЪреНрдЪреЗ рдХреЗ рдХрд╛рдо рдЦрддреНрдо рдХрд░рдиреЗ рдкрд░ рдорд┐рдХрд░реЛрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рдЦреБрдж рдм рдЦреБрдж рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

3. рдореБрдЭреЗ рдЫреЛрдЯреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкрд╕рдВрдж рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╕рдлрд▓ рд░рд╣рд╛, рддреЛ рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдмрдЪреНрдЪреЗ рдХреЛ рдХрд╛рдВрдЯрд╛, рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЬреБрдбрд╝ рдЬрд╛рдПрдЧрд╛ рдФрд░ sftp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓ рдЙрдард╛рдПрдЧрд╛ред

4. рдореИрдВ рдмрдЪреНрдЪреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реВрдВред



рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЯрд┐рд▓, рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдмрд╛рдИрдкрд╛рд╕ рд╣реЛ рдЧрдИ рд╣реИрдВред



рдиреАрдЪреЗ рдПрдХ рдХреЛрдб рд╣реИ рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЬрд╝рд░реВрд░рдд рд╣реЛ, рддреЛ рд╕рд╛рдЗрдХрд┐рд▓ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░реЗрдВред



/* Notify the user if the server terminates the connection */ function my_ssh_disconnect($reason, $message, $language) { printf("Server disconnected with reason code [%d] and message: %s\n", $reason, $message); } function backup_mt($device) { if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist"); $methods = array( 'kex' => 'diffie-hellman-group1-sha1', 'client_to_server' => array( 'crypt' => '3des-cbc', 'comp' => 'none'), 'server_to_client' => array( 'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc', 'comp' => 'none')); $callbacks = array('disconnect' => 'my_ssh_disconnect'); // for a process, as there is no ssh2_disconnect funciton and we have to close connection between commands. $pid = pcntl_fork(); if ($pid == -1) { echo ('could not fork'); return; } else if ($pid) { // we are the parent pcntl_wait($status); //Protect against Zombie children if (!pcntl_wifexited ($status)) { echo "Child faled to exit normally.\n"; return; } if (pcntl_wexitstatus($status) >0) { echo "Child reported failure. \n"; return; } } else { // we are the child, we don't return, we just die when job's done echo "Trying to connect to mikrotik host ".$device['name']."(".$device['ip'].") via ssh on port 22\n"; if(!($con = ssh2_connect($device['ip'], 22,$methods,$callbacks))){ echo "fail: unable to establish connection\n"; exit(1); } else { // try to authenticate with username root, password secretpassword if(!ssh2_auth_password($con, $device['user'], $device['pass'])) { echo "fail: unable to authenticate\n"; exit(1); } else { echo "Connected. Preparing configuration file.\n"; if (!($stream = ssh2_exec($con, "/export file=curcfg" ))) { echo "fail: unable to execute command\n"; exit(1); } else { // collect returning data from command stream_set_blocking($stream, true); $data = ""; while ($buf = fread($stream,4096)) { $data .= $buf; } fclose($stream); // we don't need $data value for now, we just ignore it, but we have to retrieve it to avoid delays. exit(0); // do not return, we're child, we don't want to continue main prorgam copy to execute. } } } } // end of child code // give mt. time to save config and child to fully die, closing connections. sleep(1); // now fork another child to retrieve configuration. Make another connection for that. $pid = pcntl_fork(); if ($pid == -1) { die('could not fork'); } else if ($pid) { // we are the parent pcntl_wait($status); //Protect against Zombie children if (!pcntl_wifexited ($status)) { echo "Child faled to exit normally.\n"; return; } if (pcntl_wexitstatus($status) >0) { echo "Child reported failure. \n"; return; } } else { // we are the child again, we should not return from this section, we die when job's done echo "Trying to connect to mikrotik host ".$device['name']."(".$device['ip'].") for sftp on port 22\n"; if(!($con = ssh2_connect($device['ip'], 22,$methods,$callbacks))){ echo "fail: unable to establish connection\n"; exit(1); } else { // try to authenticate with username root, password secretpassword if(!ssh2_auth_password($con, $device['user'], $device['pass'])) { echo "fail: unable to authenticate\n"; exit(1); } else { echo "Downloading configuration via sftp\n"; $sftp = ssh2_sftp($con); echo "Got sftp handle.\n"; $size = filesize("ssh2.sftp://$sftp/curcfg.rsc"); echo "File size: $size\n"; $stream = fopen("ssh2.sftp://$sftp/curcfg.rsc", 'r'); if (! $stream) { echo "Could not open file /curcfg.rsc\n"; exit(1); } else { echo "Reading file..."; $contents = ''; $read = 0; $len = $size; while ($read < $len && ($buf = fread($stream, $len - $read))) { $read += strlen($buf); $contents .= $buf; echo strlen($buf).'B...'; } file_put_contents ('/tmp/'.$device['ip'],$contents); @fclose($stream); echo "done\n"; } exit(0); // do not return, we're child, we don't want to continue main prorgam copy to execute. } } } // end of child code } ...
      
      







рдФрд░ рдХрд╣реАрдВ рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЙрд▓:

 $device=array('type'=>$type_id,'user'=>$tokens[80],'pass'=>$tokens[56],'name'=>$tokens[71],'ip'=>$ip); if ($type_id == DEV_TYPE_MIKROTIK) backup_mt($device);
      
      










All Articles