Ssh

PHP exec期望腳本與SCP然後SSH

  • January 1, 2014

我有一個 PHP 頁面,它執行以下期望腳本將文件上傳到我網路上的另一台伺服器:

#!/usr/bin/expect -f

set password [lindex $argv 0]

spawn /usr/bin/scp /home/Dave/bin/test root@192.168.1.1:/etc/test

expect {
   -re ".*yes.*no.*" {
       exp_send "yes\r"
       exp_continue
   }
   -re ".*password.*" {
       exp_send "$password\r"
   }
}

expect eof

但是,在執行此操作之前,我需要備份伺服器上的現有文件:

cp /etc/test /etc/test.bak

上傳文件後,我需要重新啟動讀取文件的服務:

/etc/init.d/testservice restart

三次通過 SSH 連接到伺服器似乎很愚蠢。我怎樣才能一次完成這一切?是否有一個 PHP 函式可以為我處理部分或全部這些問題?

編輯:提示使用者輸入密碼是一項要求。

您可以通過執行單個 SSH 命令來做到這一點,但是很難管理數據傳輸、命令執行和控制邏輯的適當組合。

建立 SSH 連接更容易,使用任何適合您的ssh, scp, sftp, rsync, sshfs, … 的組合來完成您的工作,最後關閉 SSH 連接。

SSH 提供了一個其他 SSH 程序可以搭載的連接:主連接。啟動主連接並保持執行:

ssh -N -M

將憑據作為輸入傳遞給期望,因為您需要提供密碼。然後根據需要執行其他 SSH 命令。當您不再需要連接時,執行ssh -O exit.

要確保 SSH 命令將成為現有主連接的從屬(因此不需要身份驗證),請將相同的ControlPath選項傳遞給所有 SSH 呼叫。將其作為命令行選項傳遞(-o ControlPath=…注意小寫)或在~/.ssh/config. 該值是 ssh 將創建或查找允許從屬設備和主設備通信的套接字的路徑;它需要位於支持命名套接字的文件系統上的可寫目錄中,並且每個連接的名稱必須是唯一的(因此它應該包括目標主機、埠和使用者)。

另請參閱使用已建立的 SSH 通道SSH 輕鬆將文件複製到本地系統

引用自:https://unix.stackexchange.com/questions/107250