【发布时间】:2022-01-09 13:29:34
【问题描述】:
我的数据供应商仅提供用于下载文件的 sftp 连接。 SFTP 的身份验证是使用正确设置的 SSH-RSA 私钥/公钥完成的。 我已经使用 SSH 使用以下 2 个命令成功下载了文件
sftp -o PORT=6010 JJEE@XX.160.XX.XX
Connected to JJEE@XX.160.XX.XX
sftp> get /BACKUP/01December2021.zip
现在为了自动化,我想使用 PHP 并尝试了 2 种方法。
方法一
<?php
if (!function_exists("ssh2_connect"))
{die("function ssh2_connect doesn't exist");}
$connection = ssh2_connect("XX.160.XX.XX","6010",array('hostkey'=>'ssh-rsa'),array());
$connect=ssh2_auth_pubkey_file($connection,'JJEE','/location/id_rsa.pub','/location/id_rsa','');
if ($connect)
{echo "\n Public Key Authentication Successful <br/>";}
else
{echo "\n Public Key Authentication failed <br/>";}
?>
这是一个简单的脚本,失败并出现 Public Key Authentication failed 错误和 PHP 警告 PHP Warning: ssh2_auth_pubkey_file(): Authentication failed for JPL_EOD using public key。我可以确认我的id_rsa.pub 和id_rsa 权限是正确的。
由于我的供应商只向我提供了 sftp 详细信息,我认为我无法通过 ssh2_connect 创建 ssh 连接。
我发现了很多关于 phpseclib 的建议,但我不想仅将 3rd 方库用于 2 行代码。 我决定使用下面的第二种方法。
方法 2
<?php
passthru('sftp -o PORT=6010 JJEE@XX.160.XX.XX && get /BACKUP/01December2021.zip');
?>
从终端打开时
php /location-to-script/method-2.php
我可以看到 Connected to JJEE@XX.160.XX.XX 显示,但是我认为第二个命令是 ssh 命令而不是 sftp 命令,因此它失败了!
我的怀疑是
- 登录后如何将第二条命令作为 sftp 命令发送以下载文件
- 如果需要,如何连续发送多个 sftp 命令
- 还有其他更好的建议吗?
提前谢谢你。
【问题讨论】:
-
“由于我的供应商只向我提供了 sftp 详细信息,我认为我无法通过 ssh2_connect 创建 ssh 连接。” – SFTP 是一个 SSH 子系统。 SFTP 下始终存在 SSH 连接。您确定
ssh2_auth_pubkey_file没有发出任何 PHP 错误/警告/提示吗? + 请发布一致的示例。您的sftp代码显示JJEE,而您的PHP 代码显示my-server-user。 -
已编辑错误详情。我确实了解SFTP 下总是有一个 SSH 连接,但是我的供应商回复了如下声明:根据我们的内部政策,不允许使用 ssh,这就是我切换到第二个的原因方法
-
这是一个常见的误解。他们肯定意味着“不允许ssh shell访问”。如果不允许 SSH,SFTP 也不会。换句话说,如果 OpenSSH
sftp有效,那么 PHPssh2_connect也必须有效(除了一些不兼容或版本问题)。 +sftp -vvv -o PORT=6010 JJEE@XX.160.XX.XX的后输出 + 顺便说一句,ssh2_connect的端口参数应该是整数,而不是字符串(尽管它可能不是问题)。