1. 程式人生 > >Linux的指令碼自動 互動

Linux的指令碼自動 互動

Linux的指令碼中自動登陸遠端主機方法彙總

為了方便,我寫了個指令碼自動ssh登入遠端機器,如下,這個指令碼需要安裝expect包

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

#!/usr/bin/expect
set timeout 30
spawn ssh -l root 192.168.1.117
expect "password:"
send "nopasswd/r"
interact

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

set timeout 30
設定超時時間的,計時單位:秒

spawn ssh -l root 192.168.1.117
spawn是進入expect環境後才可以執行的expect內部命令,如果沒有裝expect或者直接在預設的SHELL下執行是找不到spawn命令的。所以不要用 “which spawn“之類的命令去找spawn命令。好比windows裡的dir就是一個內部命令,這個命令由shell自帶,你無法找到一個dir.com 或 dir.exe 的可執行檔案。它主要的功能是給ssh執行程序加個殼,用來傳遞互動指令。

expect "password:"
這裡的expect也是expect的一個內部命令,expect的shell命令和內部命令是一樣的,但不是一個功能。這個命令的意思是判斷上次輸出結果裡是否包含“password:”的字串,如果有則立即返回,否則就等待一段時間後返回,這裡等待時長就是前面設定的30秒

send "nopasswd/r"
這裡就是執行互動動作,與手工輸入密碼的動作等效。
溫馨提示: 命令字串結尾別忘記加上 “/r”,如果出現異常等待的狀態可以核查一下。

interact
執行完成後保持互動狀態,把控制權交給控制檯,這個時候就可以手工操作了。如果沒有這一句登入完成後會退出,而不是留在遠端終端上。如果你只是登入過去執行一段命令就退出,可改為〔expect eof〕

注意:在crontab裡執行expect指令碼,那麼最後一句就不能是interact,應該是expect eof

如下為網上轉載的其他的shell自動互動的方法

--------------------------------------------------------------------------------
shell指令碼中如何進行自動的互動


在編寫shell指令碼的批處理程式碼時,一般只要求使用者在呼叫shell時,輸入有限的幾個引數,然後由shell進行批處理作業,在批處理作業完成之前,中途不會

有任何打斷。但是linux有些命令本身是要求進行人機互動的,命令基本上是以一問一答形式在終端上跟使用者互動,如passwd、smbpasswd,在設定某個使用者

的密碼時,傳入username引數,回車後系統要求輸入密碼,而smbpasswd還要求再次輸入確認密碼,這樣就需要人工干預2次,這個命令才能執行完畢。

      最近寫一個小工具,恰巧碰到這個問題,使用者要求提供一個shell,輸入username和埠號後,自動完成linux 使用者的建立、密碼設定、網路上的芳鄰的開

通、程式碼的檢出、apache配置、啟動等一系列操作,所有帳號中username跟passwd一致。使用者輸入shell命令敲擊回車後,便不再與系統互動,由系統自動完

成之後的所有操作。

    但由於passwd和smbpasswd兩個命令都需要使用者干預才能完成,有沒有什麼辦法不用使用者干預,由系統模擬使用者完成輸入操作呢?答案是肯定的,就是利

用linux的管道技術,通過“echo”命令進行標準輸出,然後通過管道符“|”轉換為passwd和smbpasswd的標準輸入,由此模擬人機互動,具體實現:

假設使用者呼叫shell指令碼為:

[[email protected]]# ./myshell.sh username

則在腳本里實現為:

#!/bin/sh
#Usage: myshell.sh username
userName=$1;
password=$1;

#add user and set default password
useradd $userName;
#通過設定–stdin引數,指明接受標準輸入;
echo $password | passwd - -stdin $userName;

#add samba user and set default password
#通過設定-s引數,指明使用安靜模式設定密碼
( echo $password ; echo $password  ) | smbpasswd -s -a $userName;  

  這樣的話,通過linux 的管道技術,將標準輸出通過管道轉換為某些命令的標準輸入,實現了人工輸入的模擬,從而遮蔽了人機互動,實現了完全的自動

