Files
2026-05-23 22:10:14 +08:00

74 lines
3.4 KiB
PHP

<?php
/*-----------------------------------------------------+
* SSH封装
* @author yeahoo2000@gmail.com
+-----------------------------------------------------*/
class SSH{
/**
* 通过SSH在目标服务器上执行命令
* @param array $cfg 服务器信息
* @param string $cmd 命令字串
* @return string | array
*/
public static function exec($srv, $cmd, &$stdout, &$stderr){
if(!$srv || !$srv->ip || !$srv->ssh_port || !$srv->ssh_user){
throw new ErrorException("执行SSH命令[$cmd]时发生错误: 服务器'$srvId'的配置信息不完整");
}
$cmd = str_replace(array("\\", "\"", "`"), array("\\\\", "\\\"", "\`"), $cmd);
$cmd = "/usr/bin/sudo /usr/bin/ssh -q -p".$srv->ssh_port." -o StrictHostKeyChecking=no ".$srv->ssh_user."@".$srv->ip." \"$cmd\"";
return App::os()->exec($cmd, $stdout, $stderr);
}
/**
* 通过SCP从本地复制文件到目标服务器
* @param array $cfg 服务器信息
* @param string | array $files 文件列表,需使用绝对路径
* @param string $target 目标路径,需使用绝对路径
* @param bool $full_output 是否返回完整输出,完整输出时返回的是数组
* @return string | array
*/
function scp_to($cfg, $files, $target, $full_output = false){
$cfg->ip = get_ip($cfg);
if(!$cfg->ip){
App::error("复制文件到目标服务器[{$cfg['host']}:{$cfg->ip}]时出现异常: 无法取得有效IP,请检查物理机的配置");
}
if(is_array($files)){
$files = implode(" ", $files);
}
$cmd = "/usr/bin/sudo /usr/bin/scp -P{$cfg['ssh_port']} $files {$cfg['ssh_user']}@{$cfg->ip}:$target";
$rtn = exec($cmd, $output, $return_value);
if(255 == $return_value){
App::error("复制文件到目标服务器[{$cfg['host']}:{$cfg->ip}]时出现异常: 无法访问服务器");
}
else if(0 != $return_value){
App::error("复制文件到目标服务器[{$cfg['host']}:{$cfg->ip}]时出现异常,未知错误[$return_value]:\n$cmd");
}
return $full_output? $output : $rtn;
}
/**
* 通过SCP从目标服务器复制文件到本地
* @param array $cfg 服务器信息
* @param string | array $files 远程文件路径,需使用绝对路径
* @param string $target 本地目标路径,需使用绝对路径
* @param bool $full_output 是否返回完整输出,完整输出时返回的是数组
* @return string | array
*/
function scp_from($cfg, $files, $local_path, $full_output = false){
if(!$cfg->host){
App::error("从服务器复制文件到本地时出现异常: 无法取得有效IP,请检查物理机的配置");
}
if(is_array($files)){
$files = implode(" ", $files);
}
$rtn = exec("/usr/bin/sudo /usr/bin/scp -P{$ssh->port} {$cfg->ssh_user}@{$cfg->ip}:\"$files\" $local_path", $output, $return_value);
if(255 == $return_value){
App::error("从服务器[{$cfg->host}]复制文件到本地时出现异常: 无法访问服务器");
}
else if(0 != $return_value){
App::error("从服务器[{$cfg->host}}]复制文件本地到时出现异常: 未知错误[$return_value]");
}
return $full_output? $output : $rtn;
}
}