Skip to content Skip to main navigation Skip to footer

shell 脚本

shell: diff比较脚本案例问题及使用IFS解决问题的实际案例

说明:本文来自李想同学的问题及老男孩的解答后的总结。

在整理
diff 命令的时候,突然奇想
diff 是比较两个文件不同。那我能不能通过
diff 把两个文件不同之处比较出来并打印并指明是来自那个文件?

下面是我创建两个文件
file1
file2 ,其内容如下

[root@lx data]# cat file1
I am oldboy,myqq is 31333741
1234
fdsadas
fdafdggfs
kio323423
543rsgrsq
[root@lx data]# cat file2
fdsadas
34fdafdggfs
kio323423 

下面是我写的一个简单的脚本

#!/bin/bash
cd /root/data
file1=(`diff -a file1 file2|grep'^<'|sed -r 's/^< (.*)/1/g'`)
file2=(`diff -a file1 file2|grep'^>'|sed -r 's/^> (.*)/1/g'`)
for m in ${file1[*]}
do
       echo "the '$m' is from file1>"
done
for n in ${file2[*]}
do
       echo "the '$n' is from file2>"
done 

其打印结果如下

[root@lx data]# sh /shell/2.sh
the 'I' is from file1
the 'am' is from file1
the 'oldboy,myqq' is from file1
the 'is' is from file1
the '31333741' is from file1
the '1234' is from file1
the 'fdafdggfs' is from file1
the '543rsgrsq' is from file1
the '34fdafdggfs' is from file2 

此脚本的有一个
bug ,我想要的是
I am oldboy,myqq is 31333741 作为一个整体来输出,而不是分个输出

student :于是请教老师怎样解决这个问题?

oldboy :老男孩老师给出了
IFS=$’n’ 这个参数

#!/bin/bash
cd /root/data
IFS=$'n'   #IFS='n'
file1=(`diff -a file1 file2|grep '^<'|sed -r 's/^<(.*)/1/g'`)
file2=(`diff -a file1 file2|grep '^>'|sed -r 's/^>(.*)/1/g'`)
for m in ${file1[*]}
do
        echo"the '$m' is from file1>"
done
for n in ${file2[@]}
do
        echo"the '$n' is from file2>"
done 

打印输出结果为:

[root@lx data]# sh /shell/2.sh
the 'I am oldboy,myqq is 31333741' is from file1
the '1234' is from file1
the 'fdafdggfs' is from file1
the '543rsgrsq' is from file1
the '34fdafdggfs' is from file2
[root@lx data]# sh /shell/2.sh
the 'I am oldboy,myqq is 31333741
1234
fdafdggfs
543rsgrsq' is from file1
the '34fdafdggfs' is from file2 

总结:

查看了下IFS,了解到IFS是内部域分隔符;此题IFS=$’n’默认以换行作为分隔符; IFS=’n’,是以n字符作为分隔

1. IFS的默认值为:空白(包括:空格,tab, 和新行),将其ASSII码用十六进制打印出来就是:20 09 0a (见下面的shell脚本)。

2. IFS对空格的空白的处理和其他字符不一样,左右两半的纯空白会被忽略,多个连续的空白被当成一个IFS处理。

3. S*中使用IFS中的第一个字符。

4. awk中的FS(域分隔符)也和IFS有类似的用法和作用

老男孩老师点评:此问题略微有些偏门,不过了解下也是有好处的。

原文:http://oldboy.blog.51cto.com/2561410/1655501

shell: 自动化运维 Shell

下面是我多年整理并使用多少的Shell 分享给大家。说起自动化运维很多人会谈到 puppet, ansible,saltstack 这些工具我都使用了,最终都放弃了。这些工具前期配置太耗时间,扩展也不方便,适合傻瓜化运维,对于有15年软件开发经验的我更喜欢,自由,随心所欲。最 终我选择了自行维护 shell , 将shell 模块化,根据需要组合。

github 地址 : https://github.com/oscm/shell

下面举例,安装一个web 服务器。

curl -s https://raw.githubusercontent.com/oscm/shell/master/os/centos7.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/os/iptables.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/gcc/gcc.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/web/nginx/nginx.centos7.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/php/5.6.9-centos7.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/php/pecl/redis.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/php/pecl/pthreads.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/php/pecl/amqp.sh | bash
curl -s https://raw.githubusercontent.com/oscm/shell/master/lang/php/pecl/phalcon.sh | bash 

原文:http://netkiller-github-com.iteye.com/blog/2214933

shell: 基于AutoYaST自动化安装SuSE实践

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

前言

在金融行业中我所接触的操作系统主要是 AIXSLES(SuSE Linux Enterprise Server),也许大家平时用得更多是 CentOS,虽然有部分差异但原理都是相通的, SMITYaST也是灰常实用的功能,推荐大家有机会尝试体验下。因为网上关于SuSE自动化部署的参考文章较少,这套自动化部署方案已经被验证并在生产系统使用了1年半,配置相对成熟和稳定。遵循 Don’t Repeat Yourself原则,本文主要介绍基于AutoYaST实现半自动化SuSE定制光盘和PXE网络全自动化安装SuSE的实践过程,如需了解更加详细的参数说明可以参考扩展阅读中的SuSE官网。

AutoYaST是自动化部署SuSE的黄金搭档

更新历史

2015年05月28日 – 初稿

阅读原文 – http://wsgzao.github.io/post/autoyast/

扩展阅读

SuSE自动安装光盘

定制版本

SUSE Linux Enterprise Server 11 (x86_64)

VERSION = 11

PATCHLEVEL = 2

下载地址 – https://www.suse.com/zh-cn/download-linux/

AutoYast简介

AutoYast是SuSE Linux的自动安装工具。通过AutoYast,在DHCP、TFTP、PXE服务的支持下,通过FTP、NFS等网络安装源可以实现SuSE Linux的完全无人值守自动安装。但是,这种方式必须建立独立的服务器且客户端支持PXE网络启动,在现场没有网络或者系统不支持客户端网卡的场景下不适合,通过AutoYast制作的SuSE Linux一键安装光盘可以满足上述场景。本文主要介绍SuSE Linux Enterprise Server 11(简称SLES11)一键安装光盘的制作, 其他SuSE Linux仅供参考。

生成AutoYaST配置文件

