ssh執行本地腳本
㈠ 在腳本中使用ssh時的幾個注意事項
1. 超時設置
-o ConnectTimeout=3
2. 重定項標准輸入到/dev/null
-n
當使用這樣的形式時 (使用 key 認證):
while read line ; do ip=$(awk '{print $1}' < << $line ) ssh -n -o ConnectTimeout=3 $i uptime done < file
假如此時不使用 -n ,則只有第一行會被處理。
3. 批處理模式,在腳本中使用再合適不過(使用 key 認證)
-o BatchMode=yes
當 key 認證不成功時,有可能會彈出「密碼認識」,從而影響腳本運行下去,此時可以打開 BatchMode模式。
4. 遇到未知主機:
-o StrictHostKeyChecking=no
當遇到未知的主機公鑰時,自動接受key。
5. 糟遇遠程主機連接後無響應:
當設置了 BatchMode 時 ServerAliveInterval 默認被設置成 300 秒(服務端無數據傳回的持續時間)。
ServerAliveCountMax相當於是重試的次數,比如下面的例子,15秒 x 3 = 45 秒,即當 45 秒後,真正超時斷開。
TCPKeepAlive打開時,便於發現網路的斷開。當網路故障(比如路由器壞掉)或者遠端開機、死機時,連接會主動斷開,否則的話,將會等待相當一段時間後才會斷開。
-o ServerAliveInterval=15
-o ServerAliveCountMax=3
-o TCPKeepAlive=yes
需要注意的是,這里的超時、無響應,僅是 ssh或者sshd無影響,假如是在遠程上執行程序,程序無響應,則不能處理此時的超時,解決方法見《在Shell中實現非同步》。
scp file yonghuming@伺服器 :/路徑
把本地文件 file 傳送到 伺服器 的 /路徑 下。
然後就可以遠程執行了。
㈢ 怎麼在一個shell腳本中執行遠程主機的另一個shell腳本 ssh已經可以無密碼登錄了。
假設你要操作的是遠程伺服器
IP為:1.1.1.1
操作的腳本是 :/home/a.sh
操作命令為
ssh 1.1.1.1 「/bin/bash /home/a.sh」
㈣ shell本地腳本調用遠程腳本,當遠程腳本執行完再繼續執行本地腳本
#!/bin/bash
#調用expect腳本執行遠程sh
expect-c'
settimeout10000
spawnsshusr@ip
expect{
"yes/no"{send"yes ";exp_continue}
"*assword"{send"passwd "}
}
expect"#"
send"sh1 "
expect"#"
'
echo
ls-l
其中timeout時間需要設置足夠長,不然會連接超時斷掉。
或者你配置了rsh,可以把上面的expect過程替換成rsh [Host] [-l UserName] [-n] [Command]