使用PHP ssh2_connect从远程服务器复制文件到本地时遇错误
解决ssh2_scp_recv写入本地文件失败的问题
错误原因
ssh2_scp_recv函数的第三个参数要求传入包含文件名的完整本地路径,而非单纯的目录路径。如果仅传入目录,PHP会尝试将文件内容写入目录本身,从而触发“Is a directory”的错误。
解决方案
- 指定完整本地文件名:在本地目录路径后拼接远程文件的文件名,确保目标路径指向具体文件而非目录。
- 确保本地目录存在:传输前检查目标目录是否存在,不存在则创建,避免路径不存在导致的写入失败。
- 批量文件处理:循环遍历远程文件列表,为每个文件生成对应的本地完整路径。
修正后的代码示例
单个文件传输
$connection = ssh2_connect('XXX.XXX.XX.x', 8288); ssh2_auth_password($connection, 'root', 'abcd'); // 远程文件绝对路径 $remote_file = '/remote/path/to/target-file.txt'; // 本地保存目录 $local_dir = '/local/storage/directory/'; // 生成包含文件名的本地完整路径 $local_file = $local_dir . basename($remote_file); // 检查并创建本地目录 if (!is_dir($local_dir)) { mkdir($local_dir, 0755, true); } // 执行文件传输 ssh2_scp_recv($connection, $remote_file, $local_file);
批量文件传输
$connection = ssh2_connect('XXX.XXX.XX.x', 8288); ssh2_auth_password($connection, 'root', 'abcd'); // 待传输的远程文件列表 $remote_files = [ '/remote/files/image.png', '/remote/files/document.pdf', '/remote/files/data.csv' ]; // 本地基础保存目录 $local_base_dir = '/local/save/folder/'; // 确保本地目录存在 if (!is_dir($local_base_dir)) { mkdir($local_base_dir, 0755, true); } // 循环处理每个文件 foreach ($remote_files as $remote_path) { $local_file_path = $local_base_dir . basename($remote_path); ssh2_scp_recv($connection, $remote_path, $local_file_path); }
额外注意事项
- 确保运行PHP的进程对本地目标目录拥有写入权限,否则会触发权限不足的错误。
- 远程文件路径必须是绝对路径,且确认该文件在远程服务器上真实存在。
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