AutoYast配置成功后,生成一个名为autoinst.xml的XML配置文件,SuSE Linux通过这个文件控制操作系统的安装。AutoYast生成配置文件有3种方式:

  1. 系统安装时自动生成
  2. 系统安装后通过运行命令生成
  3. 直接编辑生成( 偷懒最佳姿势

系统安装时生成配置文件

按照正常步骤安装SLES11,把必须的软件全部安装。运行到最后一步“安装已完成”,勾选“为AutoYast复制此系统”,系统开始克隆系统生成配置文件,并弹出提示窗口。生成配置文件用时约2分钟左右,生成的配置文件位于/root目录下。

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

运行命令生成或者修改配置文件

如果在系统安装时没有生成配置文件,可以运行命令生成。在系统中打开终端,以root用户运行命令 yast2 autoyast,打开AutoYast配置窗口,选择“工具”->“创建参考配置文件”,弹出“创建参考控制文件”窗口。勾选需要配置的项目,如软件包选择、语言、分区、键盘布局、防火墙、网络设置等,AutoYast根据选择的项目从系统获取相关配置信息。选择“文件”->“保存”,弹出“另存为”窗口,输入文件名“autoinst.xml”,选择“保存”,系统提示文件保存到指定目录下。

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

有时我们需要对模块做些调整,比如磁盘分区、软件包等。以调整磁盘分区为例介绍配置文件的修改。

以root用户运行 yast2 autoyast,打开AutoYast窗口,选择“文件”->“打开”,选择autoinst.xml文件,等系统读取配置后,在AutoYast窗口显示配置配件名称,修改后保存即可。

制作安装光盘

AutoYast配置文件生成后,可以开始制作一键安装光盘了。制作一键安装光盘需要用到SLES11的原安装光盘的数据。

#首先复制SLES11原安装光盘的数据到指定目录
mkdir /tmp/sles11
cp -R /media/S*/* /tmp/sles11
#复制autoinst.xml
cp /root/autoinst.xml /tmp/sles11
#编辑isolinux.cfg文件,找到# install所在位置
cd  boot/x86_64/loader/
vi isolinux.cfg
# install
  append initrd=initrd autoyast=file:///autoinst.xml splash=silent showopts
:x!
#运行mkisofs命令生成自动安装光盘
cd  /tmp/sles11
mkisofs  -R -o /tmp/SLES11-SP2-64 -AUTO.iso -b boot/x86_64/loader/isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4  -boot-info-table .
 

我的配置文件

预设分区

名称 格式 大小
swap swap 16G
boot ext3 120M
LVM
root ext3 5G
usr ext3 10G
var ext3 5G
opt ext3 10G
home ext3 15G
tmp ext3 10G
总计 71G

预装软件包

KDE Desktop Environment
Oracle Server Base
C/C++ Compiler and Tools
nmap
java-1 _6_0
libstdc++43 -devel-32 bit
 

预设语言

主要:英语
添加:中文
 

预设用户名/密码

root/如果你直接复用我的配置文件请私信我获取密码
 

预设网络配置

禁用服务:防火墙,IPv6

autoinst.xml

<?xml version="1.0>"?>
<!DOCTYPE profile>
<profile  xmlns ="http://www.suse.com/1.0/yast2ns>"  xmlns:config ="http://www.suse.com/1.0/configns>" >
 <bootloader >
 <device_map  config:type ="list>" >
 <device_map_entry >
 <firmware > fd0</firmware >
 <linux > /dev/fd0</linux >
 </device_map_entry >
 <device_map_entry >
 <firmware > hd0</firmware >
 <linux > /dev/sda</linux >
 </device_map_entry >
 </device_map >
 <global >
 <activate > true</activate >
 <boot_boot > true</boot_boot >
 <default > SUSE Linux Enterprise Server 11 SP2 - 3.0.13-0.27</default >
 <generic_mbr > true</generic_mbr >
 <gfxmenu > /boot/message</gfxmenu >
 <lines_cache_id > 3</lines_cache_id >
 <timeout  config:type ="integer>" > 8</timeout >
 </global >
 <initrd_modules  config:type ="list>" >
 <initrd_module >
 <module > mptspi</module >
 </initrd_module >
 <initrd_module >
 <module > ata_piix</module >
 </initrd_module >
 <initrd_module >
 <module > ata_generic</module >
 </initrd_module >
 </initrd_modules >
 <loader_type > grub</loader_type >
 <sections  config:type ="list>" >
 <section >
 <append > resume=/dev/sda1 splash=silent showopts</append >
 <image > /boot/vmlinuz-3.0.13-0.27-default</image >
 <initial > 1</initial >
 <initrd > /boot/initrd-3.0.13-0.27-default</initrd >
 <lines_cache_id > 0</lines_cache_id >
 <name > SUSE Linux Enterprise Server 11 SP2 - 3.0.13-0.27</name >
 <original_name > linux</original_name >
 <root > /dev/system/root</root >
 <type > image</type >
 <vgamode > 0x317</vgamode >
 </section >
 <section >
 <append > showopts ide=nodma apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 nomodeset x11failsafe</append >
 <image > /boot/vmlinuz-3.0.13-0.27-default</image >
 <initrd > /boot/initrd-3.0.13-0.27-default</initrd >
 <lines_cache_id > 1</lines_cache_id >
 <name > Failsafe -- SUSE Linux Enterprise Server 11 SP2 - 3.0.13-0.27</name >
 <original_name > failsafe</original_name >
 <root > /dev/system/root</root >
 <type > image</type >
 <vgamode > 0x317</vgamode >
 </section >
 <section >
 <blockoffset > 1</blockoffset >
 <chainloader > /dev/fd0</chainloader >
 <lines_cache_id > 2</lines_cache_id >
 <name > Floppy</name >
 <noverifyroot > true</noverifyroot >
 <original_name > floppy</original_name >
 <type > other</type >
 </section >
 </sections >
 </bootloader >
 <ca_mgm >
 <caname > YaST_Default_CA</caname >
 <ca_commonName > YaST Default CA (site)</ca_commonName >
 <country > CN</country >
 <password > ENTER PASSWORD HERE</password >
 <server_email > postmaster@site</server_email >
 <takeLocalServerName  config:type ="boolean>" > true</takeLocalServerName >
 </ca_mgm >
 <deploy_image >
 <image_installation  config:type ="boolean>" > false</image_installation >
 </deploy_image >
 <firewall >
 <fw_ALLOW_FW_BROADCAST_DMZ > no</fw_ALLOW_FW_BROADCAST_DMZ >
 <fw_ALLOW_FW_BROADCAST_EXT > no</fw_ALLOW_FW_BROADCAST_EXT >
 <fw_ALLOW_FW_BROADCAST_INT > no</fw_ALLOW_FW_BROADCAST_INT >
 <fw_CONFIGURATIONS_DMZ > </fw_CONFIGURATIONS_DMZ >
 <fw_CONFIGURATIONS_EXT > </fw_CONFIGURATIONS_EXT >
 <fw_CONFIGURATIONS_INT > </fw_CONFIGURATIONS_INT >
 <fw_DEV_DMZ > </fw_DEV_DMZ >
 <fw_DEV_EXT > any eth0</fw_DEV_EXT >
 <fw_DEV_INT > </fw_DEV_INT >
 <fw_FORWARD_ALWAYS_INOUT_DEV > </fw_FORWARD_ALWAYS_INOUT_DEV >
 <fw_FORWARD_MASQ > </fw_FORWARD_MASQ >
 <fw_IGNORE_FW_BROADCAST_DMZ > no</fw_IGNORE_FW_BROADCAST_DMZ >
 <fw_IGNORE_FW_BROADCAST_EXT > yes</fw_IGNORE_FW_BROADCAST_EXT >
 <fw_IGNORE_FW_BROADCAST_INT > no</fw_IGNORE_FW_BROADCAST_INT >
 <fw_IPSEC_TRUST > no</fw_IPSEC_TRUST >
 <fw_LOAD_MODULES > nf_conntrack_netbios_ns</fw_LOAD_MODULES >
 <fw_LOG_ACCEPT_ALL > no</fw_LOG_ACCEPT_ALL >
 <fw_LOG_ACCEPT_CRIT > yes</fw_LOG_ACCEPT_CRIT >
 <fw_LOG_DROP_ALL > no</fw_LOG_DROP_ALL >
 <fw_LOG_DROP_CRIT > yes</fw_LOG_DROP_CRIT >
 <fw_MASQUERADE > no</fw_MASQUERADE >
 <fw_PROTECT_FROM_INT > no</fw_PROTECT_FROM_INT >
 <fw_ROUTE > no</fw_ROUTE >
 <fw_SERVICES_ACCEPT_DMZ > </fw_SERVICES_ACCEPT_DMZ >
 <fw_SERVICES_ACCEPT_EXT > </fw_SERVICES_ACCEPT_EXT >
 <fw_SERVICES_ACCEPT_INT > </fw_SERVICES_ACCEPT_INT >
 <fw_SERVICES_ACCEPT_RELATED_DMZ > </fw_SERVICES_ACCEPT_RELATED_DMZ >
 <fw_SERVICES_ACCEPT_RELATED_EXT > </fw_SERVICES_ACCEPT_RELATED_EXT >
 <fw_SERVICES_ACCEPT_RELATED_INT > </fw_SERVICES_ACCEPT_RELATED_INT >
 <fw_SERVICES_DMZ_IP > </fw_SERVICES_DMZ_IP >
 <fw_SERVICES_DMZ_RPC > </fw_SERVICES_DMZ_RPC >
 <fw_SERVICES_DMZ_TCP > </fw_SERVICES_DMZ_TCP >
 <fw_SERVICES_DMZ_UDP > </fw_SERVICES_DMZ_UDP >
 <fw_SERVICES_EXT_IP > </fw_SERVICES_EXT_IP >
 <fw_SERVICES_EXT_RPC > </fw_SERVICES_EXT_RPC >
 <fw_SERVICES_EXT_TCP > </fw_SERVICES_EXT_TCP >
 <fw_SERVICES_EXT_UDP > </fw_SERVICES_EXT_UDP >
 <fw_SERVICES_INT_IP > </fw_SERVICES_INT_IP >
 <fw_SERVICES_INT_RPC > </fw_SERVICES_INT_RPC >
 <fw_SERVICES_INT_TCP > </fw_SERVICES_INT_TCP >
 <fw_SERVICES_INT_UDP > </fw_SERVICES_INT_UDP >
 <enable_firewall  config:type ="boolean>" > false</enable_firewall >
 <start_firewall  config:type ="boolean>" > false</start_firewall >
 </firewall >
 <general >
 <ask-list  config:type ="list>" />
 <mode >
 <confirm  config:type ="boolean>" > false</confirm >
 </mode >
 <mouse >
 <id > none</id >
 </mouse >
 <proposals  config:type ="list>" />
 <signature-handling >
 <accept_file_without_checksum  config:type ="boolean>" > true</accept_file_without_checksum >
 <accept_non_trusted_gpg_key  config:type ="boolean>" > true</accept_non_trusted_gpg_key >
 <accept_unknown_gpg_key  config:type ="boolean>" > true</accept_unknown_gpg_key >
 <accept_unsigned_file  config:type ="boolean>" > true</accept_unsigned_file >
 <accept_verification_failed  config:type ="boolean>" > false</accept_verification_failed >
 <import_gpg_key  config:type ="boolean>" > true</import_gpg_key >
 </signature-handling >
 <storage />
 </general >
 <groups  config:type ="list>" >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 100</gid >
 <group_password > x</group_password >
 <groupname > users</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 19</gid >
 <group_password > x</group_password >
 <groupname > floppy</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 1</gid >
 <group_password > x</group_password >
 <groupname > bin</groupname >
 <userlist > daemon</userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 41</gid >
 <group_password > x</group_password >
 <groupname > xok</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 65533</gid >
 <group_password > x</group_password >
 <groupname > nobody</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 43</gid >
 <group_password > x</group_password >
 <groupname > modem</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 5</gid >
 <group_password > x</group_password >
 <groupname > tty</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 7</gid >
 <group_password > x</group_password >
 <groupname > lp</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 104</gid >
 <group_password > !</group_password >
 <groupname > uuidd</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 51</gid >
 <group_password > !</group_password >
 <groupname > postfix</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 115</gid >
 <group_password > !</group_password >
 <groupname > gdm</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 65534</gid >
 <group_password > x</group_password >
 <groupname > nogroup</groupname >
 <userlist > nobody</userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 107</gid >
 <group_password > !</group_password >
 <groupname > oinstall</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 101</gid >
 <group_password > !</group_password >
 <groupname > messagebus</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 59</gid >
 <group_password > !</group_password >
 <groupname > maildrop</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 33</gid >
 <group_password > x</group_password >
 <groupname > video</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 3</gid >
 <group_password > x</group_password >
 <groupname > sys</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 15</gid >
 <group_password > x</group_password >
 <groupname > shadow</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 20</gid >
 <group_password > x</group_password >
 <groupname > cdrom</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 21</gid >
 <group_password > x</group_password >
 <groupname > console</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 42</gid >
 <group_password > x</group_password >
 <groupname > trusted</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 102</gid >
 <group_password > !</group_password >
 <groupname > haldaemon</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 106</gid >
 <group_password > !</group_password >
 <groupname > puppet</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 16</gid >
 <group_password > x</group_password >
 <groupname > dialout</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 110</gid >
 <group_password > !</group_password >
 <groupname > polkituser</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 10</gid >
 <group_password > x</group_password >
 <groupname > wheel</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 112</gid >
 <group_password > !</group_password >
 <groupname > pulse</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 8</gid >
 <group_password > x</group_password >
 <groupname > www</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 40</gid >
 <group_password > x</group_password >
 <groupname > games</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 6</gid >
 <group_password > x</group_password >
 <groupname > disk</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 17</gid >
 <group_password > x</group_password >
 <groupname > audio</groupname >
 <userlist > pulse</userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 114</gid >
 <group_password > !</group_password >
 <groupname > suse-ncc</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 49</gid >
 <group_password > x</group_password >
 <groupname > ftp</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 103</gid >
 <group_password > !</group_password >
 <groupname > tape</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 25</gid >
 <group_password > !</group_password >
 <groupname > at</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 9</gid >
 <group_password > x</group_password >
 <groupname > kmem</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 32</gid >
 <group_password > x</group_password >
 <groupname > public</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 0</gid >
 <group_password > x</group_password >
 <groupname > root</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 12</gid >
 <group_password > x</group_password >
 <groupname > mail</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 2</gid >
 <group_password > x</group_password >
 <groupname > daemon</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 105</gid >
 <group_password > !</group_password >
 <groupname > sfcb</groupname >
 <userlist > root</userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 111</gid >
 <group_password > !</group_password >
 <groupname > ntp</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 14</gid >
 <group_password > x</group_password >
 <groupname > uucp</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 113</gid >
 <group_password > !</group_password >
 <groupname > pulse-access</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 108</gid >
 <group_password > !</group_password >
 <groupname > dba</groupname >
 <userlist > oracle</userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 71</gid >
 <group_password > !</group_password >
 <groupname > ntadmin</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 62</gid >
 <group_password > x</group_password >
 <groupname > man</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 109</gid >
 <group_password > !</group_password >
 <groupname > mysql</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 22</gid >
 <group_password > x</group_password >
 <groupname > utmp</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 13</gid >
 <group_password > x</group_password >
 <groupname > news</groupname >
 <userlist > </userlist >
 </group >
 <group >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <gid > 65</gid >
 <group_password > !</group_password >
 <groupname > sshd</groupname >
 <userlist > </userlist >
 </group >
 </groups >
 <host >
 <hosts  config:type ="list>" >
 <hosts_entry >
 <host_address > 127.0.0.1</host_address >
 <names  config:type ="list>" >
 <name > localhost</name >
 </names >
 </hosts_entry >
 <hosts_entry >
 <host_address > ::1</host_address >
 <names  config:type ="list>" >
 <name > localhost ipv6-localhost ipv6-loopback</name >
 </names >
 </hosts_entry >
 <hosts_entry >
 <host_address > addr:127.0.0.1</host_address >
 <names  config:type ="list>" >
 <name > n n</name >
 </names >
 </hosts_entry >
 <hosts_entry >
 <host_address > fe00::0</host_address >
 <names  config:type ="list>" >
 <name > ipv6-localnet</name >
 </names >
 </hosts_entry >
 <hosts_entry >
 <host_address > ff00::0</host_address >
 <names  config:type ="list>" >
 <name > ipv6-mcastprefix</name >
 </names >
 </hosts_entry >
 <hosts_entry >
 <host_address > ff02::1</host_address >
 <names  config:type ="list>" >
 <name > ipv6-allnodes</name >
 </names >
 </hosts_entry >
 <hosts_entry >
 <host_address > ff02::2</host_address >
 <names  config:type ="list>" >
 <name > ipv6-allrouters</name >
 </names >
 </hosts_entry >
 <hosts_entry >
 <host_address > ff02::3</host_address >
 <names  config:type ="list>" >
 <name > ipv6-allhosts</name >
 </names >
 </hosts_entry >
 </hosts >
 </host >
 <iscsi-client >
 <version > 1.0</version >
 </iscsi-client >
 <kdump >
 <add_crash_kernel  config:type ="boolean>" > false</add_crash_kernel >
 <crash_kernel > 128M-:64M</crash_kernel >
 <general >
 <kdump_CONTINUE_ON_ERROR > false</kdump_CONTINUE_ON_ERROR >
 <kdump_COPY_KERNEL > yes</kdump_COPY_KERNEL >
 <kdump_DUMPFORMAT > compressed</kdump_DUMPFORMAT >
 <kdump_DUMPLEVEL > 0</kdump_DUMPLEVEL >
 <kdump_FREE_DISK_SIZE > 64</kdump_FREE_DISK_SIZE >
 <kdump_IMMEDIATE_REBOOT > yes</kdump_IMMEDIATE_REBOOT >
 <kdump_KEEP_OLD_DUMPS > 5</kdump_KEEP_OLD_DUMPS >
 <kdump_NETCONFIG > auto</kdump_NETCONFIG >
 <kdump_SAVEDIR > file:///var/crash</kdump_SAVEDIR >
 <kdump_VERBOSE > 3</kdump_VERBOSE >
 </general >
 </kdump >
 <keyboard >
 <keymap > english-us</keymap >
 </keyboard >
 <language >
 <language > en_US</language >
 <languages > zh_CN,en_US</languages >
 </language >
 <ldap >
 <base_config_dn > </base_config_dn >
 <bind_dn > </bind_dn >
 <create_ldap  config:type ="boolean>" > false</create_ldap >
 <file_server  config:type ="boolean>" > false</file_server >
 <ldap_domain > dc=example,dc=com</ldap_domain >
 <ldap_server > 127.0.0.1</ldap_server >
 <ldap_tls  config:type ="boolean>" > true</ldap_tls >
 <ldap_v2  config:type ="boolean>" > false</ldap_v2 >
 <login_enabled  config:type ="boolean>" > true</login_enabled >
 <member_attribute > member</member_attribute >
 <mkhomedir  config:type ="boolean>" > false</mkhomedir >
 <nss_base_group > </nss_base_group >
 <nss_base_passwd > </nss_base_passwd >
 <nss_base_shadow > </nss_base_shadow >
 <pam_password > exop</pam_password >
 <sssd  config:type ="boolean>" > false</sssd >
 <start_autofs  config:type ="boolean>" > false</start_autofs >
 <start_ldap  config:type ="boolean>" > false</start_ldap >
 </ldap >
 <login_settings />
<networking >
 <dhcp_options >
 <dhclient_client_id > </dhclient_client_id >
 <dhclient_hostname_option > AUTO</dhclient_hostname_option >
 </dhcp_options >
 <dns >
 <dhcp_hostname  config:type ="boolean>" > false</dhcp_hostname >
 <resolv_conf_policy > auto</resolv_conf_policy >
 </dns >
 <interfaces  config:type ="list>" >
 <interface >
 <bootproto > dhcp</bootproto >
 <device > eth0</device >
 <prefixlen > 16</prefixlen >
 <startmode > onboot</startmode >
 <usercontrol > no</usercontrol >
 </interface >
 <interface >
 <bootproto > dhcp</bootproto >
 <device > eth1</device >
 <prefixlen > 16</prefixlen >
 <startmode > onboot</startmode >
 <usercontrol > no</usercontrol >
 </interface >
 </interfaces >
 <managed  config:type ="boolean>" > false</managed >
 <routing >
 <ip_forward  config:type ="boolean>" > false</ip_forward >
 </routing >
 </networking >
 <nis >
 <netconfig_policy > auto</netconfig_policy >
 <nis_broadcast  config:type ="boolean>" > false</nis_broadcast >
 <nis_broken_server  config:type ="boolean>" > false</nis_broken_server >
 <nis_local_only  config:type ="boolean>" > false</nis_local_only >
 <start_autofs  config:type ="boolean>" > false</start_autofs >
 <start_nis  config:type ="boolean>" > false</start_nis >
 </nis >
 <ntp-client >
 <ntp_policy > auto</ntp_policy >
 <peers  config:type ="list>" >
 <peer >
 <address > 127.127.1.0</address >
 <comment > ################################################################################
## /etc/ntp.conf
##
## Sample NTP configuration file.
## See package 'ntp-doc' for documentation, Mini-HOWTO and FAQ.
## Copyright (c) 1998 S.u.S.E. GmbH Fuerth, Germany.
##
## Author: Michael Andres,  <ma@suse.de>
##         Michael Skibbe,  <mskibbe@suse.de>
##
################################################################################
##
## Radio and modem clocks by convention have addresses in the
## form 127.127.t.u, where t is the clock type and u is a unit
## number in the range 0-3.
##
## Most of these clocks require support in the form of a
## serial port or special bus peripheral. The particular
## device is normally specified by adding a soft link
## /dev/device-u to the particular hardware device involved,
## where u correspond to the unit number above.
##
## Generic DCF77 clock on serial port (Conrad DCF77)
## Address:     127.127.8.u
## Serial Port: /dev/refclock-u
##
## (create soft link /dev/refclock-0 to the particular ttyS?)
##
# server 127.127.8.0 mode 5 prefer
##
## Undisciplined Local Clock. This is a fake driver intended for backup
## and when no outside source of synchronized time is available.
##
</comment >
 <fudge_comment > # local clock (LCL)
</fudge_comment >
 <fudge_options >  stratum 10</fudge_options >
 <type > __clock</type >
 </peer >
 <peer >
 <address > /var/lib/ntp/drift/ntp.drift </address >
 <comment > # LCL is unsynchronized
##
## Add external Servers using
## # rcntp addserver <yourserver>
##
##
## Miscellaneous stuff
##
</comment >
 <type > driftfile</type >
 </peer >
 <peer >
 <address > /var/log/ntp </address >
 <comment > # path for drift file
</comment >
 <type > logfile</type >
 </peer >
 <peer >
 <address > /etc/ntp.keys </address >
 <comment > # alternate log file
# logconfig =syncstatus + sysevents
# logconfig =all
# statsdir /tmp/ # directory for statistics files
# filegen peerstats  file peerstats  type day enable
# filegen loopstats  file loopstats  type day enable
# filegen clockstats file clockstats type day enable
#
# Authentication stuff
#
</comment >
 <type > keys</type >
 </peer >
 <peer >
 <address > 1 </address >
 <comment > # path for keys file
</comment >
 <type > trustedkey</type >
 </peer >
 <peer >
 <address > 1 </address >
 <comment > # define trusted keys
</comment >
 <type > requestkey</type >
 </peer >
 </peers >
 <start_at_boot  config:type ="boolean>" > false</start_at_boot >
 <start_in_chroot  config:type ="boolean>" > true</start_in_chroot >
 </ntp-client >
 <partitioning  config:type ="list>" >
 <drive >
 <device > /dev/sda</device >
 <initialize  config:type ="boolean>" > true</initialize >
 <partitions  config:type ="list>" >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > swap</filesystem >
 <filesystem_id  config:type ="integer>" > 130</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > defaults</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <mount > swap</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 130</partition_id >
 <partition_nr  config:type ="integer>" > 1</partition_nr >
 <resize  config:type ="boolean>" > false</resize >
 <size > 32G</size >
 </partition >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 131</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > acl,user_xattr</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <mount > /boot</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 131</partition_id >
 <partition_nr  config:type ="integer>" > 2</partition_nr >
 <resize  config:type ="boolean>" > false</resize >
 <size > 120M</size >
 </partition >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 142</filesystem_id >
 <format  config:type ="boolean>" > false</format >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <lvm_group > system</lvm_group >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 142</partition_id >
 <partition_nr  config:type ="integer>" > 3</partition_nr >
 <resize  config:type ="boolean>" > false</resize >
 <size > max</size >
 </partition >
 </partitions >
 <type  config:type ="symbol>" > CT_DISK</type >
 <use > all</use >
 </drive >
 <drive >
 <device > /dev/system</device >
 <initialize  config:type ="boolean>" > true</initialize >
 <partitions  config:type ="list>" >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 131</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > acl,user_xattr</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <lv_name > home</lv_name >
 <mount > /home</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 131</partition_id >
 <resize  config:type ="boolean>" > false</resize >
 <size > 15G</size >
 </partition >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 131</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > acl,user_xattr</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <lv_name > opt</lv_name >
 <mount > /opt</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 131</partition_id >
 <resize  config:type ="boolean>" > false</resize >
 <size > 10G</size >
 </partition >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 131</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > acl,user_xattr</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <lv_name > root</lv_name >
 <mount > /</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 131</partition_id >
 <resize  config:type ="boolean>" > false</resize >
 <size > 5G</size >
 </partition >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 131</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > acl,user_xattr</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <lv_name > tmp</lv_name >
 <mount > /tmp</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 131</partition_id >
 <resize  config:type ="boolean>" > false</resize >
 <size > 10G</size >
 </partition >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 131</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > acl,user_xattr</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <lv_name > usr</lv_name >
 <mount > /usr</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 131</partition_id >
 <resize  config:type ="boolean>" > false</resize >
 <size > 10G</size >
 </partition >
 <partition >
 <create  config:type ="boolean>" > true</create >
 <crypt_fs  config:type ="boolean>" > false</crypt_fs >
 <filesystem  config:type ="symbol>" > ext3</filesystem >
 <filesystem_id  config:type ="integer>" > 131</filesystem_id >
 <format  config:type ="boolean>" > true</format >
 <fstopt > acl,user_xattr</fstopt >
 <loop_fs  config:type ="boolean>" > false</loop_fs >
 <lv_name > var</lv_name >
 <mount > /var</mount >
 <mountby  config:type ="symbol>" > device</mountby >
 <partition_id  config:type ="integer>" > 131</partition_id >
 <resize  config:type ="boolean>" > false</resize >
 <size > 5G</size >
 </partition >
 </partitions >
 <pesize > 4M</pesize >
 <type  config:type ="symbol>" > CT_LVM</type >
 <use > all</use >
 </drive >
 </partitioning >
 <printer >
 <server_settings >
 <browseAllow  config:type ="list>" >
 <listentry > all</listentry >
 </browseAllow >
 <browseOrder  config:type ="list>" >
 <listentry > allow,deny</listentry >
 </browseOrder >
 <browsing  config:type ="list>" >
 <listentry > On</listentry >
 </browsing >
 <defaultAuthType  config:type ="list>" >
 <listentry > Basic</listentry >
 </defaultAuthType >
 <defaultPolicy  config:type ="list>" >
 <listentry > default</listentry >
 </defaultPolicy >
 <listen  config:type ="list>" >
 <listentry > localhost:631</listentry >
 <listentry > /var/run/cups/cups.sock</listentry >
 </listen >
 <logLevel  config:type ="list>" >
 <listentry > info</listentry >
 </logLevel >
 <systemGroup  config:type ="list>" >
 <listentry > sys root</listentry >
 </systemGroup >
 <sections  config:type ="list>" >
 <section >
 <allow  config:type ="list>" >
 <listentry > 127.0.0.2</listentry >
 </allow >
 <key > Location</key >
 <order  config:type ="list>" >
 <listentry > allow,deny</listentry >
 </order >
 <value > /</value >
 </section >
 <section >
 <encryption  config:type ="list>" >
 <listentry > Required</listentry >
 </encryption >
 <key > Location</key >
 <order  config:type ="list>" >
 <listentry > allow,deny</listentry >
 </order >
 <value > /admin</value >
 </section >
 <section >
 <authType  config:type ="list>" >
 <listentry > Default</listentry >
 </authType >
 <key > Location</key >
 <order  config:type ="list>" >
 <listentry > allow,deny</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @SYSTEM</listentry >
 </require >
 <value > /admin/conf</value >
 </section >
 <section >
 <key > Policy</key >
 <value > default</value >
 <sections  config:type ="list>" >
 <section >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @OWNER @SYSTEM</listentry >
 </require >
 <value > Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job</value >
 </section >
 <section >
 <authType  config:type ="list>" >
 <listentry > Default</listentry >
 </authType >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @SYSTEM</listentry >
 </require >
 <value > CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default</value >
 </section >
 <section >
 <authType  config:type ="list>" >
 <listentry > Default</listentry >
 </authType >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @SYSTEM</listentry >
 </require >
 <value > Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Accept-Jobs CUPS-Reject-Jobs</value >
 </section >
 <section >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @OWNER @SYSTEM</listentry >
 </require >
 <value > Cancel-Job CUPS-Authenticate-Job</value >
 </section >
 <section >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <value > All</value >
 </section >
 </sections >
 </section >
 <section >
 <key > Policy</key >
 <value > easy</value >
 <sections  config:type ="list>" >
 <section >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > allow,deny</listentry >
 </order >
 <satisfy  config:type ="list>" >
 <listentry > any</listentry >
 </satisfy >
 <value > All</value >
 </section >
 </sections >
 </section >
 <section >
 <key > Policy</key >
 <value > paranoid</value >
 <sections  config:type ="list>" >
 <section >
 <allow  config:type ="list>" >
 <listentry > from 127.0.0.0/8</listentry >
 </allow >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @OWNER</listentry >
 </require >
 <value > Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job</value >
 </section >
 <section >
 <allow  config:type ="list>" >
 <listentry > from 127.0.0.0/8</listentry >
 </allow >
 <authType  config:type ="list>" >
 <listentry > Default</listentry >
 </authType >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @SYSTEM</listentry >
 </require >
 <value > CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default</value >
 </section >
 <section >
 <allow  config:type ="list>" >
 <listentry > from 127.0.0.0/8</listentry >
 </allow >
 <authType  config:type ="list>" >
 <listentry > Default</listentry >
 </authType >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @SYSTEM</listentry >
 </require >
 <value > Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Accept-Jobs CUPS-Reject-Jobs</value >
 </section >
 <section >
 <allow  config:type ="list>" >
 <listentry > from 127.0.0.0/8</listentry >
 </allow >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @OWNER</listentry >
 </require >
 <value > Cancel-Job CUPS-Authenticate-Job</value >
 </section >
 <section >
 <allow  config:type ="list>" >
 <listentry > from 127.0.0.0/8</listentry >
 </allow >
 <key > Limit</key >
 <order  config:type ="list>" >
 <listentry > deny,allow</listentry >
 </order >
 <require  config:type ="list>" >
 <listentry > user @OWNER @SYSTEM</listentry >
 </require >
 <value > All</value >
 </section >
 </sections >
 </section >
 </sections >
 </server_settings >
 </printer >
 <proxy >
 <enabled  config:type ="boolean>" > false</enabled >
 <ftp_proxy > </ftp_proxy >
 <http_proxy > </http_proxy >
 <https_proxy > </https_proxy >
 <no_proxy > localhost, 127.0.0.1</no_proxy >
 <proxy_password > </proxy_password >
 <proxy_user > </proxy_user >
 </proxy >
 <report >
 <errors >
 <log  config:type ="boolean>" > true</log >
 <show  config:type ="boolean>" > true</show >
 <timeout  config:type ="integer>" > 0</timeout >
 </errors >
 <messages >
 <log  config:type ="boolean>" > true</log >
 <show  config:type ="boolean>" > true</show >
 <timeout  config:type ="integer>" > 0</timeout >
 </messages >
 <warnings >
 <log  config:type ="boolean>" > true</log >
 <show  config:type ="boolean>" > true</show >
 <timeout  config:type ="integer>" > 0</timeout >
 </warnings >
 <yesno_messages >
 <log  config:type ="boolean>" > true</log >
 <show  config:type ="boolean>" > true</show >
 <timeout  config:type ="integer>" > 0</timeout >
 </yesno_messages >
 </report >
 <runlevel >
 <default > 5</default >
 </runlevel >
 <software >
 <packages  config:type ="list>" >
 <package > ConsoleKit-32bit</package >
 <package > Mesa-32bit</package >
 <package > PolicyKit-32bit</package >
 <package > PolicyKit-gnome-libs-32bit</package >
 <package > aspell-32bit</package >
 <package > at-spi-32bit</package >
 <package > audiofile-32bit</package >
 <package > audit-libs-32bit</package >
 <package > bind-libs-32bit</package >
 <package > bison-32bit</package >
 <package > cpufrequtils-32bit</package >
 <package > cracklib-32bit</package >
 <package > cryptconfig-32bit</package >
 <package > cyrus-sasl-32bit</package >
 <package > cyrus-sasl-gssapi-32bit</package >
 <package > cyrus-sasl-plain-32bit</package >
 <package > dbus-1-32bit</package >
 <package > dbus-1-glib-32bit</package >
 <package > device-mapper-32bit</package >
 <package > evolution-data-server-32bit</package >
 <package > fam-32bit</package >
 <package > file-32bit</package >
 <package > flex-32bit</package >
 <package > freeglut-32bit</package >
 <package > freetype-32bit</package >
 <package > fribidi-32bit</package >
 <package > gcc-32bit</package >
 <package > gcc43-32bit</package >
 <package > gconf2-32bit</package >
 <package > gdbm-devel-32bit</package >
 <package > gettext-runtime-32bit</package >
 <package > giflib-32bit</package >
 <package > glibc-devel-32bit</package >
 <package > glibc-locale-32bit</package >
 <package > gnome-keyring-32bit</package >
 <package > gnome-panel-32bit</package >
 <package > gnome-vfs2-32bit</package >
 <package > gpm-32bit</package >
 <package > hal-32bit</package >
 <package > hunspell-32bit</package >
 <package > java-1_6_0-ibm</package >
 <package > java-1_6_0-ibm-fonts</package >
 <package > jpackage-utils</package >
 <package > libFLAC8-32bit</package >
 <package > libHX13-32bit</package >
 <package > libacl-32bit</package >
 <package > libaio-32bit</package >
 <package > libaio-devel-32bit</package >
 <package > libart_lgpl-32bit</package >
 <package > libattr-32bit</package >
 <package > libavahi-client3-32bit</package >
 <package > libavahi-common3-32bit</package >
 <package > libavahi-glib1-32bit</package >
 <package > libblkid1-32bit</package >
 <package > libbonobo-32bit</package >
 <package > libbonoboui-32bit</package >
 <package > libbz2-1-32bit</package >
 <package > libcanberra-gtk-32bit</package >
 <package > libcanberra-gtk0-32bit</package >
 <package > libcanberra0-32bit</package >
 <package > libcap2-32bit</package >
 <package > libcroco-0_6-3-32bit</package >
 <package > libcurl4-32bit</package >
 <package > libdnet1</package >
 <package > libdrm-32bit</package >
 <package > libesd0-32bit</package >
 <package > libfreebl3-32bit</package >
 <package > libgcrypt11-32bit</package >
 <package > libglade2-32bit</package >
 <package > libgnome-32bit</package >
 <package > libgnome-desktop-2-11-32bit</package >
 <package > libgnomecanvas-32bit</package >
 <package > libgnutls26-32bit</package >
 <package > libgomp46-32bit</package >
 <package > libgpg-error0-32bit</package >
 <package > libgsf-1-114-32bit</package >
 <package > libgstreamer-0_10-0-32bit</package >
 <package > libgthread-2_0-0-32bit</package >
 <package > libgweather1-32bit</package >
 <package > libical0-32bit</package >
 <package > libidl-32bit</package >
 <package > libidn-32bit</package >
 <package > liblcms1-32bit</package >
 <package > libldap-2_4-2-32bit</package >
 <package > libltdl7-32bit</package >
 <package > liblua5_1</package >
 <package > liblzma5-32bit</package >
 <package > libmng-32bit</package >
 <package > libncurses6-32bit</package >
 <package > libnetpbm10-32bit</package >
 <package > libnscd-32bit</package >
 <package > libnsssharedhelper0-32bit</package >
 <package > libogg0-32bit</package >
 <package > libopenct1-32bit</package >
 <package > libopensc2-32bit</package >
 <package > libpciaccess0-32bit</package >
 <package > libproxy0-32bit</package >
 <package > libproxy0-config-gnome</package >
 <package > libproxy0-config-kde4</package >
 <package > libpulse0-32bit</package >
 <package > libpython2_6-1_0-32bit</package >
 <package > libqt4-32bit</package >
 <package > libqt4-qt3support-32bit</package >
 <package > libqt4-sql-32bit</package >
 <package > libqt4-x11-32bit</package >
 <package > libreiserfs-32bit</package >
 <package > librsvg-32bit</package >
 <package > libsepol1-32bit</package >
 <package > libsmbclient0-32bit</package >
 <package > libsmbios2-32bit</package >
 <package > libsndfile-32bit</package >
 <package > libsoup-2_4-1-32bit</package >
 <package > libsqlite3-0-32bit</package >
 <package > libstdc++33-32bit</package >
 <package > libstdc++43-devel-32bit</package >
 <package > libtalloc2-32bit</package >
 <package > libtasn1-3-32bit</package >
 <package > libtdb1-32bit</package >
 <package > libtool-32bit</package >
 <package > libudev0-32bit</package >
 <package > libvorbis-32bit</package >
 <package > libwbclient0-32bit</package >
 <package > libwnck-1-22-32bit</package >
 <package > libxcrypt-32bit</package >
 <package > libxml2-32bit</package >
 <package > libxslt-32bit</package >
 <package > mozilla-kde4-integration</package >
 <package > mozilla-nspr-32bit</package >
 <package > mozilla-nss-32bit</package >
 <package > mozilla-xulrunner192-32bit</package >
 <package > nautilus-32bit</package >
 <package > nautilus-cd-burner-32bit</package >
 <package > ncurses-devel-32bit</package >
 <package > nmap</package >
 <package > opensc-32bit</package >
 <package > openslp-32bit</package >
 <package > opie-32bit</package >
 <package > orbit2-32bit</package >
 <package > pam-32bit</package >
 <package > pam-modules-32bit</package >
 <package > pam_mount-32bit</package >
 <package > parted-32bit</package >
 <package > pciutils-32bit</package >
 <package > pcsc-lite-32bit</package >
 <package > popt-32bit</package >
 <package > qt3-32bit</package >
 <package > qtcurve-gtk2-32bit</package >
 <package > rpm-32bit</package >
 <package > samba-32bit</package >
 <package > samba-client-32bit</package >
 <package > startup-notification-32bit</package >
 <package > strace-32bit</package >
 <package > sysfsutils-32bit</package >
 <package > tcl-32bit</package >
 <package > tcpd-32bit</package >
 <package > tk-32bit</package >
 <package > utempter-32bit</package >
 <package > xaw3d-32bit</package >
 <package > xorg-x11-driver-video-radeonhd</package >
 <package > yast2-trans-en_US</package >
 <package > autoyast2-installation</package >
 <package > autoyast2-installation</package >
 </packages >
 <patterns  config:type ="list>" >
 <pattern > Basis-Devel</pattern >
 <pattern > Minimal</pattern >
 <pattern > WBEM</pattern >
 <pattern > apparmor</pattern >
 <pattern > base</pattern >
 <pattern > documentation</pattern >
 <pattern > gnome</pattern >
 <pattern > kde</pattern >
 <pattern > oracle_server</pattern >
 <pattern > print_server</pattern >
 <pattern > x11</pattern >
 </patterns >
 <remove-packages  config:type ="list>" >
 <package > apache2</package >
 <package > apache2-prefork</package >
 <package > apache2-utils</package >
 <package > apache2-worker</package >
 <package > emacs-nox</package >
 <package > libapr-util1</package >
 <package > libapr1</package >
 <package > libqt4-sql-sqlite</package >
 <package > lprng</package >
 <package > pcmciautils</package >
 <package > portmap</package >
 <package > rsyslog</package >
 <package > sendmail</package >
 <package > susehelp_de</package >
 <package > open-iscsi</package >
 </remove-packages >
 </software >
 <timezone >
 <hwclock > localtime</hwclock >
 <timezone > Asia/Shanghai</timezone >
 </timezone >
 <user_defaults >
 <group > 100</group >
 <groups > video,dialout</groups >
 <home > /home</home >
 <inactive > -1</inactive >
 <shell > /bin/bash</shell >
 <skel > /etc/skel</skel >
 <umask > 022</umask >
 </user_defaults >
 <users  config:type ="list>" >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Games account</fullname >
 <gid > 100</gid >
 <home > /var/games</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 12</uid >
 <user_password > *</user_password >
 <username > games</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > bin</fullname >
 <gid > 1</gid >
 <home > /bin</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 1</uid >
 <user_password > *</user_password >
 <username > bin</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > nobody</fullname >
 <gid > 65533</gid >
 <home > /var/lib/nobody</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 65534</uid >
 <user_password > *</user_password >
 <username > nobody</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Printing daemon</fullname >
 <gid > 7</gid >
 <home > /var/spool/lpd</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 4</uid >
 <user_password > *</user_password >
 <username > lp</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > User for uuidd</fullname >
 <gid > 104</gid >
 <home > /var/run/uuidd</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 102</uid >
 <user_password > *</user_password >
 <username > uuidd</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Postfix Daemon</fullname >
 <gid > 51</gid >
 <home > /var/spool/postfix</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 51</uid >
 <user_password > *</user_password >
 <username > postfix</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Novell Customer Center User</fullname >
 <gid > 114</gid >
 <home > /var/lib/YaST2/suse-ncc-fakehome</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 107</uid >
 <user_password > *</user_password >
 <username > suse-ncc</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > FTP account</fullname >
 <gid > 49</gid >
 <home > /srv/ftp</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 40</uid >
 <user_password > *</user_password >
 <username > ftp</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Gnome Display Manager daemon</fullname >
 <gid > 115</gid >
 <home > /var/lib/gdm</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 108</uid >
 <user_password > *</user_password >
 <username > gdm</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Batch jobs daemon</fullname >
 <gid > 25</gid >
 <home > /var/spool/atjobs</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 25</uid >
 <user_password > *</user_password >
 <username > at</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > root</fullname >
 <gid > 0</gid >
 <home > /root</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 0</uid >
 <user_password > $2y$05$PgHRKTw9p..KhpR4r3bhF.8yFRP30eBTO6bQSfDspTz8J5/8yw.qW</user_password >
 <username > root</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Mailer daemon</fullname >
 <gid > 12</gid >
 <home > /var/spool/clientmqueue</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 8</uid >
 <user_password > *</user_password >
 <username > mail</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Daemon</fullname >
 <gid > 2</gid >
 <home > /sbin</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 2</uid >
 <user_password > *</user_password >
 <username > daemon</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > NTP daemon</fullname >
 <gid > 111</gid >
 <home > /var/lib/ntp</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 74</uid >
 <user_password > *</user_password >
 <username > ntp</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Unix-to-Unix CoPy system</fullname >
 <gid > 14</gid >
 <home > /etc/uucp</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 10</uid >
 <user_password > *</user_password >
 <username > uucp</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > User for D-Bus</fullname >
 <gid > 101</gid >
 <home > /var/run/dbus</home >
 <password_settings >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 100</uid >
 <user_password > *</user_password >
 <username > messagebus</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > User for haldaemon</fullname >
 <gid > 102</gid >
 <home > /var/run/hald</home >
 <password_settings >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 101</uid >
 <user_password > *</user_password >
 <username > haldaemon</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Oracle user</fullname >
 <gid > 107</gid >
 <home > /opt/oracle</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 104</uid >
 <user_password > *</user_password >
 <username > oracle</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > WWW daemon apache</fullname >
 <gid > 8</gid >
 <home > /var/lib/wwwrun</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 30</uid >
 <user_password > *</user_password >
 <username > wwwrun</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Puppet daemon</fullname >
 <gid > 106</gid >
 <home > /var/lib/puppet</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 103</uid >
 <user_password > *</user_password >
 <username > puppet</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > Manual pages viewer</fullname >
 <gid > 62</gid >
 <home > /var/cache/man</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 13</uid >
 <user_password > *</user_password >
 <username > man</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > MySQL database admin</fullname >
 <gid > 109</gid >
 <home > /var/lib/mysql</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 60</uid >
 <user_password > *</user_password >
 <username > mysql</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > PolicyKit</fullname >
 <gid > 110</gid >
 <home > /var/run/PolicyKit</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 105</uid >
 <user_password > *</user_password >
 <username > polkituser</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > News system</fullname >
 <gid > 13</gid >
 <home > /etc/news</home >
 <password_settings >
 <flag > </flag >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/bash</shell >
 <uid > 9</uid >
 <user_password > *</user_password >
 <username > news</username >
 </user >
 <user >
 <fullname > SSH daemon</fullname >
 <gid > 65</gid >
 <home > /var/lib/sshd</home >
 <password_settings >
 <inact > -1</inact >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 71</uid >
 <username > sshd</username >
 </user >
 <user >
 <encrypted  config:type ="boolean>" > true</encrypted >
 <fullname > PulseAudio daemon</fullname >
 <gid > 112</gid >
 <home > /var/lib/pulseaudio</home >
 <password_settings >
 <max > 99999</max >
 <min > 0</min >
 <warn > 7</warn >
 </password_settings >
 <shell > /bin/false</shell >
 <uid > 106</uid >
 <user_password > *</user_password >
 <username > pulse</username >
 </user >
 </users >
 <x11 >
 <color_depth  config:type ="integer>" > 24</color_depth >
 <display_manager > gdm</display_manager >
 <enable_3d  config:type ="boolean>" > true</enable_3d >
 <monitor >
 <display >
 <max_hsync  config:type ="integer>" > 48</max_hsync >
 <max_vsync  config:type ="integer>" > 60</max_vsync >
 <min_hsync  config:type ="integer>" > 31</min_hsync >
 <min_vsync  config:type ="integer>" > 50</min_vsync >
 </display >
 <monitor_device > 1024X768@60HZ</monitor_device >
 <monitor_vendor > --> VESA</monitor_vendor >
 </monitor >
 <resolution > 1024x768 (XGA)</resolution >
 <window_manager > gnome</window_manager >
 </x11 >
</profile >
 

SuSE自动化PXE网络安装

PXE基本原理

什么是PXE

PXE(Pre-boot Execution Environment)是由Intel设计的协议,它可以使计算机通过网络启动。协议分为client和server两端,PXE client在网卡的ROM中,当计算机引导时,BIOS把PXE client调入内存执行,并显示出命令菜单,经用户选择后,PXE client将放置在远端的操作系统通过网络下载到本地运行。PXE协议的成功运行需要解决以下两个问题:

  1. 既然是通过网络传输,那么计算机在启动时,它的IP地址由谁来配置;
  2. 通过什么协议下载Linux内核和根文件系统。

对于第一个问题,可以通过DHCP Server解决,由DHCP server来给PXE client分配一个IP地址,DHCP Server是用来给DHCP Client动态分配IP地址的协议,不过由于这里是给PXE Client分配IP地址,所以在配置DHCP Server时,需要增加相应的PXE特有配置。

至于第二个问题,在PXE client所在的ROM中,已经存在了TFTP Client。PXE Client使用TFTP Client,通过TFTP协议到TFTP Server上下载所需的文件。

这样,PXE协议运行的条件就具备了,下面我们就来看看PXE协议的工作过程。

工作过程

在下图中,PXE client是需要安装Linux的计算机,TFTP Server和DHCP Server运行在另外一台Linux Server上。Bootstrap文件、配置文件、Linux内核以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下。PXE client在工作过程中,需要三个二进制文件:bootstrap、Linux 内核和Linux根文件系统。Bootstrap文件是可执行程序,它向用户提供简单的控制界面,并根据用户的选择,下载合适的Linux内核以及Linux根文件系统。

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

方案介绍

这种方案需要首先设置一个启动服务器和一个安装服务器(可以配置在同一台物理机上),然后通过网络启动存放在启动服务器上的安装程序。安装程序会自动访问存放在安装服务器上的安装配置文件和安装介质来完成安装。

涉及到的技术

该方案主要应用了三种技术:

  1. 在PC上从网络启动SLES安装程序的PXE协议
  2. SLES安装程序提供的网络安装功能(即指通过网络访问安装介质)
  3. SLES安装程序提供的无人值守安装功能(SuSE称为AutoYast)
软硬件需求

要按本文介绍的方法完成自动化安装,你需要如下软硬件资源:

  • 一台PC机器作为启动和安装服务器(其它架构机器也可以)
  • 一台待安装的PC机器,它的网卡必须带有PXE支持
  • 一个建好的局域网,上述两台机器已经连接入同一子网
  • 待安装的SLES安装介质

配置tftpd

为了简化步骤,我们在XP虚拟机下搭建DHCP和TFTP服务端,用tftpd工具来整合实现PXE网络引导,注意服务端与客户端要在同一局域网内。在Linux下配置服务的原理类似,具体方法可参考互联网。

(2)启动tftpd32程序,选择【Settings】

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

(3)按需勾选,这里我们仅选择【TFTP】和【DHCP】

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

(4)TFTP设置如下

Base Directory:对应存放Linux的引导文件

PXE Compatibility:增强对不同型号网卡的网络启动支持

Show Progress bar:在网络引导过程中显示进度

Translate Unix file names:转化Unix文件名

Allow “” As virtual root:允许虚拟路径

其它高级选项:设置包括兼容性以及一些细节

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

(5)DHCP配置重点注意Boot File引导文件的设置和DHCP绑定地址

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

(6)tftpboot目录结构

file://D:tftpboot  (2  folders, 3  files, 35.86  MB, 36.46  MB in  total.)
│   INITRD    32.20  MB
│   LINUX 3.64  MB
│   pxelinux.0  16.04  KB
├─pxelinux.cfg  (0  folders, 1  files, 193  bytes, 193  bytes in  total.)
│         default 193  bytes
└─tftpd32   (0  folders, 4  files, 620.33  KB, 620.33  KB in  total.)
            EUPL-EN.pdf 33.51  KB
            tftpd32.chm 346.96  KB
            tftpd32.exe 200.50  KB
            tftpd32.ini 39.36  KB
 

INITRD和LINUX提取自Linux启动引导镜像

pxelinux.0是pxe启动引导镜像

pxelinux.cfg文件夹下的default文件为启动菜单配置项

编辑 tftpbootpxelinux.cfg,可以自定义autoinst.xml文件的访问方式和路径

default linux
# Install Linux
label linux
  kernel linux
  append initrd=initrd autoyast=ftp://198.15 .0.106 /suse/autoinst.xml install=ftp://198.15 .0.106 /suse splash=silent showopts
 

配置FTP

(1)下载Filezilla Server

http://filezilla-project.org/

(2)设置ftp

允许匿名访问帐户即可,配置好ftp路径

提取SLES镜像内的安装目录至ftp目录下

配置AutoYaST

使用SuSE中的AutoYaST工具生成autoinst.xml,复制到ftp任意目录下,注意文件路径与default配置相吻合

网络启动机器

前面的配置工作完成后,下面我们就在待安装机器上通过网络以无人值守的方式来安装

(1)启动待安装机器,选择从网卡启动。具体方法因BIOS版本不同而异。下图是从VMWare虚拟机上得到的选择网络启动的屏幕截图。

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

(2)网卡中的PXE代码会联系DHCP服务器来获取IP地址以及启动镜像,然后启动镜像被载入并运行。

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

(3)开始全自动安装

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

安装后添加自定义模块

我这里以添加Kernel内核补丁为例

<scripts >
<init-scripts  config:type ="list>" >
<script >
<filename>instkernel.sh</filename>
<debug config:type="boolean>">true</ debug>
<location > </location >
<interpreter > shell</interpreter >
<source > <!&#91;CDATA&#91;
#!/bin/bash
#
# After installation, the logfile from this script can be found in
# /var/adm/autoinstall/logs
#
echo "=========================================>"
echo "... Starting AutoYAST included script ...>"
echo "=========================================>"
rpm -ivh --root=/  ftp://144.131.254.206/update/3.0.74-0.6.8/kernel-default-base-3.0.74-0.6.8.1.x86_64.rpm
rpm -ivh --root=/  ftp://144.131.254.206/update/3.0.74-0.6.8/kernel-default-3.0.74-0.6.8.1.x86_64.rpm
rpm -ivh --root=/  ftp://144.131.254.206/update/3.0.74-0.6.8/kernel-source-3.0.74-0.6.8.1.x86_64.rpm
rpm -ivh --root=/  ftp://144.131.254.206/update/3.0.74-0.6.8/kernel-default-devel-3.0.74-0.6.8.1.x86_64.rpm
&#93;&#93;>
</source >
  </script >
</init-scripts >
</scripts >
 

小结

shell: 基于AutoYaST自动化安装SuSE实践
shell: 基于AutoYaST自动化安装SuSE实践

其实在研究自动化部署的过程中我们会遇到各种坑,只有踩过的人才能够体会其中的不容易,如果大家在测试和使用SuSE自动化安装时遇到任何问题,欢迎直接在原文下方留言,我们一起学习和成长^_^。

原文:http://wsgzao.github.io/post/autoyast/

shell: CentOS 6.5 设置静态IP

1、编辑网卡文件

vi /etc/sysconfig/network-scripts/ifcfg-eth0

设置网卡eth0的IPV4信息,需要注意的是,设置的IPADDR需要和局域网中其他机器处于同一网段。需设置容如下:
>
DEVICE=eth0                 /指出设备名称
>
BOOTPROT=static             /启动类型 dhcp|static
>
BROADCAST=192.168.1.255     /广播地址
>
HWADDR=00:06:5B:FE:DF:75  /硬件Mac地址
>
IPADDR=192.168.0.88          /IP地址
>
NETMASK=255.255.255.0       /子网掩码
>
NETWORK=192.168.0.0         /网络地址
>
GATEWAY=192.168.0.1         /网关地址
>
ONBOOT=yes                  /是否启动应用
>
TYPE=Ethernet               /网络类型

2、重启网卡

service network restart

重启网卡时,shell中可能会有重新配置IP的相关信息出现在shell中。

3、通过ping局域网中其他主机的IP来测试配置是否成功

ping 192.168.1.50

原文:http://blog.cnsolomo.com/ld/liunx/320.html

shell: 开发shell脚本检查Nginx实战分享

开发shell脚本检查Nginx实战分享

一、本脚本实现功能:

1、自动检查Nginx下面的代理节点是否正常

2、通过页面显示状态,有问题的节点给出页面报警及声音报警。

3、增加新节点,页面自动载入新节点,无需修改程序。

二、守护检查脚本

[root@lb01 extra]# cd /server/scripts/
[root@lb01 scripts]# vi nginx_check.sh
#!/bin/bash
# oldboy training 21 zhangyao
# Defined variables
NginxDir=/application/nginx
ExtraPath=$NginxDir/conf/extra
ScriptDir=/server/scripts
StatusLog=$ScriptDir/status.log
StatusHtml=$NginxDir/html/status/status.html
StatusHtmlOri=$NginxDir/html/status/status.html.ori
# Judge some files
[ -d $NginxDir ] ||exit 1
[ -d $ScriptDir ] ||mkdir -p $ScriptDir
[ -f $StatusLog ] ||touch $StatusLog
[ -f $StatusHtml ] ||touch $StatusHtml
# Defined Check URL Functions
function check_url(){
	status=`curl -s $2/check.html`
	if [ "$status>" == "OK>" ]
	  then
	     echo "$1 $2 up>" >>$StatusLog
	else
	     echo "$1 $2 down>" >>$StatusLog
	fi
}
# Defined List URL and Check Functions
function check(){
	>$StatusLog
	cd $ExtraPath
	for file in `ls`  #首先遍历extra目录下的所有文件,然后遍历每个文件的IP行,将参数传给check_url
	  do
	    url=(`awk -F "[ ]+>" '/server/ {print $3}' $file`)
	    for i in ${url[*]}
	      do
	check_url $file $i
	    done
	done
}
# Defined Html Table Format Functions
function table(){  #将表格的一行语句累加后一次性插入html文件
	char="<tr bgcolor=>"$1"><th>$2</th><th>$3</th><th>$4</th><th>$5</th></tr>>"
	sum="$sum>""$char>"
}
function html(){
	Index=1  #表格最左侧的一列,初始值为1
	flag=0
	sum=">"   #行语句初始值null
	/bin/cp $StatusHtmlOri $StatusHtml  #将status html文件初始化
	while read line  #一行行读入$StatusLog文件,格式为dynamic_pools 10.0.0.6:80 up
	   do
	     array_line=($line)
	     if [ "${array_line[2]}>" == "up>" ]
	       then
	         table "#90EE90>" $Index ${array_line[*]} #将颜色参数、index值及其他参数传给table函数
	     else
	   	 table "#FF0000>" $Index ${array_line[*]}
		 ((flag++)) #down情况下flag会计数
	     fi
	     ((Index++))
	done<$StatusLog
	&#91; $flag -eq 0 &#93; ||  #如果flag不为0,肯定有down机器,增加一个语音报警的功能,仿照zabbix
        sum=$sum"<audio id=>"clickSound" autoplay=>"autoplay"><source src=>"warning.mp3" type=>"audio/mpeg"></audio>>"
	sed -i "/C0C0C0/a $sum>" $StatusHtml  #将sum语句插入html文件
}
# Defined Main Functions
function main(){
	while true
	  do
	    check
	    html
	    sleep 5
	done
}
main
 

三、相关文件

status.html.ori

<!doctype html>
<html>
<head>
<meta charset="utf-8>">
<meta http-equiv="refresh>" content="5>">
<title>Nginx http upstream check status</title>
</head>
<body>
<div align="center>">
  <table width="1171>" height="682>" border="1>">
    <tr>
      <td background="20150516194115.jpg>" ><table align="center>" style="background-color:white>" cellspacing="0>" cellpadding="3>" border="1>">
  <tr bgcolor="#C0C0C0>"><th>Index</th><th>Upstream</th><th>Name</th><th>Status</th></tr></td>
    </tr>
  </table>
</div>
</body>
</html> 

status.html

<!doctype html>
<html>
<head>
<meta charset="utf-8>">
<meta http-equiv="refresh>" content="5>">
<title>Nginx http upstream check status</title>
</head>
<body>
<div align="center>">
  <table width="1171>" height="682>" border="1>">
	<tr>
	  <td background="20150516194115.jpg>" ><table align="center>" style="background-color:white>" cellspacing="0>" cellpadding="3>" border="1>">
  <tr bgcolor="#C0C0C0>"><th>Index</th><th>Upstream</th><th>Name</th><th>Status</th></tr></td>
<tr bgcolor=#90EE90><th>1</th><th>dynamic_pools</th><th>10.0.0.6:80</th><th>up</th></tr><tr bgcolor=#90EE90><th>2</th><th>static_pools</th><th>10.0.0.5:80</th><th>up</th></tr><tr bgcolor=#90EE90><th>3</th><th>static_pools</th><th>10.0.0.6:80</th><th>up</th></tr>
	</tr>
  </table>
</div>
</body>
</html>
 

四、nginx.conf站点配置

worker_processes  1;
events {
	worker_connections  1024;
}
http {
	include	   mime.types;
	default_type  application/octet-stream;
	sendfile		on;
	keepalive_timeout  65;
	include extra/static_pools;
	include extra/dynamic_pools;
	server {
		listen	   80;
		server_name   www.etiantian.org;
		location / {
		if ($http_user_agent ~* "MSIE>")
		  {
			 rewrite ^/ http://10.0.0.6/ie.html;
		  }
			root   html;
			index  index.html index.htm;
		}
	   location /image/ {
		proxy_pass  http://static_pools;
		include proxy.conf;
	   }
	   location /dynamic/ {
		proxy_pass  http://dynamic_pools;
		include proxy.conf;
	   }
	}
}
extra/dynamic_pools包含文件
upstream dynamic_pools {
	server 10.0.0.6:80 weight=5;
}
extra/static_pools包含文件
upstream static_pools {
	server 10.0.0.5:80 weight=5;
	server 10.0.0.6:80 weight=5;
}
 

站点下健康检查文件:check.html

ok

五、效果

正常状态效果:

shell: 开发shell脚本检查Nginx实战分享
shell: 开发shell脚本检查Nginx实战分享
报警效果节点故障条目变红,并且有声音报警(也可以实现邮件、短信报警)

shell: 开发shell脚本检查Nginx实战分享
shell: 开发shell脚本检查Nginx实战分享

谢谢大家!本文内容来自21期学员张耀!

原文:http://oldboy.blog.51cto.com/2561410/1656844

Shell脚本监控CPU、内存和硬盘利用率

在linux 下如何使用shell脚本来监控系统的cpu,内存和硬盘的使用率呢。请参考下面的脚本。
1、监控CPU利用率(通过vmstat工具)

#!/bin/bash
if [ `uname` != "Linux" ];then
       echo "check os not linux."
       exit 1
fi
which vmstat &>/dev/null
if [ $? -ne 0 ];then
       echo "vmstat command no found, please install procps package."
        exit 1
fi
cpu_us=`vmstat | awk '{print $13}' | sed -n '$p'`
cpu_sy=`vmstat | awk '{print $14}' | sed -n '$p'`
cpu_id=`vmstat | awk '{print $15}' | sed -n '$p'`
cpu_wa=`vmstat | awk '{print $16}' | sed -n '$p'`   #等待I/0完成
cpu_sum=$(($cpu_us+$cpu_sy))
cpu_info()
{echo "CPU_Sum : $cpu_sum% ( CPU_Use:${cpu_us}% , CPU_System:${cpu_sy}% )"
 echo "CPU_Idle : ${cpu_id}%"<br />echo "CPU_Wait : ${cpu_wa}"}
#cpu_info;<br />if [ $cpu_sum -ge 90 ];then
       echo "CPU utilization $cpu_sum." | mail -s "CPU Monitor" baojingtongzhi@163.com
fi
 

2、监控内存利用率

#!/bin/bash
which bc &>/dev/null
if [ $? -ne 0 ];then
       echo "bc command no found, Please install bc package."
       exit 1
fi
Date=`date +%F" "%H:%M`
IP=`ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d: -f2`
Total=`free -m | grep Mem | awk '{print $2}'`
Use=`free -m | awk '/buffers\// {print $NF}'`
Free=$(($Total-$Use))
Total_conv=`echo "scale=2;$Total/1024" | bc | awk '{print $1"G"}'`  #通过bc计算,保留小数点后两位(scale)
if [ $Free -lt 200 ];then
        Content=`echo -e "Date : $Date \nHost : $IP \nTotal : ${Total_conv} \nUse : ${Use}M \nFree : ${Free}M"`
        echo "$Content" | mail -s "Memory Monitor" baojingtongzhi@163.com
fi
 

3、监控磁盘利用率

#!/bin/bash
Date=`date +%F" "%H:%M`
IP=`ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d: -f2`
Total=`fdisk -l | grep "Disk /dev/sd[a-z]" |awk '{print $2$3"GB"}' |sed 's/:/=/'`
Disk_Use=`df -h |awk '{print $1"="$5}' | sed '1d' | sed 's/%//g'`
for i in $Disk_Use
do
       A=`echo $i |awk -F'=' '{print $2}'`
       if [ $A -gt 8 ];then
               echo -e "Date : $Date \nHost : $IP \nTotal : $Total \nProblem : Part Use ${i}%" | mail -s "Disk Monitor" aaa@163.com
      fi
done
 

Bash脚本15分钟进阶教程

这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT)。这里是一个修订和扩增版本。

脚本安全

我的所有bash脚本都以下面几句为开场白:

    #!/bin/bash
    set -o nounset
    set -o errexit

这样做会避免两种常见的问题:

  1. 引用未定义的变量(缺省值为“”)
  2. 执行失败的命令被忽略

需要注意的是,有些Linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”。
还要注意的是,在“errexit”模式下,虽然能有效的捕捉错误,但并不能捕捉全部失败的命令,在某些情况下,一些失败的命令是无法检测到的。(更多细节请参考这个帖子。)

脚本函数

在bash里你可以定义函数,它们就跟其它命令一样,可以随意的使用;它们能让你的脚本更具可读性:

    ExtractBashComments() {
        egrep "^#"
    }
    cat myscript.sh | ExtractBashComments | wc
    comments=$(ExtractBashComments < myscript.sh)

还有一些例子:

    SumLines() {  # iterating over stdin - similar to awk
        local sum=0
        local line=””
        while read line ; do
            sum=$((${sum} + ${line}))
        done
        echo ${sum}
    }
    SumLines < data_one_number_per_line.txt
    log() {  # classic logger
       local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: "
       echo "${prefix} $@" >&2
    }
    log "INFO" "a message"

尽可能的把你的bash代码移入到函数里,仅把全局变量、常量和对“main”调用的语句放在最外层。

变量注解

Bash里可以对变量进行有限的注解。最重要的两个注解是:

  1. local(函数内部变量)
  2. readonly(只读变量)
    # a useful idiom: DEFAULT_VAL can be overwritten
    #       with an environment variable of the same name
    readonly DEFAULT_VAL=${DEFAULT_VAL:-7}
    myfunc() {
       # initialize a local variable with the global default
       local some_var=${DEFAULT_VAL}
       ...
    }

这样,你可以将一个以前不是只读变量的变量声明成只读变量:

x=5
x=6
readonly x
x=7   # failure

尽量对你bash脚本里的所有变量使用localreadonly进行注解。

$()代替反单引号(`)

反单引号很难看,在有些字体里跟正单引号很相似。$()能够内嵌使用,而且避免了转义符的麻烦。

# both commands below print out: A-B-C-D
echo "A-`echo B-\`echo C-\\\`echo D\\\`\``"
echo "A-$(echo B-$(echo C-$(echo D)))"

[[]](双层中括号)替代[]

使用[[]]能避免像异常的文件扩展名之类的问题,而且能带来很多语法上的改进,而且还增加了很多新功能:

操作符 功能说明
|| 逻辑or(仅双中括号里使用)
&& 逻辑and(仅双中括号里使用)
< 字符串比较(双中括号里不需要转移)
-lt 数字比较
= 字符串相等
== 以Globbing方式进行字符串比较(仅双中括号里使用,参考下文)
=~ 用正则表达式进行字符串比较(仅双中括号里使用,参考下文)
-n 非空字符串
-z 空字符串
-eq 数字相等
-ne 数字不等

单中括号:

[ "${name}" \> "a" -o ${name} \< "m" ]

双中括号

[[ "${name}" > "a" && "${name}" < "m"  ]]

正则表达式/Globbing

使用双中括号带来的好处用下面几个例子最能表现:

t="abc123"
[[ "$t" == abc* ]]         # true (globbing比较)
[[ "$t" == "abc*" ]]       # false (字面比较)
[[ "$t" =~ [abc]+[123]+ ]] # true (正则表达式比较)
[[ "$t" =~ "abc*" ]]       # false (字面比较)

注意,从bash 3.2版开始,正则表达式和globbing表达式都不能用引号包裹。如果你的表达式里有空格,你可以把它存储到一个变量里:

r="a b+"
[[ "a bbb" =~ $r ]]        # true

按Globbing方式的字符串比较也可以用到case语句中:

case $t in
abc*)  <action> ;;
esac

字符串操作

Bash里有各种各样操作字符串的方式,很多都是不可取的。
基本用户

    f="path1/path2/file.ext"
    len="${#f}" # = 20 (字符串长度)
    # 切片操作: ${<var>:<start>} or ${<var>:<start>:<length>}
    slice1="${f:6}" # = "path2/file.ext"
    slice2="${f:6:5}" # = "path2"
    slice3="${f: -8}" # = "file.ext"(注意:"-"前有空格)
    pos=6
    len=5
    slice4="${f:${pos}:${len}}" # = "path2"

替换操作(使用globbing)

    f="path1/path2/file.ext"
    single_subst="${f/path?/x}"   # = "x/path2/file.ext"
    global_subst="${f//path?/x}"  # = "x/x/file.ext"
    # 字符串拆分
    readonly DIR_SEP="/"
    array=(${f//${DIR_SEP}/ })
    second_dir="${arrray[1]}"     # = path2

删除头部或尾部(使用globbing)

    f="path1/path2/file.ext"
    # 删除字符串头部
    extension="${f#*.}"  # = "ext"
    # 以贪婪匹配方式删除字符串头部
    filename="${f##*/}"  # = "file.ext"
    # 删除字符串尾部
    dirname="${f%/*}"    # = "path1/path2"
    # 以贪婪匹配方式删除字符串尾部
    root="${f%%/*}"      # = "path1"

