Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP和私钥连接到SFTP_Php_Sftp_Libssh2 - Fatal编程技术网

使用PHP和私钥连接到SFTP

使用PHP和私钥连接到SFTP,php,sftp,libssh2,Php,Sftp,Libssh2,我读了一篇又一篇的文章,就是找不到适合我的“解决方案” 我正在尝试使用php脚本通过SFTP上传文件。我已经成功地使用CyberDuck连接,但我需要通过编程来实现这一点 我在CyberDuck中使用了一个来自供应商的.PPK文件。我有一个用户名。我有主机名。如果我打开PPK文件,我会看到一些公用线路、专用线路和专用MAC 我是否可以访问服务器以使用我拥有的信息执行我需要执行的操作 以下是我使用的代码: <?php if (!function_exists("ssh2_connect"))

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

我正在尝试使用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已安装在我的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文件