Pages - Menu

2020年12月13日 星期日

[php] exec ssh 發生 Host key verification failed 錯誤,找坑記

前言

前幾天一直在找php的exec坑, 最後終於解了, 記錄一下。

正文

首先來段code, 這段的用途是要把 檔案從A 複製到 B , 如果直接在A執行 scp 的指令,是正常的。

<?php
exec("scp -i /var/www/.ssh/id_rsa -r /var/www/html/WebService/upload/tmp/fe8abe8e88fb3a2d88cc17a45a7575b1.png www-data@10.7.0.17:/var/www/html/tmp/ 2>&1", $output, $return_var);
print_r($output);
echo "return" .$return_var;
echo "<br>";
exec("ssh -i /var/www/.ssh/id_rsa www-data@10.7.0.17 2>&1", $output,$return_var);
print_r($output);
echo "return:".$return_var;
?>

這段程式,有額外加上 2>&1  這是將錯誤印出來的方式
>
使用 2>&1, 命令就會輸出shell執行時的錯誤到$output變量, 輸出該變量即可分析。
備註: exec有3個參數,第一個是要執行的命令,第二個是參數是一個數組,數組的值是由第一個命令執行後生成的,第三個參數執行的狀態,0表示成功,其他都表示失敗。

(ref. https://blog.csdn.net/zy112289/article/details/52671373)

然後終於有錯誤訊息了,這個錯誤卻讓我很慌....
Host key verification failed

查了一下是驗證的錯誤,都說基本上就是刪除 known_host 就好了。
但刪了主機、本機都一樣
(ref. PHP的exec()函數無返回值排查方法)。

使用find 去尋找所有的*.pub檔案,根據裡面的內容做修改,並在主機及本機加上權限
(ref. [教學] 產生SSH Key並且透過KEY進行免密碼登入)
/var/www/.ssh/id_rsa,有參照之前主機設定,權限設定成 www-data(此時我沒注意到,另一個關鍵點)。

解決方案
1.先登入最高權限
sudo -i
2.切換成www-data
su www-data
3.先連線
ssh 10.7.0.17

釐清原因
1. 一開始我以為只要是使用者帳號,都應該會在 home底下有使用者的資料夾,但不知道www-data,
不會建立這個資料夾,預設截取 /var/www/.ssh的 id_rsa
2. exec 可能讀不到 /var/www/.ssh/id_rsa 的檔案
3. ssh的機制是這樣的,假設A要連線到B,要連線的話,須將 A的 .pub 金鑰,複製到B的 authorized_keys。
第一次進入時,會將A金鑰記憶再B的known_host上,讓日後A可以快速連線。

所以,只要連線過一次,就會記憶目前的金鑰到主機上,日後就能夠直接使用IP連線
程式會像以下,不再需要-i ,預設就會抓id_rsa來使用。

<?php
exec("scp -r /var/www/html/WebService/upload/tmp/fe8abe8e88fb3a2d88cc17a45a7575b1.png 10.7.0.17:/var/www/html/tmp/ 2>&1", $output, $return_var);
print_r($output);
echo "return" .$return_var;
echo "<br>";
exec("ssh  10.7.0.17 2>&1", $output,$return_var);
print_r($output);
echo "return:".$return_var;
?>

沒有留言:

張貼留言