PHP Conference Japan 2024

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('例外: ' . $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