shell指令碼和expect指令碼完成批量操作

2021-08-15 19:30:43 字數 2724 閱讀 3029

下面是完成公鑰分發的乙個過程

第乙個方法

[root@centos ~]# useradd test -u 9999 #增加名為test的使用者,並且指定使用者id號為9999

[root@centos ~]# echo "test"|passwd --stdin test #設定使用者test的密碼為 test

changing password for user test.

passwd: all authentication tokens updated successfully.

[root@centos ~]# /bin/cp /etc/sudoers /etc/sudoers.bak #備份sodoer檔案

[root@centos ~]# echo "test all=(root) nopasswd:/usr/bin/rsync" >>/etc/sudoers #使普通使用者可以具有超級使用者許可權而又不用輸密碼,當執行rsync命令時,請輸入sudo rsync

[root@centos ~]# tail -1 /etc/sudoers #檢查是否正確輸入到sudoers檔案中

test all=(root) nopasswd:/usr/bin/rsync

切換到test使用者建立金鑰

安裝expect

[root@centos ~]# yum install expect* -y

編寫指令碼

[test@centos ~]$ vim test.exp

#!/usr/bin/expect

if  

#define var

set file [lindex $argv 0]

set host [lindex $argv 1]

set password "123456"

spawn ssh-copy-id -i $file  test@$host

expect

"password"

}expect eof

[test@centos ~]$ vim test_key.sh

#!/bin/sh

. /etc/init.d/functions

for ip in `cat hostslist.txt`

doexpect test.exp ~/.ssh/id_dsa.pub $ip >/dev/null 2>&1

if [ $? -eq 0 ];then

action "$ip" /bin/true

else

action "$ip" /bin/false

fidone

執行指令碼結果如下

[test@centos ~]$ sh test_key.sh

[root@centos ~]# su - test

[test@centos ~]$ ll /home/test/.ssh/

total 4

-rw------- 1 test test 602 sep 21 12:14 authorized_keys

指令碼的作用是依據hostslist.txt檔案中所列的主機位址(用換行標識),向每一台主機分發公鑰。

中間加入下,這裡解釋下action 內建函式

action()

$# 是傳給指令碼的引數個數 

$0 是指令碼本身的名字 

$1 是傳遞給該shell指令碼的第乙個引數 

$2 是傳遞給該shell指令碼的第二個引數 

$@ 是傳給指令碼的所有引數的列表 

$* 是以乙個單字串顯示所有向指令碼傳遞的引數,與位置變數不同,引數可超過9個 

$$ 是指令碼執行的當前程序id號 

\$? 是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤

測試**

#!/bin/bash

. /etc/init.d/functions

action_test()

action_test

執行後action_test status                                         [  ok  ]

寫一段測試**

該測試**存為free_test.exp,加上執行許可權,chmod +x free_test.exp

#!/usr/bin/expect

send_user $argc

if

set host [lindex $argv 0]

spawn ssh 使用者名稱@$主機名

expect

}expect eof

執行 ./free_test.ext 主機名 ,應該可以順利執行 free -m 命令

第二個方法 

需要在系統中安裝sshpass,具體**如下,

#!/bin/bash

for hostname in $(cat hostslist.txt)

do #sshpass -p "密碼" ssh-copy-id -o stricthostkeychecking=no 使用者名稱@$

/usr/bin/sshpass -p "密碼" /usr/bin/ssh-copy-id -i /home/使用者名稱/.ssh/id_rsa.pub -o stricthostkeychecking=no 使用者名稱@$

echo "ssh-copy-id to $主機名"

done

其中 hostslist.txt 格式為

1.1.1.1

2.2.2.2

3.3.3.3

shell指令碼嵌入expect和awk命令

網上查了好多資料 感覺也沒怎麼看明白 哭暈在廁所 我這智商是不是得轉產品去了額。主要是因為寫了好幾個版本 最後把能用的都改瞎了 看來還得再寫幾個別的 總結總結才好 總之 注意幾點 1 expect 塊裡面末尾需要寫 interact 但是我寫了這句話不太好使 可能是因為有eof的原因?或 send ...

shell指令碼之expect語句

在編寫shell指令碼時,我們可能會遇到一些互動式的情況,如passwd ssh等等指令碼時,常常需要手動進行互動。這樣,原本為了實現自動部署的指令碼顯得有些不大方便,這時你就會用上expect命令了。expect命令可以幫你把互動式命令變成非互動式。expect 有期待 期望的中文意思。正如它的中...

shell指令碼巢狀執行expect命令

1.expect命令說明 為避免反覆呼叫,可以巢狀執行 相關命令 spawn 啟動乙個程式或程序 send 給程序或程式返回結果 expect 接受程式或程序輸出 interact 使使用者處於程序或程式的互動狀態,ssh登入後不自動登出 2.shell中巢狀expect命令 bin bash sq...