轉載▼
linux 新開一個終端並在新終端中執行命令
gnome-terminal -t
"title-name" -- bash -c "sh ./run.sh;exec bash;"
以sudo apt-get update為例
1、使用echo和管道命令
- #! /bin/bash
- echo “password” | sudo -S apt-get update
這種方法網上說是可行,不過會將密碼顯示在屏幕上,但我在ubuntu12.04上測試不成功。
2、使用文本塊輸入重定向
- #! /bin/bash
- sudo -S apt-get update<<EOF
- password
- EOF
注意:-S 是必須的
3、使用expect命令
- #! /usr/bin/expect
- set timeout 30
- spawn sudo apt-get update
- expect "password for xxx:"
- send "password\r"
- interact
1. [#! /usr/bin/expect]
這個跟bash shell 開頭一樣,是告訴系統使用那個解釋器來解釋腳本
注意:這一行需要在腳本的第一行。
2. [set timeout 30]
設置超時時間為30秒
3. [spawn sudo apt-get update]
spawn是expect內部命令,如果沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。
它主要的功能是給后面的"sudo apt-get update"運行進程加個殼,用來傳遞交互指令。
4. [expect "password for xxx:"]
這里的expect也是expect的一個內部命令。
個命令的意思是判斷上次輸出結果里是否包含“password for xxx:”的字符串,如果有則執行下一步,否則就等待一段時間后返回,這里等待時長就是前面設置的30秒
在ubuntu下輸入sudo命令,shell會提示
“[sudo]password for xxx”
這里的xxx就是你的登錄名
5. [send "password\r" ]
這里就是執行交互動作,與手工輸入密碼的動作等效。
溫馨提示: 命令字符串結尾加上“\r”,如果出現異常等待的狀態可以核查一下。
6. [interact]
執行完成后保持交互狀態,把控制權從expect交會給shell,shell就可以執行sudo apt-get update。
沒有這句的話,即使密碼已經成功輸入,也不會執行sudo命令,因為控制權還是expect手里,而expect是不能解釋apt-get update 命令的。
注意:ubuntu12.04默認是沒裝expect的,可以通過下面命令安裝。
sudo apt-get install expect
原文:
http://blog.sina.com.cn/s/blog_4da051a60101ag73.html