前言
前幾天一直在找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; ?>
0 意見:
張貼留言