避免使用临时文件

有些命令需要以文件名为参数,这样一来就不能使用管道。这个时候 <() 就显出用处了,它可以接受一个命令,并把它转换成可以当成文件名之类的什么东西:

# 下载并比较两个网页
diff <(wget -O - url1) <(wget -O - url2)

还有一个非常有用处的是”here documents”,它能让你在标准输入上输入多行字符串。下面的’MARKER’可以替换成任何字词。

# 任何字词都可以当作分界符
command  << MARKER
...
${var}
$(cmd)
...
MARKER

如果文本里没有内嵌变量替换操作,你可以把第一个MARKER用单引号包起来:

command << 'MARKER'
...
no substitution is happening here.
$ (dollar sign) is passed through verbatim.
...
MARKER

内置变量

变量 说明
$0 脚本名称
$n 传给脚本/函数的第n个参数
$$ 脚本的PID
$! 上一个被执行的命令的PID(后台运行的进程)
$? 上一个命令的退出状态(管道命令使用${PIPESTATUS})
$# 传递给脚本/函数的参数个数
$@ 传递给脚本/函数的所有参数(识别每个参数)
$* 传递给脚本/函数的所有参数(把所有参数当成一个字符串)
提示
使用$*很少是正确的选择。
$@能够处理空格参数,而且参数间的空格也能正确的处理。
使用$@时应该用双引号括起来,像”$@”这样。

