下面是完成公鑰分發的乙個過程
第乙個方法
[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...