PHP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реНрдлрд┐рдВрдХреНрд╕ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ

рдЕрдЪреНрдЫреЗ рджрд┐рди, рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ!



рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рдордиреЗ рдмрди рдЧрдИ рд╣реИред



рд╕реНрд░реЛрдд рдбреЗрдЯрд╛:

рдорд╛рдирдХ рджреАрдкрдХ рдХрд┐рдЯ (рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реАрд╕реА),

Yii рдлреНрд░реЗрдорд╡рд░реНрдХ (рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ),

рдПрдХ рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ (рдмрд╛рдж рдореЗрдВ рдЕрдореЗрд░рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд) рдЬрд┐рд╕ рдкрд░ рд╕реНрдлрд┐рдВрдХреНрд╕ рдбреЗрдореЙрди рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рд╕рд░реНрдЪрдбред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рд╡рд╛рд▓рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рд╕реНрд╡рдпрдВ рд░реВрдЯ рдирд╣реАрдВ)ред

PHP рдХреЗ рд▓рд┐рдП ssh2_mod рдореЙрдбреНрдпреВрд▓ SS рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИред



рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ Sphinx рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдореИрдиреБрдЕрд▓ sphinxsearch.com/docs/current.html рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рддрдХ рд╕реАрдорд┐рдд рд░рдЦреВрдВрдЧрд╛ред



рддреЛ, рд╕реНрдлрд┐рдВрдХреНрд╕ рдПрдХ рдЦреЛрдЬ рдбреЗрдореЙрди рд╣реИ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ MySQL рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╕реНрдлрд┐рдВрдХреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░ рдореЗрдВ рд╡рд░реНрдгрд┐рдд), рдФрд░ рдЗрд╕рдХреЗ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдмрдЪрд╛рддрд╛ рд╣реИред рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрджреНрдпрддрд┐рдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП (MySQL рдореЗрдВ, рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИ), рдЖрдкрдХреЛ рд╕реНрдлрд┐рдВрдХреНрд╕ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░, рд╡рд╣ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдПрдЧреА рдФрд░ рдмрдЪрд╛рдПрдЧреАред



рдЙрджреНрджреЗрд╢реНрдп:

CSS рдкрд░ sphinx рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рдЪрд▓рд╛рдПрдВред

рд░рд┐рдореЛрдЯ рд╕реНрдЯрд╛рд░реНрдЯ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдореБрдХреБрдЯ рдкрд░ рдХрдорд╛рдВрдбреЛрдВ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдПрд╕рдПрд╕ рд╕реЗ рдХреНрд░реЛрди рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдпрд╛рдиреА рд╕рд░реНрд╡рд░ рдХреНрд░рд╛рдЙрди рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рддрд░реАрдХрд╛ рд╕реАрдПрд╕рдПрд╕ рдкрд░ рдЕрдиреБрдХреНрд░рдордг рдХрд░рддрд╛ рд╣реИред



рдПрдХрдорд╛рддреНрд░ рдЙрдкрд╛рдп рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╡рд╣ рдерд╛ apache2 рдХреЗ рд▓рд┐рдП ssh2_mod рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЬреЛ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, CentOS рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдореИрдиреБрдЕрд▓ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ www.stableit.ru/2010/12/ssh2-php-centos-55-pecl.html )ред



рдореИрдВрдиреЗ ssh2 рдореИрдиреБрдЕрд▓ (http://www.php.net/manual/en/book.ssh2.php) рдХреЛ рджреЗрдЦрд╛, рдЕрджреНрднреБрдд ssh2_exec рдлрд╝рдВрдХреНрд╢рди рдкрд╛рдпрд╛, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕рддреНрд░ рдФрд░ рдХрдорд╛рдВрдб рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдЗрд╕рдХреА рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдореИрдВрдиреЗ рдбреЗрд▓реНрдЯрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ --all - рддреЛрд░рдг рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:



WARNING: failed to open pid_file '/var/run/sphinx/searchd.pid'. WARNING: indices NOT rotated.
      
      







рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдШреВрдордиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рд░реВрдЯ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░, sudo -s рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕реАрдзреЗ рдХрдВрд╕реЛрд▓ рд╕реЗ рд╕реАрдзреЗ рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдФрд░ рджреЗрдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдФрд░ рдкрд╛рдпрд╛ рдХрд┐ рдЖрдк рдЯрд░реНрдорд┐рдирд▓ (ssh2_shell рдлрд╝рдВрдХреНрд╢рди) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдорд╛рдВрдб рдЗрдирдкреБрдЯ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рдирдХ рд╕реНрдЯреНрд░реАрдо рдФрд░ рдлрд╛рдЗрдЯрд╛рдЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк "рдЯрд░реНрдорд┐рдирд▓" рдХреЛ рдХрдорд╛рдВрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдорд╛рди рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред рдЯрд░реНрдорд┐рдирд▓ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкрд░рд┐рдгрд╛рдоред рдлрд╝реЙрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рдкрдврд╝рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣реЛрддрд╛ рд╣реИред



рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рдбреЗрд▓реНрдЯрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдЪреЗрдХ рд╕рдлрд▓ рд░рд╣рд╛, рдореБрдЭреЗ рдЦреБрд╢реА рд╣реБрдИ, рд▓реЗрдХрд┐рди ...

"BUT" рддрдм рд╣реБрдЖ рдЬрдм рдореИрдВрдиреЗ рдореБрдЦреНрдп рдЗрдВрдбреЗрдХреНрд╕ (рд▓рдЧрднрдЧ 400k рд░рд┐рдХреЙрд░реНрдб) рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕рдореЗрдВ рдХрдИ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВ)ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░реА рдкрд░ рдЯреВрдЯ рдЬрд╛рддреА рд╣реИред рд╕рд░рд▓ рднрд╛рд╖рд╛ рдореЗрдВ, рдЬрдм рдЖрдк рдПрдХ рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЯрд░реНрдорд┐рдирд▓ "рд╕реЛрдЪрддрд╛ рд╣реИ"ред рдирддреАрдЬрддрди, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА "рдЕрдирдПрдиреНрдбреЗрдХреНрд╕реНрдб" рдлрд╛рдЗрд▓реЗрдВ рдереАрдВред



рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рд▓реЛрдЧ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдореИрдВ рдПрдХ рдХреЛрдб рдСрдл рдкреАрд╕ рдЖрдпрд╛, рд╕рд╣реА ssh2 рдорди рдореЗрдВ php.net рдкрд░ред рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдХрдорд╛рдВрдб рдХреЗ рдЖрд░рдВрдн рдФрд░ рдЕрдВрдд рдорд╛рд░реНрдХрд░реЛрдВ (echo '[start]'; $ рдХрдорд╛рдВрдб; echo '[end]') рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП max_execution_time рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред

рдХреЛрдб рдиреАрдЪреЗ рд╣реИред



 $ip = 'ip_address'; $user = 'username'; $pass = 'password'; $connection = ssh2_connect($ip); ssh2_auth_password($connection,$user,$pass); $shell = ssh2_shell($connection,"bash"); //Trick is in the start and end echos which can be executed in both *nix and windows systems. //Do add 'cmd /C' to the start of $cmd if on a windows system. $cmd = "echo '[start]';your commands here;echo '[end]'"; $output = user_exec($shell,$cmd); fclose($shell); function user_exec($shell,$cmd) { fwrite($shell,$cmd . "\n"); $output = ""; $start = false; $start_time = time(); $max_time = 2; //time in seconds while(((time()-$start_time) < $max_time)) { $line = fgets($shell); if(!strstr($line,$cmd)) { if(preg_match('/\[start\]/',$line)) { $start = true; }elseif(preg_match('/\[end\]/',$line)) { return $output; }elseif($start){ $output[] = $line; } } } }
      
      







рдпрд╣ рдореБрдЭреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд▓рдЧ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди ...

рдпрд╣рд╛рдБ BUT рдкреВрд░реНрд╡рдЧрд╛рдореА рд╣рд╛рд▓рдд рдореЗрдВ рдерд╛ред рдЬрдм рдЖрдЙрдЯрдкреБрдЯ рдЬрд╛рдирдХрд╛рд░реА, рд╕рдм рдХреБрдЫ $ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЯрд░реНрдорд┐рдирд▓ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджреЗрддрд╛ рд╣реИред "рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдЯрд░реНрдорд┐рдирд▓" рдХреЗ рд╕рд╛рде рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЧрдИ, рдЬреИрд╕рд╛ рдХрд┐ рдЬрдм рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рдЯрд░реНрдорд┐рдирд▓ рдиреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рд░реНрдХрд░ рдХреА рдЧреВрдВрдЬ '[рдЕрдВрдд]' (рд╕реНрд╡рдпрдВ рдХрдорд╛рдВрдб, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ) рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рдЬрд╛рд░реА рдХрд┐рдпрд╛ред рд╕рдм рдХреБрдЫ preg_match рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдкрдВрдХреНрддрд┐ рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛрдбрд╝рдХрд░ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:

preg_match('/^\[start\]\s*$/',$line)







рдФрд░ $ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП is_string рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред



рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рд╛, рдФрд░, рд╡рд╛рдпрд▓реА, рдПрдХ рдШрдЯрдХ Yii рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ ssh2 рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рд╣ рдХреА рдкрд░рдд рд╣реИред



 <?php class SshException extends CException {} /** * Class Ssh * It is a base class for the simplify a ssh connection management * and related commands execution * * @author Ivanenko Vladyslav */ class Ssh { const EXEC_TYPE_EXEC = 'exec'; // type for ssh2_exec() const EXEC_TYPE_SHELL = 'shell'; // type for ssh2_shell() const START_MARK = '__start__'; const FINISH_MARK = '__finish__'; const MAX_EXECUTION_TIME = 1800; // max script execution time in sec private $user; private $password; private $host; private $port; private $shellType = 'bash'; // shell type private $shell = null; //shell identificator private $ssh = null; //connection private $execType; /** * Construct * * @param null $user * @param null $password * @param null $host */ public function __construct($user = null, $password = null, $host = null, $port = null) { $config = Yii::app()->params['ssh']; $params = array('user', 'password', 'host', 'port'); foreach($params as $param) { if(isset(${$param}) && !is_null(${$param})) { $this->{$param} = ${$param}; } else { $this->{$param} = @$config[$param]; } } return true; } /** * Connect to Ssh * * @return resource * @throws SshException */ public function connect() { $this->ssh = @ssh2_connect($this->host, $this->port); if(empty($this->ssh)) { throw new SshException('Cant connect to ssh'); } if(empty($this->execType)) { $this->execType = self::EXEC_TYPE_SHELL; } return $this->ssh; } /** * Login to ssh * * @throws SshException * @return bool */ public function login() { if(!@ssh2_auth_password($this->ssh, $this->user, $this->password)) { throw new SshException('Cant login by ssh'); } return true; } /** * Exec command by ssh * * @param $cmd * @param $type * * @return string * @throws SshException */ public function exec($cmd, $type = self::EXEC_TYPE_SHELL) { if(is_null($this->ssh)) { $this->connect(); $this->login(); } $this->execType = $type; switch($this->execType) { case self::EXEC_TYPE_EXEC: $result = $this->execCommand($cmd); break; case self::EXEC_TYPE_SHELL: $result = $this->execByShell($cmd); break; default: throw new SshException('Incorrect exec type'); break; } return $result; } /** * Executes command by the direct ssh2_exec * * @param $command * * @return string * @throws SshException */ private function execCommand($command) { if (!($stream = ssh2_exec($this->ssh, $command))) { throw new SshException('Ssh command failed'); } stream_set_blocking($stream, true); $data = ""; while ($buf = fread($stream, 4096)) { $data .= $buf; } fclose($stream); return $data; } /** * Executes command within the shell opening * * @param $command * * @return string */ private function execByShell($command) { $this->openShell(); return $this->writeShell($command); } /** * opens shell * * @throws SshException */ private function openShell() { if(is_null($this->shell)) { // here is hardcoded width and height, you can change them. $this->shell = @ssh2_shell($this->ssh, $this->shellType, null, 80, 40, SSH2_TERM_UNIT_CHARS); } if( !$this->shell ) { throw new SshException('SSH shell command failed'); } } /** * * Write the command to the open shell * * @param $cmd * @param int $maxExecTime in sec * * @return string */ private function writeShell($cmd, $maxExecTime = self::MAX_EXECUTION_TIME) { // write start marker fwrite($this->shell, $this->getMarker(self::START_MARK)); // write command fwrite($this->shell, $cmd . PHP_EOL); // write end marker fwrite($this->shell, $this->getMarker(self::FINISH_MARK)); stream_set_blocking($this->shell, true); sleep(1); $output = ""; $start = false; // define the time until the script can be executed $timeUntil = time() + $maxExecTime; while(true) { if(time() > $timeUntil) { break; } $line = fgets($this->shell, 4096); // if any delay is happened while command is processing if(!is_string($line)) { sleep(1); continue; } // define the start executed command if(preg_match('/^' . self::START_MARK . '\s*$/', $line)) { $start = true; } elseif(preg_match('/^' . self::FINISH_MARK . '\s*$/', $line)) { // define the last executed command break; } elseif($start) { // add console output to the script output data $output .= $line; } } return $output; } /** * Disconnect from ssh */ public function disconnect() { $this->exec('exit'); $this->ssh = null; if(!is_null($this->shell)) { fclose($this->shell); } } /** * Disconnect in destruct */ public function __destruct() { $this->disconnect(); } /** * Returns marker command * * @param string $type * * @return string */ private function getMarker($type = self::START_MARK) { return 'echo "' . $type . '"' . PHP_EOL; } }
      
      







рдкреБрдирд╢реНрдЪ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ssh2 рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИ, рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рд░реНрдп рд╣реИрдВ, рдФрд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг, рдЖрджрд┐ред рдЖрджрд┐



рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рд╕реБрдирдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА!



рд╡реНрд▓рд╛рджрд┐рд╕реНрд▓рд╛рд╡ рдЗрд╡рд╛рдиреНрдХреЛ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛, PHP рдбреЗрд╡рд▓рдкрд░ Zfort Group



All Articles