服务器需要安装ssh2,如果已经安装可以忽略,没有安装的可以参考链接: https://blog.csdn.net/weixin_39461487/article/details/86493349 我当时安装的时候是参照的这位博主的答案,好用
/**
* sftp远程服务器文件拉取
* @return mixed
*/
public function sftp()
{
//通过sftp链接服务器后将服务器的文件copy到被本地服务器
$conf = [
'host' => '', //服务器地址
'port' => '22',
'user' => '', //用户
'password' => '' //密码
];
$conn = ssh2_connect($conf['host'], $conf['port']);
if (!ssh2_auth_password($conn, $conf['user'], $conf['password'])) {
return json(['code'=>400,'msg'=>'sftp连接失败']);
}
$mine = exec('pwd'); //获取当前位置
$localPath = $mine . '/syDir/'; //拉去文件后放置在本地的路由
// 创建文件夹
if (!is_dir($localPath)) {
$dir = mkdir($localPath, 0777, true);
if (!$dir) {
return josn(['code'=>400,'msg'=>'创建本地syDir文件夹失败']);
}
}
$toSftpUrl1 = $localPath.'arch/';
// 创建文件夹
if (!is_dir($toSftpUrl1)) {
$dir1 = mkdir($toSftpUrl1, 0777, true);
if (!$dir1) {
return josn(['code'=>400,'msg'=>'创建本地arch文件夹失败']);
}
}
Db::startTrans();
try {
$connection = ssh2_connect($conf['host']);
ssh2_auth_password($connection, $conf['user'], $conf['password']);
$sftp = ssh2_sftp($connection);
$dirhandle = opendir("ssh2.sftp://$sftp/MAT/Test/");
while (false !== ($file = readdir($dirhandle))) {
if ($file != '.' && $file != '..') {
$localRealFile = $localPath . '/' . $file; //本地存放的文件路由
// 如果文件存在则删除,当然这里也可以根据需求进行修改
if (is_file($localRealFile)) {
unlink($localRealFile);
}
$remotFile = '/MAT/Test/'.$file;
$resource = "ssh2.sftp://{$sftp}".$remotFile; //远程服务器下的文件路由
//远程文件 拷贝到本地
copy($resource, $localRealFile);
//将远程服务器下的文件移动到别的地方,不需要可以直接忽略
//$path_to = '/MAT/Test/arch/'.$file;
//ssh2_sftp_rename($sftp,$remotFile, $path_to);
}
}
closedir($dirhandle);
ssh2_disconnect($sftp);
Db::commit();
return json(['code'=>200,'msg'=>'成功']);
}catch (\Exception $e){
Db::rollback();
return json(['code'=>400,'msg'=>$e->getMessage()]);
}
return json(['code'=>200,'msg'=>'成功']);
}
|