配置Ubuntu的小脚本

sh/bash/dash/ksh/zsh等Shell脚本
回复
gjp1120
帖子: 8
注册时间: 2010-12-29 19:35
送出感谢: 0
接收感谢: 0

配置Ubuntu的小脚本

#1

帖子 gjp1120 » 2010-12-29 20:22

我写的一个小脚本,帮助配置Ubuntu,请大家看看,帮忙改改,提提新功能。。。。。。


http://u.115.com/file/f564e405d7
头像
astolia
论坛版主
帖子: 3091
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 511 次

Re: 配置Ubuntu的小脚本

#2

帖子 astolia » 2010-12-29 21:18

怎么说呢,对于新手来说,你用zenity之类的做个GUI的选择对话框会更方便,非要用命令行的话,用whiptail之类来构造界面会漂亮一点。

对于生成安装脚本这件事,我觉得只对要在多台电脑上进行安装的人有用。而且脚本你也没有加上可执行权限
另外不要在开头直接删除原来的脚本,检查一下是否已存在,提示用户一下是否覆盖/直接使用。

有些操作可以再优化一下,把所有需要安装的包用一个apt-get install中全部安装,避免重复的apt-get update之类

提示当前的配置进度情况,让人知道总共有几步,当前进行到第几步

尽量不要用版本号的软件包名,比如不要用emacs23,直接来emacs
gjp1120
帖子: 8
注册时间: 2010-12-29 19:35
送出感谢: 0
接收感谢: 0

Re: 配置Ubuntu的小脚本

#3

帖子 gjp1120 » 2010-12-30 13:24

楼上,我仔细阅读了你的回复。

关于你说的:
1.我是一个超级新手,技术并不好,但我会尽力注意的。

2.关于生成安装脚本,这个是深思熟虑过的,因为我想把所有的过程放在一起执行,减少交互时间。

3.关于为什么要使用多次apt-get update,这个已经在其中注释中指出,不愿让用户不小心升级到不稳定版本,而我还不会在命令行中删除某个源。(这个比较寒)

4.关于进程提示,我目前还想不到怎样写比较好。

5.软件包的版本号,这个问题我也想过,可我担心为某些用户误装了命令行版的。

6.其实我还想是否用gksu代替sudo,这样也许更好。

7.有一些功能还未实现,可以在注释中看到

8.部分高级功能还不知道怎样写。

9.关于执行权限,这个,自己chmod +x就行吧,我是直接上传的脚本,下载下来后没有执行权限是正常的阿。
emptyhua
帖子: 18
注册时间: 2008-06-10 12:31
送出感谢: 0
接收感谢: 0
联系:

Re: 配置Ubuntu的小脚本

#4

帖子 emptyhua » 2010-12-30 16:45

我也写过一个,希望对你有参考价值:

代码: 全选

#!/bin/sh

if [ "$HOME" = "/root" ];then
	echo 不能在root下执行哦
	exit 0
fi

echo 这个脚本需要用到sudo,请输入密码
sudo echo ''

cd $HOME

CURRENT_TIME=`date -d today +"%Y%m%d%H%M"`

get_reg_string()
{
    echo "$1" | sed -e 's/\//\\\//g' -e 's/\./\\\./g'
}

HOME_REG=`get_reg_string $HOME`

echo 初始化...
BAK_DIR="$HOME/.init_config_bak"
echo 创建备份目录$BAK_DIR
mkdir $BAK_DIR 2> /dev/null
echo 安装本脚本依赖文件
sudo apt-get install -y dialog 

#############################################################
if dialog --title "选择更新源" --radiolist "更新源:" 20 60 4 \
"mirrors.163.com" "网易镜像" on \
"mirrors.sohu.com" "搜狐镜像" off \
2> /tmp/select
then
echo ''

