1. 程式人生 > >Linux Shell自動互動的三種方法

Linux Shell自動互動的三種方法

四、自動互動方法一

自動互動最關鍵的就是互動資訊的自動輸入,首先聯想到檔案重定向,在shell程式設計中有這樣一種用法(參考Linux與UNIX SHELL程式設計指南 chapt 5.7):"command << delimiter  從標準輸入中讀入,直至遇到delimiter分界符。"

重定向操作符command << delimiter是一種非常有用的命令,shell將分界符delimiter之後直至下一個同樣的分界符之前的所有內容都作為輸入,遇到下一個分界符, shell就知道輸入結束了。最常見的delimiter分界符是EOF,當然完全可以自定為其他字元。

對於需求1 要求的自動登陸ftp,並作系列操作,則可以用這種方法進行自動互動。程式碼如下:

  1. #!/bin/bash  
  2. ftp -i -n 192.168.167.187 << EOF 
  3. user hzc 123456  
  4. pwd  
  5. cd test  
  6. pwd  
  7. close  
  8. bye  
  9. EOF 

測試可以發現,如上程式碼使用帳號名hzc,密碼123456成功登陸了ftp伺服器,並進入目錄,打印出了pwd。

五、自動互動方法二

需求2中要求採用非互動的方式改變登入使用者密碼,嘗試用方法1,無法實現。

這時候聯想到互動資訊的另一個自動輸入方法,管道,通過echo + sleep + | 可以實現這個需求。

  1. #!/bin/bash  
  2. (echo "curpassword"  
  3. sleep 1  
  4. echo "newpassword"   
  5. sleep 1  
  6. echo "newpassword")|passwd 

測試通過,執行這個指令碼,直接把當前使用者的curpassword改成newpassword。

六、自動互動方法三

需求3中要求自動登入root賬號,嘗試方法1和方法2,都出現錯誤提示standard in must be a tty。

這時候嘗試尋找外部幫助,一個shell工具expect可以實現這個功能,其實expect就是一個專門用來實現自動互動功能的工具,expect的語法可以參考相關資料,程式碼如下:

  1. #!/usr/bin/expect  
  2. spawn su root  
  3. expect "password: "  
  4. send "123456/r"  
  5. expect eof  
  6. exit 

測試通過,執行這個指令碼,直接從當前使用者登入到root使用者。

七、方法總結

方法一(重定向)簡單直觀,也經常有實際應用,但是在自動互動領域功能有限。

方法二(管道)也很簡單直觀,有時甚至不用sleep配合就能展現強大的自動互動實力,但是在某些時候也束手無策。

方法三(expect)在功能上是最為強大的,expect本來就是為實現自動互動功能而生,但是缺點是需要安裝expect包,在嵌入式等環境下難以安裝。

三個方法各有優劣,應用的好,都可以完成Linux Shell自動互動。

========================================================

#!/usr/bin/expect -f

set password 密碼

spawn scp 使用者名稱@目標機器ip:拷貝檔案的路徑 存放本地檔案的路徑
set timeout 300
expect "使用者名稱@目標機器ip's password:" #注意:這裡的“使用者名稱@目標機器ip” 跟上面的一致
set timeout 300
send "$password/r"
set timeout 300
send "exit/r"

expect eof

========================

linux下安裝expect解決方法

需要兩個安裝程式
tcl8.4.13-src.tar.gz  下載:http://download.chinaunix.net/do ... rceID=22&site=1
expect-5.43.0.tar.gz    下載:http://download.chinaunix.net/do ... eID=2845&site=1

首先安裝tcl8.4.13
Tcl 的 configure 指令碼有一個語法錯誤,下面的命令可以糾正它:
sed -i "s/relid'/relid/" configure
編譯tcl
cd unix
./configure --prefix=/ixdba.net
make
make install
需要的內容都拷貝到/tools目錄,

安裝完畢完先不要刪除原始碼,以會安裝expect還要用到

將/ixdba.net目錄export到環境變數,

接著,就是編譯expect了,解壓gz包就不說了

./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no

如果報
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can't find Tcl private headers

就再新增一個頭檔案目錄引數
--with-tclinclude=../tcl8.4.11/generic
./configure --prefix=/etc/expect --with-tcl=/etc/lib --with-x=no --with-tclinclude=/usr/local/src/tcl8.4.13/generic
generic在tcl原始碼裡

指令碼執行正常,進行執行make進行編譯
make
編譯過程中未出現錯誤,執行安裝:
make install