调试

对脚本进行语法检查:

bash -n myscript.sh

跟踪脚本里每个命令的执行:

bash -v myscripts.sh

跟踪脚本里每个命令的执行并附加扩充信息:

bash -x myscript.sh

你可以在脚本头部使用set -o verboseset -o xtrace来永久指定-v-o。当在远程机器上执行脚本时,这样做非常有用,用它来输出远程信息。

什么时候不应该使用bash脚本

  • 你的脚本太长,多达几百行
  • 你需要比数组更复杂的数据结构
  • 出现了复杂的转义问题
  • 有太多的字符串操作
  • 不太需要调用其它程序和跟其它程序管道交互
  • 担心性能

这个时候,你应该考虑一种脚本语言,比如Python或Ruby。
(原文地址

linux下如何只显示所有的隐藏文件

linux 命令
对于linux管理员,有时候需要查找出并且只显示某个目录下所有的隐藏文件,那么我们如何来实现呢?下面请看本文的介绍如何使用find命令来递归查找目录下的所有的隐藏文件。
通过下面的命令来查找root目录下的所有的隐藏文件

[root@devops ~]# find /root -name ".*"
/root/.ssh
/root/.bash_history
/root/.bash_logout
/root.bashrc
/root/.cshrc
/root/.viminfo
/root/.bash_profile
/root/.test1.swp
/root/.mysql_history
/root/.tcshrc

如果想把查到的文件全部删掉可以使用下面的命令

[root@devops ~]# find /root -name ".*"
| xargs rm -rf

更多的关于find的命令的使用,可以参考官方文档 

Linux:Bash shell如何删除目录下除了特定类型文件外的所有文件

于在linux环境下工作的人来说,需要经常对目录下的文件做操作,包括创建文件,删除文件,链接文件,或者拷贝文件等等。现在有一个需求是,如何通过bash shell 删除特定目录下的除了文件名包含.gz 或者.zip的所有文件?我们平时做的最多的关于删除文件的操作是删除特定模式的文件,通过使用rm命令,再加上linux下三个通配符:*,?, [..].
其中:* – 是匹配任意字符
?- 匹配任意一个单一字符
[…] – 匹配任意一个方括号中的字符

通过使用shopt扩展模式匹配

如果之前使用过shopt命令的话,应该都知道shopt和set命令类似,用来定制shell的环境。下面我们通过下面的shopt命令来扩展shell的模式匹配功能,这样的话,上面的三个通配符的功能会被扩展,而且还会引入新的元字符。

[root@devops work]# shopt -s extglob

之后我们就可以使用特有的元字符“!”来删除除特定文件之外的所有文件,下面是一个具体的例子:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# rm -rf !(aa.tar.gz)
-bash: !: event not found
[root@devops work]# shopt -s extglob
[root@devops work]# rm -rf !(*.gz)
[root@devops work]# ls
aa.tar.gz

当删除完文件之后,可以使用下面的命令关掉extglob选项。
[root@devops work]# shopt -u extglob

通过使用grep和rm命令结合来实现删除除特定文件的所有文件

我们可以使用grep命令特有的选项“-v”来查找出所有除特定文件的所有文件,然后再通过rm命令来删除,下面再举个例子:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# ls | grep -v '.gz' | xargs rm -rf
[root@devops work]# ls
aa.tar.gz

或者

rm `ls | grep -v '.gz'`

通过find命令来删除除特定文件外的所有文件

使用过find的人应该都知道,find命令的功能相当的强大,选项众多。我们可以使用下面的命令来实现该需求:

[root@devops work]# ls
aa aa.tar.gz bb cc
[root@devops work]# find ./ -type f -not -name '*.gz' -delete
[root@devops work]# ls
aa.tar.gz
[root@devops work]#

 
 

Linux Shell脚本的10个有用的“面试问题和解答”

首先致上每日问候。Linux的浩瀚无垠,使人总能每次都提交与众不同的内容。我们“The-Tecmint-Team”的工作是给我们的读者提供一些独特的内容,这些内容不仅对他们的职业生涯很有用,同时也让他们增长知识。在此,我们就尝试这么去做,至于能取得多大的成功,就由我们的读者朋友们来判断吧。
Questions on Shell Scripting
我们为各类用户提供了关于Shell脚本语言和面试问题的很多教程,可以访问以下链接去阅读这些文章。

在此,作为shell脚本的附加内容,在本文中我们将从面试的角度解读与Linux Shell相关的问题。

1. 在shell脚本成功执行前,如何中断脚本执行?

解答:我们需要使用‘exit’命令来实现以上描述的情境。‘exit’命令被强制输出非0值时,脚本会报错并退出。在Unix环境下的shell脚本中,0值表示成功执行。因此,在脚本终止前执行一个不带引号的‘exit -1’命令将使脚本中止。

例如,创建以下一个名为“anything.sh”的脚本。

  1. #!/bin/bash
  2. echo “Hello”
  3. exit -1
  4. echo “bye”

保存文件并执行。

  1. # sh anything.sh
  2. Hello
  3. exit.sh: 3: exit: Illegal number: -1

从上面的脚本中可以清楚地看到,在exit -1命令前,脚本执行得很好。

2. 如何使用Linux命令来移除文件头?

解答:当我们需要删除文件中的指定行时,‘sed’命令可以用来解决该问题。

这个是用来删除文件头(文件的首行)的正确命令。

  1. # sed ‘1 d’ file.txt

上面命令的问题是,它会在标准输出设备上输出不带首行的文件内容。为了保存输出到文件,我们需要使用重定向操作符,它将帮助你将输出重定向到文件。

  1. # sed ‘1 d’ file.txt > new_file.txt

好吧,其实sed命令内建的‘-i’开关就可以干这活,就不需要重定向符了吧。

  1. # sed -i ‘1 d’ file.txt

3. 你怎么检查一个文本文件中某一行的长度?

解答:‘sed’命令也可以用来查找文本文件中的某一行或者检查其长度。

sed -n ‘n p’ file.txt’可以解决,这里‘n’表示行号,‘p’打印出匹配内容(到标准输出),该命令通常与-n命令行选项连用。那么,怎样来获取长度计数呢?很明显,我们需要通过管道输出给‘wc’命令来计算。

  1. # sed –n ‘n p’ file.txt | wc –c

要得到文本文件‘tecmint.txt’的第五行的长度,运行如下命令:

  1. # sed -n ‘5 p’ tecmint.txt | wc -c

4. 可以在Linux系统上查看到所有非打印字符吗?你是怎么做到的?

解答:可以。可以在Linux中查看所有的非打印字符。要实现上面所讲的方案,我们需要‘vi’编辑器的帮助。 怎样在‘vi’编辑器中显示非打印字符?

  • 打开vi编辑器。
  • 先按[esc]键,然后按‘:’进入到vi编辑器的命令模式。
  • 最后,从‘vi’编辑器的命令界面输入set list命令并执行。

: 这种方式可以查看文本文件中的所有非打印字符,包括ctrl+m(^M)

5. 假如你是一个员工组的团队领导,为xyz公司工作。公司要求你创建一个‘dir_xyz’目录,让该组成员都能在该目录下创建或访问文件,但是除了文件创建者之外的其他人不能删除文件,你会怎么做?

解答:这真是个有趣的工作方案。好吧,上面所讲的方案,我们需要通过下面的步骤来实施,这简直就是小菜一碟。

  1. # mkdir dir_xyz
  2. # chmod g+wx dir_xyz
  3. # chmod +t dir_xyz

第一行命令创建了一个目录(dir_xyz),上面的第二行命令让组(g)具有‘写’和‘执行’的权限,而上面的最后一行命令——权限位最后的‘+t’是‘粘滞位’,它用来替换‘x’,表明在这个目录中,文件只能被它们的拥有者、目录的拥有者或者是超级用户root删除。

6. 你能告诉我一个Linux进程经历的各个阶段吗?

解答:一个Linux进程在它的一生中,通常经历了四个主要阶段。

这里是Linux进程要经历的四个阶段。

  • 等待:Linux进程等待资源。
  • 运行:Linux进程当前正在执行中。
  • 停止:Linux进程在成功执行后或收到杀死进程信号后停止。
  • 僵尸:如果该进程已经结束,但仍然留在进程表中,被称为‘僵尸’。

7. Linux中cut命令怎么用?

解答:‘cut’是一个很有用的Linux命令,当我们要截取文件的指定部分并打印到标准输出,当文本区域以及文件本身很大时,这个命令很有用。

例如,截取‘txt_tecmint’文件的前10列。

  1. # cut -c1-10 txt_tecmint

要截取该文件中的第二,第五和第七列。

  1. # cut -d;-f2 -f5 -f7 txt_tecmint

8. ‘cmp’和‘diff’命令的区别是什么?

解答:‘cmp’和‘diff’命令用来获取相同的东西,但各有侧重。

diff’命令输出为了使两个文件一样而应该做的修改。而‘cmp’命令则将两个文件逐字节对比,并报告第一个不匹配的项。

9. 可以用‘echo’命令来替换‘ls’命令吗?

解答:可以的。‘ls’命令可以用‘echo’命令来替代。‘ls’命令列出目录内容,从替换上述命令的角度讲,我们可以使用‘echo *’,两个命令的输出完全一样。

10. 你可能听过inode吧。你能简要描述一下inode吗?

解答:‘inode’是一个‘数据结构’,在Linux上用于文件标识。每个文件在Unix系统上有一个独立的‘inode’和一个‘唯一的’inode号。

到此为止吧。在下一篇文章中,我们将讨论另外一些有趣味性而又有知识性的面试问题。到那时,别跑开,请上Tecmint.com,别忘了在下面的评论部分给我们提供一些有价值的反馈哦。


 
原文地址

10个linux 作业控制的bash 脚本实例

linux和unix都是多任务的操作系统,也就是说系统可以同时运行多个任务或者进程。下面我们来说一下在linux或者unix下用来处理多任务的作业控制命令。
什么是作业控制(job control)?
作业控制就是可以停止或者暂停正在执行的程序,还可以使暂停的进程重新开始运行。这些都是可以通过我们的shell程序来实现。
1.创建一个linux/unix 作业(job)

[root@devops ~]# top &
[1] 26569
 

在这个例子中:

[1]:表明刚才的作业号是1
26569: 这个是进程的ID号

让我们来多创建几个作业:

gedit /tmp/test.c &
sleep 1000 & 

2.列出当初正在后台运行的作业
为了查看当前运行的作业的状态,可以输入下面的命令:

$jobs
$jobs -l

命令输出如下:

[root@devops ~]# jobs
[1]-  Stopped                 top
[2]+  Stopped                 vim /tmp/test.c
[3]   Running                 sleep 1000 &
[root@devops ~]# jobs -l
[1]- 26650 Stopped (tty output)    top
[2]+ 26651 Stopped (tty output)    vim /tmp/test.c
[3]  26653 Running                 sleep 1000 &
[root@devops ~]#
 

3. 停止或暂停正在运行的作业
当一个程序正在运行的时候,如果想让该程序在后台执行,可以使用[ctrl]+ [z]或者使用kill命令:

kill -s stop PID

下面举一个通过ctrl+z来暂停正在执行的ping命令:

[root@devops ~]# ping osetc.com
PING osetc.com (42.96.192.124) 56(84) bytes of data.
64 bytes from 42.96.192.124: icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from 42.96.192.124: icmp_seq=2 ttl=64 time=0.036 ms
64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.033 ms
^Z
[4]+  Stopped                 ping osetc.com
[root@devops ~]#
 

4. 恢复暂停的作业到前台去运行
我们可以使用fg命令将暂停在后台的ping进程调到前台来运行,用法如下:

fg %5    #fg命令后跟百分号,再跟上作业号

如果想操作所有以“ping”开头的命令行作业,可以使用下面的格式:

fg %ping

示例输出:

root@devops ~]# fg %4
ping osetc.com
64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.033 ms
64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms
64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.030 ms
64 bytes from 42.96.192.124: icmp_seq=7 ttl=64 time=0.036 ms
^C
[root@devops ~]# fg %ping
ping osetc.com
64 bytes from 42.96.192.124: icmp_seq=3 ttl=64 time=0.023 ms
64 bytes from 42.96.192.124: icmp_seq=4 ttl=64 time=0.031 ms
64 bytes from 42.96.192.124: icmp_seq=5 ttl=64 time=0.030 ms
64 bytes from 42.96.192.124: icmp_seq=6 ttl=64 time=0.029 ms
^C
--- osetc.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 10964ms
rtt min/avg/max/mdev = .023/0.027/0.031/0.006 ms
 

