2012-03-05 243 views
25

我已通過ftp成功上傳文件,但現在需要通過SFTP進行操作。我可以成功連接到遠程服務器,創建一個文件並寫入,但是我無法將現有文件從本地服務器上傳到遠程服務器。 ftp_put不是用sftp連接發射嗎?使用SFTP上傳文件

我的代碼用於寫文件:

//Send file via sftp to server 

$strServer = "*****"; 
$strServerPort = "****"; 
$strServerUsername = "*****"; 
$strServerPassword = "*****"; 
$csv_filename = "Test_File.csv"; 

//connect to server 
$resConnection = ssh2_connect($strServer, $strServerPort); 

if(ssh2_auth_password($resConnection, $strServerUsername, $strServerPassword)){ 
    //Initialize SFTP subsystem 

    echo "connected"; 
    $resSFTP = ssh2_sftp($resConnection);  

    $resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w'); 
    fwrite($resFile, "Testing"); 
    fclose($resFile);     

}else{ 
    echo "Unable to authenticate on server"; 
} 

有沒有人曾在霎那通過方法的本地文件和上傳任何成功諸如上面SFTP?一個例子將不勝感激。

感謝

+0

你爲什麼稱它爲「resFile」?爲什麼「res」?它代表什麼? – Black 2016-06-21 08:08:47

+0

結果我猜.. @Black – denns 2017-04-11 15:41:03

回答

35

根據以上(包括SFTP),可以使用stream_copy_to_stream方法:

$resFile = fopen("ssh2.sftp://{$resSFTP}/".$csv_filename, 'w'); 
$srcFile = fopen("/home/myusername/".$csv_filename, 'r'); 
$writtenBytes = stream_copy_to_stream($srcFile, $resFile); 
fclose($resFile); 
fclose($srcFile); 

您也可以嘗試使用ssh2_scp_send

+1

完美的工作,謝謝。我將爲未來的項目添加書籤! – Marc 2012-03-05 20:41:53

+0

這太棒了,但不要忘記禁用用戶打開的基本目錄。 – 2016-07-18 23:28:18

13

就個人而言,我更喜歡避免PECL SSH2擴展。我的首選方法涉及phpseclib, a pure PHP SFTP implementation。例如。

<?php 
include('Net/SFTP.php'); 

$sftp = new Net_SFTP('www.domain.tld'); 
if (!$sftp->login('username', 'password')) { 
    exit('Login Failed'); 
} 

$sftp->put('remote.ext', 'local.ext', NET_SFTP_LOCAL_FILE); 
?> 

我喜歡的關於PECL擴展的phpseclib的一件大事是便攜。也許PECL擴展在一個版本的Linux上工作,但不是另一個版本。而在共享主機上,它幾乎從不運行,因爲它幾乎沒有安裝過。

phpseclib也令人驚訝,faster。如果您需要確認文件已上傳,您可以使用phpseclib的內置日誌記錄作爲證據。

+0

我使用上面的腳本上傳一些csv文件,但我收到以下錯誤: 線上3521 Net \ SSH2.php超過120秒的最大執行時間,我怎麼能超過它。 – 2015-09-23 12:43:23

+0

請參閱http:// php。淨/設定時間限制。 – neubert 2015-09-23 13:39:24

1

共享更多的輸入信息,發現ssh2_scp_send在將文件從Linux(64位)複製到Windows(32位)時沒有正確複製(字節不同),因此sftp例程完美運行。在Windows上使用stfp時,如果Cygwin在Windows窗口中用於SSH,則C:\ to \路徑中的路徑需要放置爲ssh2.sftp:// {$ resSFTP}/cygdrive/c/to/path 。

4

對於簡單文檔phpseclib,純PHP SFTP實現

請參考以下鏈接:

Uploading files over SFTP using PHP

文件夾結構:

Main Folder-> 
    my-files(Contain File Which Transfer To Remote Server) 
    phpseclib0.3.0 
    sftp.php 
9

對於我這樣的工作:

$connection = ssh2_connect($server, $serverPort); 

if(ssh2_auth_password($connection, $serverUser, $serverPassword)){ 
    echo "connected\n"; 
    ssh2_scp_send($connection, "/path/to/local/".$file, "/path/to/remote/".$file); 
    echo "done\n"; 
} else { 
    echo "connection failed\n"; 
} 

我必須首先安裝libssh2的PHP,但:

sudo apt-get install libssh2-php 
+0

感謝'apt-get安裝libssh2-php' – 2016-03-16 15:32:02

+0

我得到了包libssh2-php不可用,所以使用'sudo apt-get install php-ssh2' – omega1 2018-02-16 13:35:50