You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PHP ssh2_connect从远程服务器复制文件到本地时遇错误

解决ssh2_scp_recv写入本地文件失败的问题

错误原因

ssh2_scp_recv函数的第三个参数要求传入包含文件名的完整本地路径,而非单纯的目录路径。如果仅传入目录,PHP会尝试将文件内容写入目录本身,从而触发“Is a directory”的错误。

解决方案

  1. 指定完整本地文件名:在本地目录路径后拼接远程文件的文件名,确保目标路径指向具体文件而非目录。
  2. 确保本地目录存在:传输前检查目标目录是否存在,不存在则创建,避免路径不存在导致的写入失败。
  3. 批量文件处理:循环遍历远程文件列表,为每个文件生成对应的本地完整路径。

修正后的代码示例

单个文件传输

$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:10:06