Linux遠程ssh執行命令expect使用及幾種方法
目錄
expect命令實現腳本免交互
一、Linux下SSH無密碼認證遠程執行命令
在客戶端使用ssh-keygen生成密鑰對,然后把公鑰復制到服務端(authorized_keys)。
實現步驟:
1、客戶端機器創建密鑰對
# ssh-keygen -t rsa #一直回車
2、登錄需要執行命令的ssh服務器,創建.ssh目錄,設置好目錄權限
mkdir /root/.ssh``chmod 700 /root/.ssh
3、公鑰上傳到服務器,重命名為authorized.keys
scp /root/.ssh/id_rsa.pub root@服務端IP:/root/.ssh/authorized_keys #id_rsa.pub可以追加多個客戶端的公鑰
4、設置ssh服務器
vi /etc/ssh/sshd_config`` ``RSAAuthentication yes #這三行取消注釋,開啟密鑰對驗證`` ``PubkeyAuthentication yes`` ``AuthorizedKeysFile .ssh/authorized_keys`` ``PasswordAuthentication no #關閉密碼驗證``service sshd restart
5、免交互登陸測試,並查看遠程主機home目錄
ssh root@服務端IP ``"ls -l /home/"
二、expect工具實現免密交互
Expect是一個免費的編程工具語言,用來實現自動和交互式任務進行通信,而無需人的干預。
CentOS安裝:yum install expect -y
CentOS離線安裝方式:https://www.cnblogs.com/tozh/p/10096688.html
安裝結束記得看一下expect的命令目錄 :which expect
1、免交互查看遠程主機內存
[](javascript:void(0)😉
#!/bin/bash
user=root
pass='Admin@123'
ip='172.20.2.89'
/usr/local/bin/expect << EOF
set timeout 30
spawn ssh $user@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$pass\r"}
}
expect "root@*" {send "free -m\r"}
expect "root@*" {send "exit\r"}
expect eof
EOF
[](javascript:void(0)😉
2、批量執行命令
[](javascript:void(0)😉
#!/bin/bash
ip=`cat /root/ip.txt`
user=root
pass=Admin@123
for i in $ip;
do
expect -c "
spawn ssh $user@$i
expect {
\"(yes/no)\" {send \"yes\r\"; exp_continue}
\"password:\" {send \"$pass\r\"; exp_continue}
\"root@*\" {send \"free -m\r exit\r\"; exp_continue}
}"
done
[](javascript:void(0)😉
參數說明:
set:可以設置超時,也可以設置變量
timeout:expect超時等待時間,默認10S
spawn:執行一個命令
expect "":匹配輸出的內容
exp_continue:繼續執行下面匹配
\r:可以理解為回車
argc:統計位置參數數量[lindexargc:統計位置參數數量[lindexargv 0]:腳本后第一個參數,類似於shell中1,以此類推puts:打印字符串,類似於echoawk−vI="1,以此類推puts:打印字符串,類似於echoawk−vI="ip":賦值變量
expect{...}:輸入多行記錄
其他參數說明:
timeout -1:永不超時退出
log_file /var/log/expect.log:記錄交互信息,一般crontab時使用
interact:交互后不退出遠程終端,如果加要把expect "root@*" {send "exit\r"}注釋掉,如果不加,就直接退出
將spawn ssh root@$ip換成spawn ssh -o StrictHostKeyChecking=no root@ip既不會再提示是否將服務器計算機密鑰加入本地known_hosts
補充:
#ssh root@$ip > /dev/null 2>&1 << eeooff
#ls /tmp/
#exit
#eeooff
#echo done!
需要輸入密碼