mirror=`cat /tmp/select`
echo 软件原列表备份至 $BAK_DIR/sources.list.$CURRENT_TIME
cp /etc/apt/sources.list $BAK_DIR/sources.list.$CURRENT_TIME
echo 使用新的软件源
sudo sed -i "s/\(\(en\|us\|cn\)\.\)\?archive.ubuntu.com/${mirror}/g" /etc/apt/sources.list
#####apt-get update
else
echo ''
fi

#############################################################
echo ''
echo --------------------------------------
echo 安装常用软件
echo 编辑器    : gawk,vim
echo 软件包管理: aptitude
echo 媒体软件  : smplayer mp3,wma解码器
echo 办公软件  : chmsee
echo win共享网络:samaba
echo --------------------------------------
sudo apt-get install -y gawk vim \
aptitude \
flashplugin-installer \
smplayer \
gstreamer0.10-ffmpeg \
gstreamer0.10-fluendo-mp3 \
gstreamer0.10-plugins-ugly \
chmsee \
samba \
system-config-samba

#############################################################
echo ''
echo 解压需要的资源
sed "1,/DONGGANCHAORE\(\)N/d" $0 > /tmp/ubuntu_init_shell.zip

TMP_SRC_DIR=/tmp/ubuntu_init
mkdir $TMP_SRC_DIR
unzip -o -d $TMP_SRC_DIR /tmp/ubuntu_init_shell.zip
TMP_SRC_DIR="$TMP_SRC_DIR/var"

#############################################################
echo ''
echo --------------------------------------
echo 设置smplayer字幕,添加文件关联
echo --------------------------------------
if test ! -f "$HOME/.config/smplayer/smplayer.ini";then
	smplayer >/dev/null &
	sleep 3
	killall smplayer
fi

cp  $HOME/.config/smplayer/smplayer.ini $BAK_DIR/smplayer.ini.$CURRENT_TIME
echo smplayer配置已备份到$BAK_DIR/smplayer.ini.$CURRENT_TIME

sed -i -e "s/subcp=ISO-8859-1/subcp=UTF-8/" \
		-e "s/use_enca=false/use_enca=true/" \
		-e 's/fontname=Arial/fontname=\\x6587\\x6cc9\\x9a7f\\x5fae\\x7c73\\x9ed1/g' $HOME/.config/smplayer/smplayer.ini

mimelist="$HOME/.local/share/applications/mimeapps.list"

if test ! -f $mimelist;then
	echo '[Added Associations]' > $mimelist
fi

if test -z "`grep 'Added Associations' $mimelist`"
then
	echo '[Added Associations]' >> $mimelist 
fi

if test -z "`grep 'smplayer' $mimelist`"
then
	sed -i "/[Added Associations]/r${TMP_SRC_DIR}/smplayer_mime" $mimelist
fi


#############################################################
echo ''
echo --------------------------------------
echo 修正:用flash播放视频时禁用屏幕保护程序
echo --------------------------------------
mkdir $HOME/.init_shell 2> /dev/null
cp $TMP_SRC_DIR/stop_screensaver_for_flash.sh $HOME/.init_shell
cp $TMP_SRC_DIR/stop_screensaver_for_flash.desktop $HOME/.config/autostart

sed -i "s/HOME/$HOME_REG/g" $HOME/.config/autostart/stop_screensaver_for_flash.desktop

#############################################################
echo '' 
echo -------------------------------------
echo 设置firefox
echo 默认不显示书签栏
echo -------------------------------------

FIREFOX_DIR=`find $HOME/.mozilla/ -type d -name "*.default"|head -n 1`
if test -z "$FIREFOX_DIR";then
	firefox &
	sleep 3 
	killall firefox-bin
	FIREFOX_DIR=`find $HOME/.mozilla/ -type d -name "*.default"|head -n 1`
fi

cp  $FIREFOX_DIR/localstore.rdf $BAK_DIR/localstore.rdf.$CURRENT_TIME
echo firefox配置已备份到$BAK_DIR/localstore.rdf.$CURRENT_TIME

cp $TMP_SRC_DIR/localstore.rdf $FIREFOX_DIR

