ssh2_scp_send

(PECL ssh2 >= 0.9.0)

ssh2_scp_sendSCP üzerinden bir dosya gönderir

Açıklama

ssh2_scp_send(
    resource $oturum,
    string $yerel_dosya,
    string $uzak_dosya,
    int $kip = 0644
): bool

SCP protokolünü kullanarak bir yerel dosyayı uzak sunucunun dosya sistemine kopyalar.

Bağımsız Değişkenler

oturum

ssh2_connect() ile sağlanan bir SSH bağlantı tanıtıcısı.

yerel_dosya

Yerel dosyanın yolu.

uzak_dosya

Uzak dosyanın yolu.

kip

Dosya oluşturulurken atanacak erişim izinleri.

Dönen Değerler

Başarı durumunda true, başarısızlık durumunda false döner.

Örnekler

Örnek 1 - SCP üzerinden karşıya dosya yükleme

<?php
$baglanti
= ssh2_connect('shell.example.com', 22);
ssh2_auth_password($baglanti, 'birey', 'parola');

ssh2_scp_send($baglanti, '/yerel/dosya', '/uzak/dosya', 0644);
?>

Ayrıca Bakınız

add a note

User Contributed Notes 4 notes

up
17
stefanov at uk dot ibm dot com
16 years ago
In addition to my previous post, I figured out that sftp->fopen->file_get_contents->fwrite has much better performance than ssh2_scp_send.

I've used the following code to test:

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

// Create connection the the remote host
$conn = ssh2_connect('my.server.com', 22);

// Create SFTP session
$sftp = ssh2_sftp($conn);

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

try {

if (!
$sftpStream) {
throw new
Exception("Could not open remote file: $dstFile");
}

$data_to_send = @file_get_contents($srcFile);

if (
$data_to_send === false) {
throw new
Exception("Could not open local file: $srcFile.");
}

if (@
fwrite($sftpStream, $data_to_send) === false) {
throw new
Exception("Could not send data from file: $srcFile.");
}

fclose($sftpStream);

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

For the test I've sent three files with total size of 6kB, and the times to send including connect to the server were:

SFTP -> 15 sec.
ssh2_scp_send -> 22 sec.

Cheers,

Pimmy
up
0
emmanuel dot kartmann at prosdk dot com
14 years ago
On Windows, I had trouble using ssh2_scp_send: files copied to a remote server where incomplete (truncated) and/or locked (error message : "access denied"). The back-end is also on Windows, using CopSSH (cygwin-based SSH server).

The SSH session was kept open - and the file were never flushed to disk.

There's a workaround though - make an explicit call to "exit" to close the session (flushing file content to disk):

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

// Add this to flush buffers/close session
ssh2_exec($objConnection, 'exit');
?>
up
0
stefanov at uk dot ibm dot com
16 years ago
After some testing I figured out that ssh2_scp_send does not work exactly as the standard scp command:

- Works: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/file_02.txt');
- Wrong: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp'); (Creates file with name 'tmp')
- Fails: ssh2_scp_send($conn, '/var/tmp/file_01.txt', /var/tmp/');
- Fails: ssh2_scp_send($conn, '/dirname', /var/tmp/'); (No recursion)
- Fails: ssh2_scp_send($conn, '/dirname/*', /var/tmp/'); (Cannot copy more than one file.)

Cheers,

Pimmy
up
-3
j dot patus at simpledino dot com
7 years ago
In case the command:

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

causes you a segmentation fault, try using:

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

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