編譯完成後會生在剛才tcl編譯時生成的目錄/ixdba.net生成expect命令,
此時在命令列執行expect應該可以執行了!

下面就可以做expect的工作了!

==========================================

Expect [is a] software suite for automating interactive tools。使用它系統管理員的可以建立指令碼用來實現對命令或程式提供輸入,而這些命令和程式是期望從終端(terminal)得到輸入,一般來說這些輸入都需要手工輸入進行的。

檢查系統,發現tcl已經安裝了。

[[email protected] ~]# rpm -qa|grep tcl
tcl-8.4.13-3.fc6
tclx-8.4.0-5.fc6

後來才發現,因為expect需要重新編譯後安裝,那麼就需要tcl的開發包。

rpm -ivh --force tcl-devel-8.4.13-3.fc6.i386.rpm

然後將expect-5.43包解開,開始讀INSTALL文件,系統管理員告訴我,不用讀,直接執行 ./configure --help開引數。確實好使,又土了一次 :-( 。

1.首先確定tcl開發包安裝的位置
rpm -qpl tcl-devel-8.4.13-3.fc6.i386.rpm|more

2.然後根據引數,執行./configure
./configure --with-tcl=/usr/lib --with-tclinclude=/usr/include/tcl-private/generic

3.執行
make

4.執行
make install

完成第四步後,expect順利安裝成功。

================================

linux安裝expect終極解決方法

安裝總結
需要兩個安裝程式
tcl8.4.11
expect-5.43
首先安裝tcl8.4.11
Tcl 的 configure 指令碼有一個語法錯誤,下面的命令可以糾正它:
sed -i "s/relid'/relid/" configure
編譯tcl
cd unix
./configure --prefix=/tools
make
make install
需要的內容都拷貝到/tools目錄,
!!!!安裝完畢完先不要刪除原始碼,以後還要用到
將標頭檔案目錄export到環境變數,
cd ..
export TCLPATH='pwd'
不曉得為什麼我在configure時還是報找不到標頭檔案的錯誤
建一個必須的符號連結
ln -sv tclsh8.4 /tools/bin/tclsh

好了,下面就是編譯expect了
我用的是
./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no
如果報
checking for Tcl private headers... checking for tclInt.h... no
configure: error: Can't find Tcl private headers
再新增一個頭檔案目錄引數
 --with-tclinclude=../tcl8.4.11/generic
指令碼執行正常,進行執行make進行編譯
make
編譯過程中未出現錯誤,執行安裝:
make install

========================================================

相關推薦

實現Linux Shell自動互動方法----本人備註

spawn su root   expect password:   send 123456r  expect eof  exit     測試通過,執行這個指令碼,直接從當前使用者登入到root使用者。 七、方法總結 方法一(重定向)簡單直觀,也經常有實際應用,但是在自動互動領域功能有限。 方法二(管道

Linux Shell自動互動方法

四、自動互動方法一 自動互動最關鍵的就是互動資訊的自動輸入,首先聯想到檔案重定向,在shell程式設計中有這樣一種用法(參考Linux與UNIX SHELL程式設計指南 chapt 5.7):"command << delimiter  從標準輸入中讀入,直至遇

從U盤運行Linux操作系統的方法

attach 損壞 seo 系統 alt ubunt 沒有 linux操作 ash 摘要: 從U盤運行Linux操作系統的三種方法 usb_linux_0 你或許聽說過在U盤上運行live Linux操作系統,但你知不知道可以永久的保存運行時的數據,或者直接將Linux安裝

Linux Shell中有引號的用法

containe ubunt ref highlight 處理 alt 返回 cin test Linux Shell中有三種引號,分別為雙引號(" ")、單引號(‘ ‘)以及反引號(` `)。 其中雙引號對字符串中出現的$、‘‘、`和\進行替換;單引號不進行替換,將字符串

LInux安裝jdk的方法

環境 Linux版本:CentOS 6.5、Ubuntu 12.04.5 JDK版本:JDK 1.7 目錄 方法一:手動解壓JDK的壓縮包,然後設定環境變數 方法二:用yum安裝JDK 方法三:用rpm安裝JDK 方法四:Ubuntu 上使用apt-get安裝J

linux系統呼叫的方法

通過glibc提供的庫函式 [23:02:14] gcc chmodtest.c [23:02:17] ls -l kali //記得先建立這個檔案 -rwxrwxrwx. 1 root r

linux虛擬主機的方法

虛擬主機 虛擬主機是將一臺(或者一組)伺服器的資源(系統資源、網路頻寬、儲存空間等)按照一定的比例分割成若干相對獨立的“小主機”的技術。每一臺這樣的“小主機”在功能上都可以實現WWW、FTP、Mail

linux 磁碟掛載的方法

df 使用df命令,這個命令比較常用,大家都很熟悉。問題是這種方法,有時候掛載點和掛載的卷不在同一行,使用指令碼分析需要一點技巧的 mount 使用mount命令,mount -l,這種方法的缺陷在於沒有卷的大小,但是掛載點和掛載的卷在同一行 檢

Linux 中執行Shell 指令碼的方式(方法

Shell 指令碼的執行方式通常有如下三種: (1)bash script-name 或者 sh script-name;(2)path/script-name或者./script-name;(3)sourcescript-name或者. script-name。下面,分別

Linux中執行Shell指令碼的方式(方法

Shell 指令碼的執行方式通常有如下三種:(1)bash script-name 或者 sh script-name;(2)path/script-name或者./script-name;(3)source script-name或者. script-name。下面,分別介

Eclipse自動編譯NDK/JNI的方法

tar 項目 png variables jni space c++ 技術 and 一、Eclipse關聯cygwin 1. 工程->右擊選擇Properties->選擇Builders,在Builders中選擇New創建一個Program 2

Linux安裝軟件包的方法,rpm包介紹,rpm工具用法,yum工具用法,yum搭建本地倉庫

rpm yum 筆記內容:l 7.1 安裝軟件包的三種方法l 7.2 rpm包介紹l 7.3 rpm工具用法l 7.4 yum工具用法l 7.5 yum搭建本地倉庫筆記日期:2017.8.9 7.1 安裝軟件包的三種方法rpm工具類似於Windows的exe文件,可以直接進行安裝,而且安裝路徑和文件名

Postgresql 創建主鍵並設置自動遞增的方法

index 問題 尋找 con 默認值 來看 eat 創建 一點 Postgresql 有以下三種方法設置主鍵遞增的方式,下面來看下相同點和不同點。--方法一create table test_a ( id serial, name character varying(

Linux 添加開機啟動項的方法

ash 環境變量 wan conf mysq exe usr eno bash linux 添加開機啟動項的三種方法。 (1)編輯文件 /etc/rc.local 輸入命令:vim /etc/rc.local 將出現類似如下的文本片段: #!/bin/sh## This s

Linux-安裝軟件包的方法

固定 會同 安裝路徑 應用商店 最簡 lin 可執行 路徑和 exe Linux-安裝軟件包的三種方法 1.rpm工具這種安裝和windows的exe很想,安裝路徑和文件名,幾乎都是固定的.進行rpm安裝時,如果出現依賴關系的包,例如:a依賴b,b依賴c,則需要先安裝c,再

QT 呼叫執行 linux指令碼的方法

在linux系統下,Qt執行shell命令的方式有3種: (1)QProcess:execute("ls"); (2)system("ls"); (3)QProcess *process = new QProcess(); process->start("ls"); 注1:以上

Linux軟體安裝——mysql5.7-安裝新手入門 6、MySQL建立使用者的方法

因測試工作需要,在Linux上自搭一個mysql服務。 但對入門linux的同志,剛開始最迫切想知道的,大概一個是中文輸入法,另一個就是怎麼安裝軟體。本文主要學習了LINUX安裝軟體的特點,並完成安裝mysql的安裝作為實踐。 一、Linux軟體安裝須知: &

Linux 線程同步的方法(互斥鎖、條件變量、信號量)

另一個 雙向 fin lee ces 僅支持 lin from str 互斥鎖 1 #include <cstdio> 2 3 #include <cstdlib> 4 5 #include <unistd.h> 6

Linux字元裝置驅動註冊方法以及核心分析

       Linux驅動是使用者訪問底層硬體的橋樑,驅動有可以簡單分成三類:字元裝置、塊裝置、網路裝置。其中最多的是字元裝置,其中字元裝置的註冊方法主要有三種:雜項設備註冊、早期字元設備註冊、標準字元設備註冊。以及詳細介紹各類方法註冊。 開發環境: PC:WMwork

sh命令 /Linux中執行shell指令碼的4方法總結

bash shell 指令碼的方法有多種,現在作個小結。假設我們編寫好的shell指令碼的檔名為hello.sh,檔案位置在/data/shell目錄中並已有執行許可權。 方法一:切換到shell指令碼所在的目錄(此時,稱為工作目錄)執行shell指令碼:此種方法為阿里雲推