#############################################################
echo ''
echo ------------------------------------
echo 用pidgin代替empathy
echo ------------------------------------
sudo apt-get remove -y empathy empathy-common nautilus-sendto-empathy
sudo apt-get install -y pidgin 

echo ''
echo -----------------------------------
echo 删掉gwibber,不能用代理的玩具。。
echo -----------------------------------
sudo apt-get remove -y gwibber gwibber-service

#############################################################
echo ''
echo -----------------------------------
echo 安装gappproxy
echo -----------------------------------

config_gappproxy()
{
	rm /tmp/dialog_input
	if dialog --title "设置Gappproxy" --inputbox "设置一个fetch server" 10 75 2>/tmp/dialog_input
	then
		echo ''
		url=`cat /tmp/dialog_input`
		if test -n "$url";then
			if test -n "`wget $url -O - 2>/dev/null | grep GAppProxy/2.0.0`";then
				echo "fetch_server = $url" >> $HOME/.gappproxy/localproxy-2.0.0/proxy.conf
			else
				echo "输入的fetchserver不可用,需要一个安装gappproxy2.0.0的fetchserver" 
				sleep 3
				config_gappproxy
			fi
		fi
	else
		echo ''
	fi
}

install_gappproxy()
{

	mkdir $HOME/.gappproxy

	cd $HOME/.gappproxy
	wget http://gappproxy.googlecode.com/files/localproxy-2.0.0.tar.gz
	tar zxvf *.tar.gz
	cp $TMP_SRC_DIR/gappproxy.desktop $HOME/.config/autostart/
	sed -i "s/HOME/$HOME_REG/g" $HOME/.config/autostart/gappproxy.desktop
	rm *.tar.gz
	config_gappproxy
	cd $HOME 
}

if test ! -f "$HOME/.gappproxy"
then
	install_gappproxy
fi

#############################################################
echo ''
echo -----------------------------------
echo 安装sshd
echo -----------------------------------
sudo apt-get install -y ssh

if test -n "`cat /etc/ssh/sshd_config|grep 'Port 22'`"
then
if dialog --title "更改ssh端口" --inputbox "建议不要使用默认的22端口~" 10 75 22 2>/tmp/dialog_input
then
	echo ''
	newport=`cat /tmp/dialog_input`
	if [ "$newport" != "22" ];then
		cp  /etc/ssh/sshd_config $BAK_DIR/sshd_config.$CURRENT_TIME
		echo ssh server配置已备份到$BAK_DIR/sshd_config.$CURRENT_TIME
		sudo sed -i "s/Port 22/Port ${newport}/g" /etc/ssh/sshd_config
		sudo service ssh restart
	fi
else
	echo ''
fi
fi

#############################################################
echo ''
echo -----------------------------------
echo 系统时间与网络同步 
echo -----------------------------------

sudo apt-get install -y ntp
if test -z "`cat /etc/ntp.conf|grep 210.72.145.44`"
then
	sudo sed -i '$aserver 210.72.145.44' /etc/ntp.conf
fi

exit 0
#DONGGANCHAOREN#

直接执行是不能用的,可执行的在这里
http://code-of-emptyhua.googlecode.com/ ... 0_init.bin
头像
astolia
论坛版主
帖子: 3091
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 511 次

Re: 配置Ubuntu的小脚本

#5

帖子 astolia » 2010-12-30 17:30

gjp1120 写了: 2.关于生成安装脚本,这个是深思熟虑过的,因为我想把所有的过程放在一起执行,减少交互时间。

3.关于为什么要使用多次apt-get update,这个已经在其中注释中指出,不愿让用户不小心升级到不稳定版本,而我还不会在命令行中删除某个源。(这个比较寒)

9.关于执行权限,这个,自己chmod +x就行吧,我是直接上传的脚本,下载下来后没有执行权限是正常的阿。
执行权限我指的是你生成的那个AutoConf.autoscripter,我以为你是为了方便用户在多台机器上配置。
我知道你是不想每问一个问题就执行一些命令,但有比新创建个脚本更好的方法。而且按你的流程来说,如果用户先选择了更新源,又选择了安装ibus,那么最后执行的将是