5. 恢复后台已暂停的进程继续在后台运行
我们可以使用bg命令将后台挂起的进程重新开始执行,示例如下:

[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Stopped                 ping osetc.com
[5]   Running                 sleep 1000000 &
[root@devops ~]# kill -s stop %5
[root@devops ~]# jobs
[2]   Stopped                 vim /tmp/test.c
[4]-  Stopped                 ping osetc.com
[5]+  Stopped                 sleep 1000000
 

从上面示例可以看出,正在运行sleep进程被挂起了。

[root@devops ~]# bg %5
[5]+ sleep 1000000 &amp;
[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Stopped                 ping osetc.com
[5]   Running                 sleep 1000000 &
 

将挂起在后台的进程重新开始执行
6. 杀掉一个进程
为了杀掉一个linux命令的进程,我们可以输入kill命令加上该进程的作业ID号,用法如下:

#kill %4

示例输出如下:

[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Stopped                 ping osetc.com
[5]   Running                 sleep 1000000 &
[root@devops ~]# kill %4
[4]+  Stopped                 ping osetc.com
[root@devops ~]# jobs
[2]-  Stopped                 vim /tmp/test.c
[4]+  Terminated              ping osetc.com
[5]   Running                 sleep 1000000 &amp;
[root@devops ~]# jobs
[2]+  Stopped                 vim /tmp/test.c
[5]-  Running                 sleep 1000000 &amp;
[root@devops ~]#
 

7.为什么shell在退出后会杀掉所有的后台作业进程
默认情况下,当前shell在退出的时候会发送一个HUP信号,杀掉所有后台作业,如果想让作业在当前shell退出后任然能保持在后台运行,那么可以在输入disown命令,再退出shell程序。

[root@devops ~]# jobs
[1]+  Running                 tail -f /var/log/messages &
[root@devops ~]# disown
[root@devops ~]# exit
 

8.使用nohup命令来阻止后台的进程在退出shell后被杀掉

[root@devops ~]# nohup tail -f /var/log/messages &
[1] 26806
[root@devops ~]# exit
 

9. 查找最近一次执行的作业的进程号
为了查找最近一次执行的作业的进程ID号,可以使用下面的特殊符号:$!

[root@devops ~]# jobs -l
[1]+ 26832 Stopped (tty output)    top
[2]- 26833 Running                 sleep 100000 &
[root@devops ~]# echo $!
26833
 

10. wait命令等待作业的完成
wait命令用来等待给定进程ID运行完成,而后执行wait命令后的程序

sleep 100 &
wait $!
date

Bash shell:如何去掉字符串或变量里的空格

对于下面的bash变量,如何去掉变量值的前后空白呢?
out=”$(awk -F’,’ ‘/file/ {print $9}’ devops.file)”
你可以是用sed, awk, cut, tr 或者其他的工具来去除$out的空白字符。
示例:
定义一个out变量:

out= "  bash test"
 

使用echo 命令来显示$out:

echo "$out"
 

命令输出:

bash test
 

sed 例子

echo "$out" | sed -e 's/^[ \t]*//'
 

命令输出:

bash test
 

Awk 示例

out="     bash test     “
echo "=${out}="
##使用awk去除变量值前面和后面的空白字符
echo "${out}" | awk '{gsub(/^ +| +$/, "")} {print "=" $0 "="}'
 

示例输出:

=bash shell=
 

bashshell:如何删除文本行所有的空白字符

在文本文件中,如何删除文件中每行的所有的空白字符呢?
我们可以通过sed 命令来实现,或者通过下面的一下文本处理工具来实现需求:
1.perl
2.python
3.awk
Perl 例子:
[cc lang=”php”] perl -lape ‘s/\s+//sg’ test >testoutput
[/code] 或者使用
[cc lang=”php”] perl -lapi -e ‘s/\s+|^\n//sg’ test
[/code] sed 例子:
[cc lang=”php”] sed -e ‘s/^[ \t]*//’ -e ‘s/[ \t]*$//’ testfile > testoutput
[/code] awk 例子:
[cc lang=”php”] awk ‘{$1=$1}{ print }’ testfile > testoutput
[/code]

Bash:在linux终端上显示网页内容

在bash shell下,如何获取到HTML网页内容并将其显示在终端屏幕上呢?
你可以使用下面的任何一个工具或者它们的组合来得到网页的内容:
1)curl命令 — 这是可以使用http/https/ftp或者其它的协议获取网页内容的数据传输工具。
2)lynx命令 — 是一个在文本模式下浏览网页内容的网页浏览器。
3)wget命令 — 是一个免费的非交互式从网页上下载数据的工具,支持HTTP/HTTPS/FTP协议。
4)w3m命令 — 也是一个基于文本的网页浏览器
工具安装
在你的linux或Unix操作系统上,上面的工具可能没有被安装,可通过下面的方式:
Debian/Ubuntu linux上安装curl, wget, lynx 和w3m

