shell中expect解決互動問題

2021-09-27 08:28:45 字數 1901 閱讀 3711

【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.txt

03password=yourpassword

04

05

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表示回車...