我有一個bash腳本來完成幾個任務,包括python manage.py syncdb
在新的數據庫上。該命令要求輸入,如管理員的登錄信息。目前,我只是每次都在命令行中輸入它。有沒有辦法讓我自動提供這些回覆作爲bash腳本的一部分?如何編寫一個bash腳本來提供另一個程序響應
謝謝,我真的不知道什麼bash。
我使用的是Ubuntu 10.10。
我有一個bash腳本來完成幾個任務,包括python manage.py syncdb
在新的數據庫上。該命令要求輸入,如管理員的登錄信息。目前,我只是每次都在命令行中輸入它。有沒有辦法讓我自動提供這些回覆作爲bash腳本的一部分?如何編寫一個bash腳本來提供另一個程序響應
謝謝,我真的不知道什麼bash。
我使用的是Ubuntu 10.10。
我在SF上回答了一個similar question,但這個更通用一些,在SO上也很好。
「你想用expect這一點。這可能已經在你的機器上[嘗試which expect
]。這是任何一種交互式命令行自動化的標準工具。這是一個Tcl庫中,所以你會得到一些的Tcl一路上免費的技巧,小心,這會讓人上癮。「
我應該提到在這種情況下,也有pexpect,這是一個Python期望的。
#!/path/to/expect
spawn python manage.py syncdb
expect "login:*"
send -- "myuser\r"
expect "*ssword:*"
send -- "mypass\r"
interact
如果有問題的程序不能從stdin
如讀取輸入:
echo "some input" | your_progam
,那麼你就需要尋找到像expect
和/或autoexepect
你可以給默認值變量。在第4行和第5行中,如果變量RSRC和LOCAL未設置,則將它們設置爲這些默認值。這樣,你可以給的選項腳本或使用默認的
#!/bin/bash
RSRC=$1
LOCAL=$2
: ${RSRC:="/var/www"}
: ${LOCAL:="/disk2/backup/remote/hot"}
rsync -avz -e 'ssh ' [email protected]:$RSRC $LOCAL
你能做到這樣,給出的例子login.py
腳本:
if __name__ == '__main__':
import sys
user = sys.stdin.readline().strip()
passwd = sys.stdin.readline().strip()
if user == 'root' and passwd == 'password':
print 'Login successful'
sys.exit(0)
sys.stderr.write('error: invalid username or password\n')
sys.exit(1)
好credentials.txt
root
password
壞credentials.txt
user
foo
然後你就可以自動完成登錄使用:
$cat good-credentials.txt | python login.py
Login successful
$cat bad-credentials.txt | python login.py
error: invalid username or password
這種方法的下側是你以純文本格式,這是不是偉大實踐中存儲密碼。
我相信Python正在從stdin中讀取數據。 – 2011-01-19 03:57:55