我试过在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上做一些事情。爱它!谢谢你们帮助大家。
答案 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
}