Linux的指令碼自動 互動

來源:互聯網
上載者:User

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

參考:http://my.unix-center.net/~xiaoshe/tag/expectcrontabmysql定期備份資料庫/

如下為網上轉載的其他的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指令碼為:

[root@myhost]# ./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,並作系列操作,則可以用這種方法進行自動互動。代碼如下:

  [yjwan@test ~]$ 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的自動登陸沒有這樣的自動輸入密碼的參數

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.