化。


例子:
 #!/usr/bin/expect -f


set password 密碼

spawn scp 使用者名稱@目標IP:拷貝檔案的路徑 存放本地檔案的路徑

set timeout 300(s)

expect "使用者名稱@目標ip`s password:"

set timeout 300

send"$password/r"

set timeout 300

send"exit/r"

expect eof

--------------------------------------------------------------------------------

src:http://os.51cto.com/art/200912/167898.htm

你瞭解Linux系統麼?你是Linux系統的應用者麼?如果你要學習linux,你可能會遇到Linux Shell自動互動問題,這裡將介紹Linux Shell自動互動的解決方法,在這裡拿出來和大家分享一下。

一、背景

shell指令碼在處理自動迴圈或大的任務方面可節省大量的時間,通過建立一個處理任務的命令清單,使用變數、條件、算術和迴圈等方法快速建立指令碼以完成相應工作,這比在命令列下一個個敲入命令要省時省力得多。

但是有時候我們可能會需要實現和互動程式如ftp,telnet伺服器等進行互動的功能,這時候我們需要用到shell的自動互動功能,本文收集了較常用的三種自動互動方法,並進行了比較和總結。

二、需求

需求1:
從一臺Linux機器ftp登陸到另一臺Linux機器,進行系列操作後關閉,懶得每次都手動輸入密碼。

需求2:
改變登入使用者密碼,懶得每次都輸入新舊密碼。

需求3:
希望su自動登入到root賬戶,懶得每次都輸入root密碼。

三、除錯環境

終端:SecureCRT

系統:WinXP, CentOS 4.4(VmWare)

Shell:bash

注:shell有很多種,B類SHELL(sh, bash, ksh)之間行為相近;C類SHELL(csh, tcsh)之間行為相近,還有zsh和rc等shell,本文的除錯環境是bash。

四、自動互動方法一

自動互動最關鍵的就是互動資訊的自動輸入,首先聯想到檔案重定向,在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自動互動。

********************************************

但是有時候我們可能會需要實現和互動程式如ftp,telnet伺服器等進行互動的功能,這時候我們需要用到shell的自動互動功能.

  最簡單的例子就是建立使用者,我建立100個使用者,初始密碼為123,那麼要是挨著passwd  username  ,互動性輸入密碼,那不得瘋掉,但是腳本里應該

怎麼寫呢?將密碼123,輸入到passwd命令?

  本文收集了較常用互動方法,並進行了比較和總結。

  自動互動方法一:利用命令的自帶引數,將標準輸入作為手動輸入的內容

  自動互動最關鍵的就是互動資訊的自動輸入,首先聯想到檔案重定向,在shell程式設計中有這樣一種用法(參考Linux與UNIX SHELL程式設計指南 chapt

5.7):"command << delimiter  從標準輸入中讀入,直至遇到delimiter分界符。"

  重定向操作符command << delimiter是一種非常有用的命令,shell將分界符delimiter之後直至下一個同樣的分界符之前的所有內容都作為輸入,遇到

