ssh2与php

时间:2018-02-14 15:24:15

标签: php ssh

我试过在stackoverflow上找到答案,但无法找到我的确切答案。所以我在这里问。

我正在尝试使用php over ssh从服务器A连接到服务器B.

我在服务器A上创建了一个密钥,存储在/root/.ssh/id.rsa(和id_rsa.pub)中 我已将公钥上传到服务器B并将其重命名为' testomgeving.pub'在/root/keys/testomgeving.pub位置。这是因为我有来自多个用户的多个连接。

我添加并双重检查它已添加到/root/.ssh/authorized_keys

可以使用常规的ssh连接。

然后我尝试使用来自php.net的命令

$connection = ssh2_connect(
    $_ip_adress_without_any_prefix,
    22);

ssh2_auth_pubkey_file(
    $connection,
    $_default_user,
    $_public_key_file,
    $_private_key_file);

ssh2_scp_send(
    $connection,
    'sending filename',
    'receiving filename',
    0644);

但是我得到错误,参数1需要是一个资源,但是给出了一个布尔值。

据我所知,这些错误可以忽略不计。但是,没有文件正在发送。

我怀疑它与密钥及其管理方式有关。

起初我尝试使用受密码保护的私钥(最安全的方式),但看到它有bug,所以重新开始使用没有密码的私钥。

仍然没有效果。 ssh连接仍然可用,现在没有密码就可以了。

我怀疑它与www-data组无法读取私钥有关。

我发现另一个主题(在我的浏览器历史记录中很远的地方)使用以下代码检查是否可以读取它。

$prv_key = file_get_contents($_private_key_file);
print "<pre>";
var_export($prv_key);
print "</pre>";

我已经尝试使用chown www-data /root/.ssh/id_rsa获取www-data的访问权限,但它只打印出false,我认为这意味着它无法读取文件。我希望我能找到解决方案,或者我完全错了。

我不确定的另一件事是$ _public_key_file和$ _private_key_file应该是什么。 由于不共享私钥文件,我认为必须是发送服务器(服务器A)。 我不确定的公钥。它是服务器B上的/root/keys/testomgeving.pub。还是服务器A上的/root/.ssh/id_rsa.pub。或者我应该在服务器B上生成一个密钥对并引用它某种方式? (这最后看起来很不寻常,但是,我仍然坚持选择要弄清楚如何)

我知道,它似乎已经关闭了#39;在将它放在服务器B之后重命名id_rsa。但是,我正在编写一个从多个服务器调用的代码,因此从serverA我想要一个通用名称,并且为了区分serverB上的公钥的名称我重命名它们,添加我需要授权_密码。

我希望任何人都可以帮我解释一下,这样我终于可以连接到服务器了,克服了这个瓶颈!提前致谢。

更新已解决的问题
thanx到评论我意识到我必须为我的www-data用户创建ssh密钥生成。

简而言之。代码本身有效。

sudo -u www-data ssh-keygen -t rsa

它创建了/var/www/.ssh(不在httdocs中),我可以将其称为我的公钥和私钥文件。整件事情奏效了。我得到了一个连接,我从serverA上的php脚本开始在serverB上做一些事情。爱它!谢谢你们帮助大家。

2 个答案:

答案 0 :(得分:0)

通常,/ root被读取保护。即使允许用户阅读该文件,也不会自动允许他们阅读该目录。

Root和www-data是不同的用户,我无法想到将www-data密钥放在/ root中的令人信服的理由。把它放在www-data可以访问的地方,当然在公共htdocs中不是。从粗略的概述,其他一切似乎都很好。

如果您仍然有错误,请挖掘您的日志。猜测错误可能是什么,不是一种可行的调试方法!如果您有错误消息,请始终包含问题。如果不是......找一个!

祝你好运。

答案 1 :(得分:0)

parameter 1 needs to be a resource, but a boolean is given似乎$_ip_adress_without_any_prefix实际上并不存在,并且对ssh2_connect()的调用无法返回资源

首先,您需要确保连接正常。之后,您可以继续执行后续步骤

$connection = ssh2_connect('your_valid_host_name',22);
//note that http or https or www in a valid host name is not normally used

if($connection){
   //your authentication code here
}else{
   //connection fail
}