使用 PHP 和私钥连接到 SFTP首先:将密钥格式从 .ppk 更改为 .pem第二:使用 sFTP 登录

2022-08-30 23:12:47

我已经阅读了一篇又一篇文章,只是找不到适用于我所拥有的“解决方案”。

我正在尝试使用php脚本通过SFTP上传文件。我已经成功地使用CyberDuck进行了连接,但我需要以编程方式执行此操作。

我有一个.来自我在CyberDuck中使用的供应商的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已安装在我的虚拟主机上。

感谢您提供的任何帮助。


答案 1

这个问题已经很老了,但是由于我正在寻找完全相同的答案,因此这是我设法收集到的。

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

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

如果要将其更改为.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 登录

现在您已经有了 ,您可以使用 phpseclib 通过 SFTP 进行连接。首先,使用 Composer 安装 phpseclib:privatekey.pem

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 功能列表


答案 2

如果我可以分享我的发现,基于Stéphane Le Solliec回答的代码样本,你们必须检查你的phpseclib版本。要通过作曲家(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);

谢谢。


推荐