ssh執行遠程操作
命令格式代碼如下:
$port : ssh連接端口號
$user: ssh連接用戶名
$ip:ssh連接的ip地址
cmd:遠程服務器需要執行的操作
ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyChecking=no $ip “command”
1 ConnectTimeout=3 連接時超時時間,3秒
2 ConnectionAttempts=5 連接失敗后重試次數,5次
3 PasswordAuthentication=no 是否使用密碼認證,(在遇到沒做信任關系時非常有用,不然會卡在那里)
4 StrictHostKeyChecking=no 第一次登陸服務器時自動拉取key文件,(跟上面一樣,並且在第一次ssh登陸時,自動應答yes)
5 ServerAliveInterval=60 設置保持連接時間,即為了保持會話,每隔60s向服務端發一次信號。
准備工作
基於公私鑰認證或者用戶名密碼認證能確保登錄到遠程服務器(有點基本運維知識的人做這個事情都不是問題)
cmd如果是腳本,注意絕對路徑問題(相對路徑在遠程執行時就是坑)
配置ssh免登錄:
首先找一台管理機(隨便那台機器什么配置都可以,只要能和遠程執行的機器通信就行)
(1)ssh-keygen -t rsa. ###生成公鑰/私鑰對
(2)ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.162 ###拷貝到遠程機器上,自動把cat id_rsa.pub >> .ssh/authorized_keys步驟執行。在對方目錄下就會看到authorized_keys,否則,拷貝過去要手動執行這個命令
不足
這個命令可以滿足我們大多數的需求,但是通常運維部署很多東西的時候需要root權限,但是有幾處限制:
遠程服務器禁止root用戶登錄
在遠程服務器腳本里轉換身份用expect需要send密碼,這樣不夠安全
示例腳本
#!/bin/bash
#變量定義
ip_array=("192.168.0.162") ##主機列表可以寫在括號里,多個主機空格分割,也可以寫個文件-主機清單
user="root"
remote_cmd="/etc/init.d/sshd restart"
port="22"
#本地通過ssh執行遠程服務器的腳本
for ip in ${ip_array[*]}
do
ssh -t -p${port} ${user}@${ip} "${remote_cmd}" >> /var/log/ssh.log
done