2015-01-31 138 views
5

我已經閱讀了文章之後的文章,並且找不到可用於我所擁有的「解決方案」的解決方案。使用PHP和私鑰連接到SFTP

我想通過使用php腳本的SFTP上傳文件。我已經成功地使用Cyber​​Duck進行了連接,但我需要以編程方式執行此操作。

我有一個來自我在Cyber​​Duck中使用的供應商的.PPK文件。我有一個用戶名。我有主機名。如果我打開PPK文件,我會看到一些公共線路,專用線路和私有MAC。

有無論如何我可以訪問服務器來做我需要做的事情來使用我擁有的信息嗎?

這裏是我與打碼:

<?php if (!function_exists("ssh2_connect")) die("function ssh2_connect doesn't exist");    
?> 
<?php 
$conn = ssh2_connect('hostname.com', 22); 
echo $conn; 
ssh2_auth_pubkey_file($conn,'USERNAME','/var/www/html/FILENAME.PPK'); 

// send a file 
ssh2_scp_send($conn, '/var/www/html/FILETOSEND.TXT', 'FILETOSEND.TXT', 0644); 
?> 

我沒有收到任何錯誤,但文件不會在服務器上顯示出來。 我可以確認SSH2安裝在我的虛擬主機上。

感謝您提供的任何幫助。

+4

我強烈建議使用[phpseclib](https://github.com/phpseclib/phpseclib)來達到目的。它比php的ssh2函數更好,並且非常易於使用 – baao 2015-01-31 21:23:41

+0

你似乎並不知道'ssh2_auth_pubkey_file'需要4個參數,而不是3個。http://php.net/manual/en/function.ssh2-auth -pubkey-file.php – 2015-01-31 21:24:28

+0

@charlotte,我確實看到這就是爲什麼我認爲我有問題。我可以將PPK文件拆分爲缺失的元素嗎? – 2015-01-31 21:47:55

回答

3

這個問題是相當古老的,但我正在尋找完全相同的答案,這是我設法收集的。

第一:從.pkk更改密鑰格式爲.pem

.pkk鍵膩子格式的私鑰。

如果要更改爲.pem格式,你需要用安裝膩子工具:

sudo apt install putty-tools 

(在Mac上,用自制軟件安裝包膩子對於Windows,我不知道。 )

然後你就可以更改鍵的格式:

puttygen privatekey.ppk -O private-openssh -o privatekey.pem 

以防萬一你要提取來自私鑰的公鑰,(你不會需要這個答案的其餘部分,但以防萬一),這是很容易:

openssl rsa -in privatekey.pem -pubout > publickey.pub 

二:與SFTP

登錄既然你有privatekey.pem,您可以使用phpseclib通過SFTP進行連接。首先,安裝phpseclib與作曲:

composer require phpseclib/phpseclib 

然後在PHP中:如果你想了解更多信息

require 「vendor/autoload.php」; 

use phpseclib\Crypt\RSA; 
use phpseclib\Net\SFTP; 

$sftp = new SFTP('sftp.server.com'); 

// create new RSA key 
$privateKey = new RSA(); 

// in case that key has a password 
$key->setPassword('private key password'); 

// load the private key 
$key->loadKey(file_get_contents('/path/to/privatekey.pem')); 

// login via sftp 
if (!$sftp->login('username', $key)) { 
    throw new Exception('sFTP login failed'); 
} 

// now you can list what's in here 
$filesAndFolders = $sftp->nlist(); 

// you can change directory 
$sftp->chdir('coolstuffdir'); 

// get a file 
$sftp->get('remoteFile', 'localFile'); 

// create a remote new file with defined content 
$sftp->put('newfile.txt', 'new file content'); 

// put a local file 
$sftp->put('remote.txt', 'local.txt', NET_SFTP_LOCAL_FILE); 

,轉到phpseclib sFTP feature list