$apt-get install curl wget lynx w3m
 

Fedora/RHEL/CentOS linux上安装curl, wget, lynx 和w3m

$sudo yum install curl wget lynx w3m
 

FreeBSD Unix 上安装curl, wget, lynx 和w3m
[cc lang=”bash] $sudo pkg_add -v -r curl lynx w3m wget
[/code] 示例
使用curl命令来下载网页页面:

curl http://osetc.com/
curl https://www.osetc.com/linux-how-to-see-which-port-is-being-used-tcp80.html
 

使用curl并保存输出到一个变量:

tmp="$(curl http://osetc.com/)"
tmp="$(curl https://www.osetc.com/linux-how-to-see-which-port-is-being-used-tcp80.html)"
 

lynx 命令示例

lynx -dump www.osetc.com
lynx -dump https://www.osetc.com/linux-how-to-see-which-port-is-being-used-tcp80.html
 

上面的dump选项会转存默认文档的格式化输出。
wget命令示例

wget -o - http://www.osetc.com
wget -o - https://www.osetc.com/linux-how-to-see-which-port-is-being-used-tcp80.html
 

将wget的输出赋值给一个变量

tmp="$(wget -O - http://www.osetc.com)"
echo "$tmp"
echo "$tmp" | w3m -dump -T text/html
echo "$tmp" | lynx -dump -stdin
 