下一個分界符, shell就知道輸入結束了。最常見的delimiter分界符是EOF,當然完全可以自定為其他字元。

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

  [[email protected] ~]$ ftp -i -n 192.168.21.46 <<EOF

  user dbftp dbftp101

  ls

  EOF

  下面是得到的結果:

  Connected to 192.168.21.46.

  220 developerjail FTP server (Version 6.00LS) ready.

  331 Password required for dbftp.

  230 User dbftp logged in.

  Remote system type is UNIX.

  Using binary mode to transfer files.

  229 Entering Extended Passive Mode (|||54281|)

  150 Opening ASCII mode data connection for '/bin/ls'.

  total 8847424

  -rw-r--r--  1 dbftp  www  9055318991 Aug 28 14:28 ewiz90.sql_2010-08-29

  226 Transfer complete.

  221 Goodbye.

  測試可以發現,如上程式碼使用帳號名dbftp,密碼dbftp101成功登陸了ftp伺服器,並進入目錄,ls出當前目錄的檔案。

  注意事項:

  1  這裡一定要加-i ,否則必定失敗!!

  這裡ftp用的-I 引數 結束了互動式輸入,因此可以用文字的方式自動地輸入使用者密碼以及操作方式

  如果不用-I 引數,那麼必定要求你手動輸入密碼的!!那麼就達不到自動登陸的要求了

  你可以man ftp找到這個引數

  -i 關閉多檔案傳送中的互動式提示。請參考 prompt、mget、mput 和 mdelete 子命令,以取得多檔案傳送中的提示的描述。

  -n 防止在起始連線中的自動登入。否則, ftp 命令會搜尋 $HOME/.netrc 登入項,該登入項描述了遠端主機的登入和初始化過程。請參考 user 子命

令。

  2    舉一反三:只要是要求輸入密碼的命令,一般都帶有一個引數,允許你從標準輸入,輸入使用者密碼,以及操作。

  其他常用的自動登陸命令的引數

  1)  Passwd命令

  Linux下 Passwd有引數

  --stdin

  This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.

  所以linux下自動改變使用者密碼的辦法就是

  Echo 密碼 |passwd –stdin 使用者名稱

  Freebsd沒有以上引數 注意

  他的方法是echo passwd |pw mod user username -h 0

  2)smbpasswd

  -s

  This option causes smbpasswd to be silent (i.e. not issue prompts)

  and to read its old and new passwords from standard input, rather

  than from /dev/tty (like the passwd(1) program does). This option

  is to aid people writing scripts to drive smbpasswd

  3)sudo

  在shell指令碼中需要用root用的來執行指令:

  sudo 自動輸入密碼

  echo "password" | sudo -S netstat -tlnp

  -S

  The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.

  3  標準輸入還可以用以下兩種寫法:

  可以將下面的內容寫入到一個文字

  然後ftp  -I –n ip <文字

  或者echo  “..”  |ftp –I –n ip

  都是可以的!

  因為他們都滿足“有一個標準的輸入”這個條件

  4 ssh的自動登陸沒有這樣的自動輸入密碼的引數

  一般都是使用公鑰/私鑰的方式自動登入

相關推薦

Linux指令碼自動 互動

Linux的指令碼中自動登陸遠端主機方法彙總 為了方便,我寫了個指令碼自動ssh登入遠端機器,如下,這個指令碼需要安裝expect包 ================================ #!/usr/bin/expectset timeout 30spawn ssh -l root 19

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

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

Linux Shell自動互動的三種方法

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

centos linux 指令碼自動備份資料庫

編寫指令碼 [[email protected] service]# vi mysql_dump.sh #!/bin/sh echo "mysqldump start..." DB_NAME="imms_core" DB_USER="root" DB_PA

Linux - 通過expect工具實現指令碼自動互動

目錄 1 安裝expect工具 2 expect的常用命令 3 作用原理簡介 3.1 示例指令碼 3.2 指令碼功能解讀 4 其他指令碼使用示例

自動安裝linux指令碼

前言 當管理多臺伺服器的時候,要是裝機一個一個安就太浪費時間了,我們可以編寫一個指令碼讓自動批量裝機,省時又省力。 首先 1.安裝kickstart服務,使得自動應答指令碼的服務先存在 yum install system-config-kicstart 2.建立

Linux shell指令碼 自動輸入提示資訊或回車進行下一步操作

1.應用場景 有的時候執行安裝或操作第三方軟體時,需要輸入Yes 或者回車 才能進行下一步 例如操作sqlite [[email protected] sh]# sqlite3 anhui.db SQLite version 3.6.20 Enter ".help" fo

