【linux shell指令碼程式設計】expect解決指令碼互動 + shell的多程序處理
發布:tanglu2018-7-13 10:53分類: shell 標籤: bash shell
如果在沒有使用金鑰認證的情況下,想通過ssh來傳輸檔案給多個主機會面臨互動的問題,這在指令碼中是非常不友好的。要解決這個問題的話可以使用expect這個工具,它的功能就是提前把互動中需要的內容先寫好,然後在指令碼執行的時候自動輸入。通常用這個工具解決秘鑰分發的問題,之後有了秘鑰就不需要再使用它了。
1、使用yum安裝expect
1yum -y expect
2、編寫乙個使用expect解決ssh互動問題的案例
如果不需要保持互動的話可以寫成這樣的格式:
01#!/bin/expect
02spawn ssh [email protected]
03expect
05「password」 ;06}
07expect 「#」 #這裡的#其實就是登陸ssh後出現的那個提示符
08send 「useradd user1\r」
09send 「echo 123456 | password --stdin user1\r」
10expect eof #結束expect
3、還可以在expect中使用變數,格式如下
01#!/bin/expect
02set ip 192.168.1.100
03set user root
0405
spawn ssh use
r@
user@
user
@ip #讓expect處理該會話,引用了變數
0607
expect
09「password」 ;10}
4、還可以使用位置變數進行傳參,括號內是固定格式,不用做變動,0代表第乙個引數,以此類推,
01#!/bin/expect
02set ip [lindex $ar** 0]
03set user [lindex $ar** 1]
0405
spawn ssh use
r@
user@
user
@ip #讓expect處理該會話,引用了變數
0607
expect
09「password」 ;10}
5、最後使用expect執行指令碼
1expect expect.sh
示例:使用expect批量推送公鑰
可以看到該指令碼在for迴圈中用到了{}&這樣的組合,這是使用多程序的方式在執行迴圈,然後使用wait等所有執行緒都執行完畢後進行最後的finish。使用多程序執行指令碼時需要注意的是要結合命名管道(使用mkfifo命令建立命名管道)來控制程序的數量,否則執行大批量操作時會出錯
檢視原始碼列印?
01#!/usr/bin/bash
02
ip.txt0503password=yourpassword
04
rpm -q expect &>/dev/null
06if [ $? -ne 0 ];then
07yum -y install expect
08fi
0910
if [ ! -f ~/.ssh/id_rsa ];then
11ssh-keygen -p 「」 -f ~/.ssh/id_rsa
12fi
1314
for i in
15do
1627}28
expect eof
29eof
30fi
31}&
32done
33wait
34echo 「finish…」
shell中Expect的程式互動
一般來說,我們在編寫shell指令碼時都是自動執行的,如果涉及到與使用者的交付,如遠端ssh終端輸入使用者名稱 密碼。有時我們需要編寫的指令碼自動執行,而不需要人工干預,選擇expect實現是乙個很好的方式。來乙個簡單的例子 hello.sh bin sh echo n what s your na...
expect常用方法shell
1.usr bin expect 告訴作業系統指令碼裡的 使用那乙個 shell 來執行。這裡的 expect 其實和 linux 下的 bash windows 下的 cmd 是一類東西。注意 這一行需要在指令碼的第一行,從而告知作業系統採用 expect 作為 shell 執行指令碼。注意 當使...
七 shell程式設計 expect
1.expect 前言觀察ssh登入的互動現象,有些程式難以避免的需要互動。如何解決指令碼與程式的互動問題。expert就是專門解決指令碼和程式之間的互動問題 語法 spawn expect的內部命令,啟動乙個shell程式 expect 期望哪些內容 yes no 就send傳送yes。r表示回車...