使用PHP和私钥连接到SFTP

时间:2015-01-31 21:21:39

标签: php sftp libssh2

我已经阅读了文章后文,但是找不到"解决方案"这适用于我所拥有的。

我正在尝试使用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);
?>

我没有收到任何错误,但文件没有显示在服务器上。 我可以确认我的webhost上安装了SSH2。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:15)

这个问题已经很老了,但正如我一直在寻找完全相同的答案,这就是我设法收集的内容。

首先:将密钥格式从.ppk更改为.pem

.pkk密钥是PuTTY格式的私钥。

如果要将其更改为.pem格式,则需要安装putty-tools:

sudo apt install putty-tools

(在Mac上,使用自制软件安装putty软件包。对于Windows,我不知道。)

然后你可以改变密钥的格式:

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

万一你要从私钥中提取公钥,(你不需要其余的答案,但以防万一)这很容易:

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

第二:使用sFTP登录

现在您已拥有privatekey.pem,您可以使用phpseclib通过SFTP进行连接。首先,使用Composer安装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
$privateKey->setPassword('private key password');

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

// login via sftp
if (!$sftp->login('username', $privateKey)) {
    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

答案 1 :(得分:3)

如果我可以根据StéphaneLe Solliec回答的代码示例分享我的发现,那么您必须检查phpseclib版本。要通过composer(windows)检查phpseclib版本,只需键入命令提示符composer require phpseclib/phpseclib,结果将显示该版本(如果已安装)。

如果phpseclib版本是1.0,建议您将$sftp = new SFTP('sftp.server.com');行修改为$sftp = new NET_SFTP('sftp.server.com');

如果phpseclib版本是2.0,建议您将$sftp->put('remote.txt', 'local.txt', NET_SFTP_LOCAL_FILE);行修改为$sftp->put('remote.txt', 'local.txt', SFTP::SOURCE_LOCAL_FILE);

谢谢。