用expect實現shell指令碼自動互動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux】製作kickstart指令碼自動安裝linux系統

摘要:之前我們介紹了圖形介面安裝虛擬機器,這樣不適合批量操作。後來我們又介紹了指令碼安裝虛擬機器,但是也只能算是半自動安裝吧,後面依舊有很多步驟與圖形介面安裝一致。所以這次我們來介紹真正的一勞永逸,如何製作kickstart指令碼自動安裝虛擬機器。 1. kickstart簡介 ki

Linux指令碼自動安裝虛擬機器

轉載的地址:https://blog.csdn.net/gd0306/article/details/83216223 配置模板虛擬機器 這裡配置的這臺虛擬機器其實相當於一個模板,我們等會自動安裝的虛擬機器就是以這個虛擬機器為模板的 1、yum install system-conf

linux shell 自動判斷作業系統release 然後連線FTP yum源的指令碼

如何搭建本地yum源見附錄① 如何搭建FTP yum源見附錄② 指令碼正文: #!/bin/sh# CenterOS config yumosv=`rpm -q --qf %{version} centos-release`echo "您的centeros release 版本:$osv"echo -e "

Linux指令碼編寫程式監控系統資訊並設定報警自動傳送郵件

yum -y install mailx yum -y install sendmail #獲取cpu使用率 cpuUsage=`top -n 1 | awk -F '[ %]+' 'NR==3 {print $3}'` #獲取磁碟使用率 data_nam

linux,基礎篇(十三):指令碼自動安裝虛擬機器

配置模板虛擬機器 這裡配置的這臺虛擬機器其實相當於一個模板,我們等會自動安裝的虛擬機器就是以這個虛擬機器為模板的 1、yum install system-config-kickstart 2、yum install httpd start enable

Linux下使用shell指令碼自動執行指令碼檔案

一、定時複製檔案   a、在/usr/local/wfjb_web_back目錄下建立 tomcatBack.sh檔案   檔案內容: ? 1 2 #將tomcat中的應用wfjb_web 複製到 /usr/local/wfjb_web_bac

linux每天自動備份mysql指令碼

http://blog.csdn.net/phpfenghuo/article/details/29931837 定時執行指令碼: 1、執行 crontab -e 00 00 * * * /bin/bash yourpath/mysqlbak.sh 2、開啟自動執行檔

linux 指令碼實現程式自動安裝

#!/bin/bash //設定指令碼中所需命令的執行路徑 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH // $? 是取得上面執行命令的返回值,一般正確為0,錯誤為1 if [ "

Linux crontab的使用方式,sh指令碼的編寫,sh指令碼自動啟動tomcat伺服器,sh監控系統執行情況

1、如果想使用Linux crontab(類似java quartz),需要先啟動crontab.關於crontab的啟動、關閉、重啟、重新載入配置的方式如下: /sbin/service crond start //啟動服務 /sbin/service crond s

Linux Shell Bash 互動與非互動式指令碼

互動式的shell會在tty上從使用者輸入中讀取命令. 另一方面, 這樣的shell能在啟動時讀取啟動檔案, 顯示一個提示符, 並預設啟用作業控制. 也就是說, 使用者可以與shell互動. shell所執行的指令碼通常都是非互動的shell. 但是指令碼仍然可以訪問它的tty. 甚至可以在指令碼中模擬一

Linux中shell自動互動的使用

 自動互動方法二 需求2中要求採用非互動的方式改變登入使用者密碼,嘗試用方法1,無法實現。 這時候聯想到互動資訊的另一個自動輸入方法,管道,通過echo + sleep + | 可以

linux上一鍵安裝redis以及主從配置(指令碼自動安裝)

一、環境配置 1:任何位置建立資料夾 mkdir redis;cd redis;mkdir conf;cd conf #下載安裝安裝包 wget http://www.redis.cn/download.html/redis-5.0.3.tar.g