使用PHP和私钥连接到SFTP
我读了一篇又一篇的文章,就是找不到适合我的“解决方案” 我正在尝试使用php脚本通过SFTP上传文件。我已经成功地使用CyberDuck连接,但我需要通过编程来实现这一点 我在CyberDuck中使用了一个来自供应商的.PPK文件。我有一个用户名。我有主机名。如果我打开PPK文件,我会看到一些公用线路、专用线路和专用MAC 我是否可以访问服务器以使用我拥有的信息执行我需要执行的操作 以下是我使用的代码:使用PHP和私钥连接到SFTP,php,sftp,libssh2,Php,Sftp,Libssh2,我读了一篇又一篇的文章,就是找不到适合我的“解决方案” 我正在尝试使用php脚本通过SFTP上传文件。我已经成功地使用CyberDuck连接,但我需要通过编程来实现这一点 我在CyberDuck中使用了一个来自供应商的.PPK文件。我有一个用户名。我有主机名。如果我打开PPK文件,我会看到一些公用线路、专用线路和专用MAC 我是否可以访问服务器以使用我拥有的信息执行我需要执行的操作 以下是我使用的代码: <?php if (!function_exists("ssh2_connect"))
<?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已安装在我的Web主机上
感谢您提供的帮助。这个问题已经很老了,但由于我一直在寻找完全相同的答案,以下是我收集到的信息 第一:将密钥格式从.ppk更改为.pem .pkk密钥是PuTTY格式的私钥 如果要将其更改为.pem格式,则需要使用以下工具安装putty工具:
sudo易于安装油灰工具
(在Mac电脑上,用自制软件安装putty软件包。对于Windows,我没有任何线索。)
然后您可以更改密钥的格式:
puttygen privatekey.ppk-O private openssh-O privatekey.pem
以防您想从该私钥中提取公钥,(您不需要回答该答案的其余部分,但以防万一),这非常简单:
openssl rsa-in-privatekey.pem-pubout>publickey.pub
第二:使用sFTP登录
现在您有了privatekey.pem
,您可以使用通过SFTP进行连接。首先,使用Composer安装phpseclib:
编写器需要phpseclib/phpseclib
然后在PHP中:
需要“vendor/autoload.php”;
使用phpseclib\Crypt\RSA;
使用phpseclib\Net\SFTP;
$sftp=新的sftp('sftp.server.com');
//创建新的RSA密钥
$privateKey=新RSA();
//以防该密钥有密码
$privateKey->setPassword(“私钥密码”);
//加载私钥
$privateKey->loadKey(文件获取内容('/path/to/privateKey.pem');
//通过sftp登录
如果(!$sftp->登录('username',$privateKey)){
抛出新异常(“sFTP登录失败”);
}
//现在你可以把里面的东西列出来了
$filesAndFolders=$sftp->nlist();
//您可以更改目录
$sftp->chdir('coolstuffdir');
//获取文件
$sftp->get('remoteFile','localFile');
//使用定义的内容创建远程新文件
$sftp->put('newfile.txt','newfile content');
//放一个本地文件
$sftp->put('remote.txt',local.txt',NET\u sftp\u local\u文件);
如果您想了解更多信息,请访问。如果我可以根据Stéphane Le Sollictz回答的代码示例分享我的发现,您必须检查您的phpseclib版本。要按composer(windows)检查phpseclib版本,只需在命令提示符下键入composer require phpseclib/phpseclib,结果将显示安装后的版本 如果phpseclib版本是1.0,我建议您修改行
$sftp=newsftp('sftp.server.com')
进入$sftp=new NET_sftp('sftp.server.com')代码>
如果phpseclib版本是2.0,我建议您修改行$sftp->put('remote.txt',local.txt',NET\u sftp\u local\u文件)
放入$sftp->put('remote.txt','local.txt',sftp::SOURCE\u local\u文件)代码>
谢谢。我强烈建议您将其用于您想要实现的目标。它比php内置的ssh2函数要好得多,而且非常易于使用。您似乎不知道ssh2\u auth\u pubkey\u file
需要4个参数,而不是3个@夏洛特,我确实看到了这一点,所以我认为我有问题。我可以将PPK文件拆分为缺少的元素吗?@michael,谢谢。我会查找PPK扩展名,它表明密钥是PuTTY格式的私钥。libssh2仅适用于PKCS1格式的私钥。正如michael推荐的那样,phpseclib支持这两种方法。查看是否正在使用phpseclib,您不需要将ppk格式的密钥转换为pem。phpseclib内置了对ppk格式密钥的支持。如果您在NET\u SFTP\u LOCAL\u文件
上有错误,请尝试SFTP::SOURCE\u LOCAL\u文件