最近寫自動安裝腳本遇到redis-server安裝的時候,需要輸入3個回車,對此嘗試無果,最后google比較滿意的解決辦法:
shell 腳本需要交互,比如輸入回車,輸入YES/NO Y/N之類進行選擇
Linux 中shell腳本運行時經常需要進行交互,比如安裝軟件的過程中對license聲明的確認,需要輸入yes,回車之類的確認信息。這個在自動化安裝的時候就會是個問題。
1、通常對於這個問題比較靈活的解決方法就是TCL的Expect。但Expect還需要另外安裝,平台通用性不高,比較麻煩。
2、另外一些簡單的方法倒也是有,不過可用性不高,特別是對要求多次交互就吃力了。但怎么說其還是能解決大多數的問題,因為復雜的情況還是比較少的。
比如要一個調用一個安裝腳本 : installWAS.sh, 這個腳本要求輸入回車,
則可以:echo | installWAS.sh;如果要求輸入yes|no,加回車,則可以
echo yes|installWAS.sh. 這下自動化安裝就有希望了。
再有一下的代碼也可以帶來一些思路:
[0 No.2015 huan@huan ~/tmp]$ cat foo
read -s -n1 -p "Press any key to continue ... "
echo "Your inputs: $REPLY"
[0 No.2016 huan@huan ~/tmp]$ ./foo < /dev/null
Your inputs:
[0 No.2017 huan@huan ~/tmp]$
最后具體實現:
[root@localhost opt]# cat cache.sh
#!/bin/bash
yum install -y gcc-c++ tcl
cd /opt
#cache
wget http://download.redis.io/releases/redis-3.0.0.tar.gz
#------------------------------------------------------------------------------------#
#編譯源程序
tar xf redis-3.0.0.tar.gz
cd redis-3.0.0
make && cd src && make install
cd /opt/redis-3.0.0/utils
echo | /bin/bash install_server.sh
mv /etc/redis/6379.conf /etc/redis/redis.conf
mv /etc/init.d/redis_6379 /etc/init.d/redis
sed -i "s@6379.conf@redis.conf@" /etc/init.d/redis
sed -ine "65s/# bind 127.0.0.1/bind 0.0.0.0/" /etc/redis/redis.conf
sed -ine "393 i\requirepass Bs123456A" /etc/redis/redis.conf
#默認情況下,redis不是在后台運行的,我們需要把開啟的redis后台運行,將daemonize的值改為yes
echo "vm.overcommit_memory=1">>/etc/sysctl.conf
sysctl -p
[root@localhost opt]#