我已经阅读了一篇文章,并且找不到适用于我所拥有的“解决方案”.
我正在尝试使用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);
?>
我没有收到任何错误,但文件没有显示在服务器上.
我可以确认我的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.