2013-04-16 67 views
2

我需要創建2個函數:一個使用SFTP上傳文件,另一個使用SCP。我正在使用phpseclibput方法;我相信我已經完成了SFTP功能。使用phpseclib上傳使用SCP的文件

現在,我正在嘗試執行SCP功能。每http://adomas.eu/phpseclib-for-ssh-and-scp-connections-with-php-for-managing-remote-server-and-data-exchange/,好像下面是我需要做的事情:

In case of SCP: 
1. Including the needed file: include('/path/to/needed/file/Net/SFTP.php'); 
2. Creating object and making connection: 
$sftp = new Net_SFTP('host'); 
if (!$sftp->login('user', 'password')) { exit('Login Failed'); } 
3. Reading contents of a file: $contents=$sftp->get('/file/on/remote/host.txt'); 
4. Copying file over sftp with php from remote to local host: $sftp->get('/file/on/remote/host.txt', '/file/on/local/host.txt'); 
5. Copying file over sftp with php from local to remote host: $sftp->put('/file/on/remote/host.txt', '/file/on/local/host.txt'); 
6. Writing contents to remote file: $sftp->get('/file/on/remote/host.txt', 'contents to write'); 

我需要做的#5,但它看起來像什麼,我沒有爲SFTP。 SFTP和SCP是不一樣的,對吧?相同的代碼是否正確?如果不是,我該如何做SCP?

回答

1

是的,SCP是與SFTP完全不同的協議。

phpseclib現在支持最近版本的SCP(自2013年6月發佈0.3.5版本以來)。

另外,使用SCP上傳/下載PHP的PECL SSH2功能:
https://secure.php.net/manual/en/ref.ssh2.php

+1

所以引用的網站是錯誤的。它做了SFTP(就像我一樣),但稱它爲SCP。我使用phpseclib以避免必須配置SSH2功能(phpseclib說這是一個純粹的PHP實現)。對SCP的任何替代解決方案? – snoopy76

+0

對不起,我不明白你的意思是「它做了SFTP(就像我做過的那樣),但稱它爲SCP」。你想避免配置SSH2在哪裏?在客戶端?國際海事組織,你不需要在客戶端配置任何東西,甚至沒有PHP PECL函數(嗯,你需要安裝PECL包,但這與phpseclib類似)。 SCP替代方案:這是您使用SCP/SFTP的要求。如果你想知道其他選擇,請給我們你的約束。 –

+0

哇。它詢問SCP,但發佈的代碼使用SFTP。閱讀CODE的第一行,你會看到「如果是SCP」,下一行就是告訴你如何使用sftp。無論如何,neubert已經更新了你:) 實際上,phpseclib是從PHP執行這些ssh事情的最佳方式,以及當你沒有ssh訪問時的獨特方式。 – erm3nda

2

正如紐伯特指出,phpseclib有SCP現在的支持通過Net_SCP類。

您可以通過傳遞一個Net_SSH2Net_SSH1對象在構造函數實例化一個Net_SCP對象,然後可以使用get()put()方法通過SCP下載或上傳文件。

下面是一個簡單的示例腳本,向我展示了從本地機器向遠程AWS實例傳輸文件的過程。

<?php 

    set_include_path(get_include_path() . 
        PATH_SEPARATOR . 
        '/home/mark/phpseclib'); 

    require_once('Crypt/RSA.php'); 
    require_once('Net/SSH2.php'); 
    require_once('Net/SCP.php'); 

    $key = new Crypt_RSA(); 
    if (!$key->loadKey(file_get_contents('my_aws_key.pem'))) 
    { 
     throw new Exception("Failed to load key"); 
    } 

    $ssh = new Net_SSH2('54.72.223.123'); 
    if (!$ssh->login('ubuntu', $key)) 
    { 
     throw new Exception("Failed to login"); 
    } 

    $scp = new Net_SCP($ssh); 
    if (!$scp->put('my_remote_file_name', 
        'my_local_file_name', 
        NET_SCP_LOCAL_FILE)) 
    { 
     throw new Exception("Failed to send file"); 
    } 

?>