2011-12-05 129 views
0

我是腳本世界的新手。我在使用expect腳本在遠程服務器上執行本地shell腳本時遇到問題。 使用expect腳本在遠程服務器上執行本地shell腳本(不在遠程服務器上覆制它)

VAR=$(/home/local/RD/expect5.45/expect -c " 
spawn -noecho ssh -q -o StrictHostKeyChecking=no [email protected]$HOST $CMD 
match_max 100000 
expect \"*?assword:*\" 
send -- \"$PASS\r\" 
send -- \"\r\" 
send \"exit\n\r\" 
expect eof 
") 

這是工作的罰款,如果CMD就像df -kh;top基本命令我的腳本如下。 但我需要在遠程服務器上爲其創建一個shell腳本來收集多個統計信息。 我都試過,沒有運氣

spawn -noecho ssh -q -o StrictHostKeyChecking=no [email protected]$HOST 'bash -s' < localscript.sh 

其無法領取和遠程服務器上執行localscript以下。 請幫助解決此問題。

回答

0

上次我嘗試這樣的事情時,我很快厭倦了使用expect(1)來嘗試正確響應密碼提示。當我終於花了十分鐘學會create an ssh keycopy the key to the remote system,並set up the ssh-agent使基於密鑰登錄容易實現自動化,我從來沒有麻煩遠程運行腳本:

ssh remotehost "commands ; go ; here" 

首先,檢查你是否需要創建關鍵還是,如果你已經有了一個:

ls -l ~/.ssh/id_* 

如果沒有列出的文件,然後運行:

ssh-keygen 

的d回答提示。

一旦生成你的鑰匙,將其複製到遠程系統:

ssh-copy-id remote 

最現代化的系統上運行ssh-agent(1)作爲桌面的一部分啓動;確定你是否已經得到了代理已啓動,運行:

ssh-add -l 

如果你看到的,然後你就可以走「代理沒有身份。」如果您看到「無法打開與身份驗證代理的連接」。那麼你將不得不做一些關於在你的環境中插入ssh-agent(1)的最佳位置的研究。或者,完全放棄代理商,這只是一個很好的方便。

添加您的鑰匙,或許與超時,因此只適用於一小會兒:

ssh-add -t 3600 

現在測試一下:

ssh remote "df -hk ; ps auxw ; ip route show ; free -m" 

expect(1)絕對是一個整潔的工具,而是身份驗證遠程系統使用SSH密鑰更容易(也更安全)完成。

+0

Tnx快速回復。它與ssh-key無關。因爲「ssh -q -o StrictHostKeyChecking = no $ USER @ $ HOST'bash -s' peeyushs

+0

Hrm。如果你發送命令作爲'ssh'命令的參數執行,那麼你不需要在'expect(1)'腳本中發送'exit' ... – sarnold

+0

刪除發送後它不工作。我嘗試這樣的產品ssh用戶@遠程服務器「本地腳本在遠程服務器上執行」。是否有其他出路去做同樣的事情。 – peeyushs

相關問題