代码: 全选

sudo apt-get update
sudo add-apt-repository XXX
sudo apt-get update
....
这些个 apt-get update 完全可以合并为一个。多个apt-get install同理

如果我来写这个脚本的话,我大概会这么写

代码: 全选

PKG=""
REPO=""
if 用户要安装软件a ;then
  PKG= "$PKG a"
fi
if 用户要安装ppa源中的软件b ;then
  REPO="add-apt-repository ppa:B"
  PKG= "$PKG b"
fi
if 用户要安装ppa源中的软件c ;then
  REPO="$REPO; add-apt-repository ppa:C"
  PKG= "$PKG c"
fi
...

if [ -n "$REPO" ];then
   $REPO
fi
if [ 用户要更新源 -o -n "$REPO" ];then
  sudo apt-get update
fi
if [ -n "$PKG" ];then
   sudo apt-get install $PKG
fi
另外删除apt-add-repository添加的源还是用apt-add-repository,加个-r参数就是,记得多用man或--help
gjp1120 写了:5.软件包的版本号,这个问题我也想过,可我担心为某些用户误装了命令行版的。
这个你该看看包的具体依赖情况,比如emacs的目前是emacs23 | emacs23-lucid | emacs23-nox,会优先装emacs23,当emacs23和emacs23-lucid都不行时才会去装emacs23-nox
头像
astolia
论坛版主
帖子: 3091
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 511 次

Re: 配置Ubuntu的小脚本

#6

帖子 astolia » 2010-12-30 17:47

简单列一下zenity和whiptail的用法,不推荐4楼的dialog,因为还要安装额外的包,而这两个是ubuntu默认自带的

代码: 全选

if zenity --question --text "要安装XX吗?"; then echo Y;fi
if whiptail --yesno "要安装XX吗?" 10 30;then echo Y;fi
gjp1120
帖子: 8
注册时间: 2010-12-29 19:35
送出感谢: 0
接收感谢: 0

Re: 配置Ubuntu的小脚本

#7

帖子 gjp1120 » 2010-12-30 19:03

关于您说的,
1.万一用户不执行更新ibus呢?而且apt-get update第二次执行较快。

2.在我计算机上apt-add-repository 的-r参数无效,man没有apt-add-repository的手册,--help和-h没有什么帮助。

3.emacs的版本号问题我已修复。感谢。

4.我会写一个使用zenity和whiptail的脚本,欢迎再次挑错。

十分感谢你的认真。十分感谢。
gjp1120
帖子: 8
注册时间: 2010-12-29 19:35
送出感谢: 0
接收感谢: 0

Re: 配置Ubuntu的小脚本

#8

帖子 gjp1120 » 2010-12-30 19:19

关于4 楼 emptyhua 兄的建议:
1.我也认为,不应为用户安装额外的软件包

2.其中的一部分代码给了我很大的参考价值,我将会在下一版本插入脚本。

感谢你的建议。
头像
astolia
论坛版主
帖子: 3091
注册时间: 2008-09-18 13:11
送出感谢: 1 次
接收感谢: 511 次

Re: 配置Ubuntu的小脚本

#9

帖子 astolia » 2010-12-30 22:03

gjp1120 写了:关于您说的,
1.万一用户不执行更新ibus呢?而且apt-get update第二次执行较快。
我写了那么一段示例代码你都没看,还是看不懂?我那样写不管用户怎么选最多都只执行一次update,效率最高。
gjp1120 写了: 2.在我计算机上apt-add-repository 的-r参数无效,man没有apt-add-repository的手册,--help和-h没有什么帮助。
可能是你系统的python-software-properties比较旧。0.76以及之后的版本中才有这个参数。你用lucid的话就很遗憾了,只有手动去删除公钥和list文件
回复

回到 “Shell脚本”