1. 程式人生 > 實用技巧 >Linux遠端ssh執行命令expect使用及幾種方法

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、免互動檢視遠端主機記憶體

#!/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
檢視遠端主機記憶體

2、批量執行命令

#!/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
expect批量執行命令

#注意:發現一經執行Ctrl+C是無法停止執行的,切記執行前要做好測試

引數說明:
set:可以設定超時,也可以設定變數
timeout:expect超時等待時間,預設10S
spawn:執行一個命令
expect "":匹配輸出的內容
exp_continue:繼續執行下面匹配
\r:可以理解為回車
$argc:統計位置引數數量
[lindex $argv 0]:指令碼後第一個引數,類似於shell中$1,以此類推
puts:列印字串,類似於echo
awk -v I="$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!

需要輸入密碼