php - 使用 PHP 和私钥连接到 SFTP

标签 php sftp libssh2

我读了一篇又一篇文章,只是找不到适合我的“解决方案”。

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

我有一个来自供应商的 .PPK 文件,我在 Cyber​​Duck 中使用了该文件。我有一个用户名。我有主机名。如果我打开 PPK 文件,我会看到一些公共(public)线路、专用线路和专用 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。

感谢您提供的任何帮助。

最佳答案

这个问题很老了,但由于我一直在寻找完全相同的答案,所以这是我设法收集到的内容。

第一:将 key 格式从 .ppk 更改为 .pem

.pkk key 是 PuTTY 格式的私钥。

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

sudo apt install putty-tools

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

然后您可以更改 key 的格式:

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 .

关于php - 使用 PHP 和私钥连接到 SFTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28256655/

相关文章:

php - 未定义ssh2在PHP中与Debian上的apache

c++ - 如何将 .so 文件链接到 cpp 程序

php - Zend Framework 复选框装饰器

c# - 在 C# 中使用 SSH.NET SFTP 下载目录

php - 是什么将 Drupal Hook 与特定模块联系起来?

java - 上传和下载文件时使用内存泄漏(可能是因为使用 ChannelSftp.get( "file_name") )?

ftp - 用于下载、重命名和移动文件的 WinSCP 脚本

php 拒绝查找 ssh2_connect() 函数

php - 一般错误 : 1366 Incorrect string value in Laravel/Mysql

php - 如果 https 连接,cURL 清空请求数据