ssh2_scp_send

(PECL ssh2 >= 0.9.0)

ssh2_scp_send通过 SCP 发送文件

描述

ssh2_scp_send(
    资源 $session,
    字符串 $local_file,
    字符串 $remote_file,
    整数 $create_mode = 0644
): 布尔值

使用 SCP 协议将文件从本地文件系统复制到远程服务器。

参数

session

一个 SSH 连接链接标识符,从调用 ssh2_connect() 获得。

local_file

本地文件的路径。

remote_file

远程文件的路径。

create_mode

该文件将使用 create_mode 指定的模式创建。

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 通过 SCP 上传文件

<?php
$connection
= ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

ssh2_scp_send($connection, '/local/filename', '/remote/filename', 0644);
?>

参见

添加注释

用户贡献的注释 4 个注释

stefanov at uk dot ibm dot com
16 年前
除了我之前发布的内容外,我还发现 sftp->fopen->file_get_contents->fwrite 的性能比 ssh2_scp_send 好得多。

我使用以下代码进行测试

<?php
$srcFile
= '/var/tmp/dir1/file_to_send.txt';
$dstFile = '/var/tmp/dir2/file_received.txt';

// 创建与远程主机的连接
$conn = ssh2_connect('my.server.com', 22);

// 创建 SFTP 会话
$sftp = ssh2_sftp($conn);

$sftpStream = @fopen('ssh2.sftp://'.$sftp.$dstFile, 'w');

try {

if (!
$sftpStream) {
throw new
Exception("无法打开远程文件: $dstFile");
}

$data_to_send = @file_get_contents($srcFile);

if (
$data_to_send === false) {
throw new
Exception("无法打开本地文件: $srcFile.");
}

if (@
fwrite($sftpStream, $data_to_send) === false) {
throw new
Exception("无法从文件发送数据: $srcFile.");
}

fclose($sftpStream);

} catch (
Exception $e) {
error_log('Exception: ' . $e->getMessage());
fclose($sftpStream);
}
?>

对于测试,我发送了三个总大小为 6kB 的文件,包括连接到服务器的发送时间为

SFTP -> 15 秒。
ssh2_scp_send -> 22 秒。

干杯!

Pimmy
emmanuel dot kartmann at prosdk dot com
14 年前
在 Windows 上,我使用 ssh2_scp_send 时遇到了麻烦:复制到远程服务器的文件是不完整的(被截断)和/或被锁定(错误消息:“访问被拒绝”)。后端也在 Windows 上,使用 CopSSH(基于 cygwin 的 SSH 服务器)。

SSH 会话保持打开状态 - 并且文件从未刷新到磁盘。

不过有一个解决方法 - 显式调用“exit”来关闭会话(将文件内容刷新到磁盘)

<?php
$objConnection
= ssh2_connect($strHost, $strPort, $methods, $callbacks);
ssh2_auth_password($objConnection, $strUser, $strPassword);
ssh2_scp_send($objConnection , $strSource, $strDest);

// 添加此项以刷新缓冲区/关闭会话
ssh2_exec($objConnection, 'exit');
?>
stefanov at uk dot ibm dot com
16 年前
经过一些测试,我发现 ssh2_scp_send 的工作方式与标准 scp 命令不完全相同

- 工作:ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/file_02.txt');
- 错误:ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp');(创建名为“tmp”的文件)
- 失败:ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/');
- 失败:ssh2_scp_send($conn, '/dirname', /var/tmp/');(没有递归)
- 失败:ssh2_scp_send($conn, '/dirname/*', /var/tmp/');(不能复制多个文件。)

干杯!

Pimmy
j dot patus at simpledino dot com
7 年前
如果命令

$sftpStream = @fopen('ssh2.sftp://'.$sftp.$dstFile, 'w');

导致段错误,请尝试使用

$sftpStream = @fopen('ssh2.sftp://'.intval($sftp).$dstFile, 'w');

来源:http://stackoverflow.com/questions/7414175/php-sftp-seg-fault
To Top