使用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);
?>

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

感谢您的任何帮助,您可以提供.

解决方法:

这个问题已经过时了,但正如我在寻找完全相同的答案,这就是我设法收集的内容.

首先:将密钥格式从.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.

上一篇:httpbin简介


下一篇:chrome selenium使用代理ip及不生效的原因