w3m命令示例

w3m -dump http://www.osetc.com
w3m -dump https://www.osetc.com/linux-how-to-see-which-port-is-being-used-tcp80.html
 

Linux/Unix:shell脚本如何查出脚本文件所在的目录

在脚本开发中,我们有时候需要获取脚本文件所在的目录,这样就可以读去脚本所在目录的其它文件。例如,如果脚本位于“/home/test/sch1.sh”,我想读取
“/home/test”目录下的其它文件。那么如何才能知道该脚本所在的目录的路径和shell 脚本的目录位置呢?
你可以通过下面的方法来获取路径名的部分信息:
1.basename 命令 –显示路径名的文件名部分
2.dirname 命令–显示路径的目录部分
3. bash参数替换
4. $0替换脚本名
示例:下面的例子显示目录的路径

dirname /root/test.sh/ 

命令输出:

/root 

下面的行设置shell 变量t的值为”/root/cn/test/scr”:

t=`dirname /root/cn/test/scr/test.sh"
echo "$t" 

OR

t=$(dirname /root/cn/test/scr/test.sh)
echo "$t" 

使用$0来替换“/root/cn/test/scr/test.sh”

#!/bin/bash
scriptname="$0"
basename=$(dirname  $scriptname)
echo "脚本 $scriptname在目录 $basename里." 

命令输出:

脚本 /root/cn/test/scr/test.sh在目录/root/cn/test/scr里. 

使用bash shell变量替换参数 ${var%pattern}

var=${path%/*} 

示例:

x="/root/cn/test/scr/test.sh"
echo "${x%/*}"
y="${x%/*}"
echo "$y" 

AWK 浮点数加法运算的结果如何依旧为浮点数

在我这样的一个需求:通过awk从一个文本文件中过滤出包含“gor”字符串的行,并计算出每行中第二个字段(浮点数)的累加和。当执行完awk后,得到的结果却是四舍五入后的整数,而我们期望的结果是浮点数值,类似于345.33,不是345.
awk 命令如下:
grep ‘gor’ try.txt | awk ‘BEGIN{ sum=0.0}{ sub(“,”,””,$2); sum +=$2}END{ print “$” sum}’
$345
那么我们才能得到想要的345.33这样的浮点数值输出呢?
awk 默认情况下会以双精度浮点数来表示所有的数值。换句话说,所有的数在awk里皆浮点数,所有的算数操作都以浮点数来进行。
示例:AWK 浮点运算
这个的例子将会使用一个叫try.txt的文件,该文件包含了一些数值。
[cc lang=”php”] d1 18.2 14.2
d2 11.5 6.60
d3 4.5  4.30
d4 2.5 17.5
d5 3    5
[/code] 下面的awk脚本将会计算第二字段和第三个字段的总和
[cc lang=”php”] awk ‘{ sum = $2 + $3; print $1, sum }’ try.txt
[/code] 脚本输出结果:
[cc lang=”php”] d1 32.4
d2 18.1
d3 8.8
d4 20
d5 8
[/code] awk对每个字段求平均值
[cc lang=”php”] awk ‘{ sum = $2 + $3; avg = sum/2; print $1, sum , avg}’ try.txt
[/code] 输出结果:
[cc lang=”php”] d1 32.4 16.2
d2 18.1 9.05
d3 8.8 4.4
d4 20 10
d5 8 4
[/code]  
输出内容格式化
在awk中我们可以类似于C语言中的printf,这样可以输出更好看更有意义的结果
[cc lang=”php”] awk ‘{ sum = $2 + $3 ; avg = sum/4; printf “%s: $%.2f ($%05.2f)n”,$1, sum, avg}’ try.txt
[/code] 输出结果:
[cc lang=”php”] d1: $32.40 ($08.10)
d2: $18.10 ($04.53)
d3: $8.80 ($02.20)
d4: $20.00 ($05.00)
d5: $8.00 ($02.00)
[/code] 回到刚开始的问题,我们可以用下面的awk命令来替换之前的命令:
[cc lang=”php”] grep ‘gor’ testing.txt  | awk ‘BEGIN{ sum=0.0}{ sub(“,”,””,$2); sum +=$2}END{printf “$%.2fn”, sum}’
[/code] 推荐阅读:
.更多信息可参考awk命令man帮助

Linux:查看目录大小的命令

于的linux新手,如何在linux系统下通过命令行来查看目录的大小呢?
你可以使用强大的“du”命令:
[a]查找并估算文件的使用空间
[b]汇总每个目录的磁盘使用情况
显示目录和文件的大小
基本的命令参数
[cc lang=”php”] du
du 目录名
du [选项] 目录名
[/code] 示例:
du命令如果不带任何参数,将会显示当前目录下每个的目录以及所有子目录的名字和使用空间大小
[cc lang=”php”] #du
[/code] 命令输出:
du command
如何想查看/var或者home目录的目录信息,可以输入下面的命令:
[cc lang=”php”] du /var/
du /root/home
[/code]  
du 命令后跟”-h”选项,可以以更易读的格式来显示输出: 例如,可以以KB,MB,GB为单位显示
[cc lang=”php”] du -h /etc/
du -h /var/
du -h /root/home
du -h
[/code] 输出结果:
du command2
 
“-s”选项,将会输出当前目录的总的磁盘使用空间
[cc lang=”php”] du -sh
du -sh /etc/
du -sh /root/home
[/code] 示例输出:
[cc lang=”php”] [root@osetc.com cache]# du -sh man yum
1.7M    man
93M     yum
[/code]  
使用“-c”可以对查看的所有目录大小做汇总
[cc lang=”php”] du -csh /root /etc/ /home
[root@osetc.com cache]# du -csh /root /etc/ /home
906M    /root
4.4M    /etc/
20K     /home
910M    total
[/code] 其它资料参考:
. 参考du命令的man帮助

Linux/Unix:通过dd命令创建1GB的二进制镜像大文件

linux/unix/BSD系统下,如何通过shell命令来快速创建1GB或者10GB的image镜像文件呢?
我们可以用”dd”命令来创建image文件。首先, 要确保系统中有足够的磁盘空间来通过”dd”去创建image文件:

$df -H 

创建1MB大小的文件(1024kb),输入下面的shell命令:

$ dd if=/dev/zero of=osetc.com.img bs=1024 count=0 seek=1024 

 
创建10MB大小的文件,输入shell命令:

$ dd if=/dev/zero of=osetc.com.img bs=1024 count=0 seek=$[1024*10] 

 
创建100MB大小的image文件,我们可以输入下面的命令:

$ dd if=/dev/zero of=osetc.com.img bs=1024 count=0 seek=$[1024*100] 

 
快速产生10GB的文件:

$ dd if=/dev/zero of=osetc.com.img bs=1000 count=0 seek=$[1000*1000*10] 

 
以上shell命令的输出类似于下面:

[root@osetc.com ~]# dd if=/dev/zero of=osetc.com.img bs=1024 count=0 seek=$[1024*10]
0+0 records in
0+0 records out
0 bytes (0 B) copied, 1.1595e-05 s, 0.0 kB/s 

 
下面来验证下我们生产的文件大小:

[root@osetc.com ~]# dd if=/dev/zero of=osetc.com.img bs=1024 count=0 seek=1024
0+0 records in
0+0 records out
0 bytes (0 B) copied, 8.803e-06 s, 0.0 kB/s
[root@osetc.com ~]# ls -lh
-rw-r--r-- 1 root root 1.0M Jul 23 22:11 osetc.com.img
 

LINUX:查看硬盘的可用剩余空间的方法

关于如何查看硬盘使用情况的方法,我们首先会想到通过“df” 命令,该命令会显示当前挂在文件系统可用的磁盘空间大小, df 命令一般来说可以显示或者查看下面的一些信息:
1.已用和可用的空间大小
2.文件系统的挂载点
3.文件系统使用情况的百分比
4.可用的inode数量
5.查看是否还有足够的空间来升级或安装新的程序
df 基本用法

df
df /dirpath/
df [选项]
df [选项】 /dirpath/

df 示例

#df
#df -H

命令输出结果为:

[root@osetc.com ~]# df -H
Filesystem             Size   Used  Avail Use% Mounted on
/dev/sda2              983G   317G   616G  34% /
tmpfs                   17G   103k    17G   1% /dev/shm

下面的例子是将只显示包含/var目录的挂载分区的磁盘使用情况

#df /var
#df -h /var

显示inode的使用情况,可以使用下面的命令:

# df -i
#df -ih
#df -i /dev/sda2

输出结果为:

[root@osetc.com ~]# df -i /dev/sda2
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda2            60915712  173179 60742533    1% /
[root@osetc.com ~]# df -ih /dev/sda2
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda2                59M    170K     58M    1% /

使用“-T”选项来查看文件系统的类型

#df -T

命令输出为:

[root@osetc.com ~]# df -T
Filesystem    Type   1K-blocks      Used Available Use% Mounted on
/dev/sda2     ext4   959242704 309488700 601027220  34% /
tmpfs        tmpfs    16429028       100  16428928   1% /dev/shm

df命令选项:
-h 以容易理解的格式输出文件系统分区占用情况,例如32k,120M,60G。
-k 以K大小为单位输出文件系统分区占用情况。
-m 以M大小为单位输出文件系统分区占用情况。
-a 列出所有的文件系统分区,包含 0 大小的文件系统分区。
-i 列出文件系统分区的inodes信息。
-T 显示磁盘分区的文件系统类型。

更多关于df命令选项可以参考man帮助