分类 技术 下的文章

PowerDNS是一个运行在许多Linux/Unix衍生版上的DNS服务器,它可以使用不同的后端进行配置,包括BIND类型的区域文件、关系型数据库,或者负载均衡/失效转移算法。它也可以被配置成一台DNS递归器,作为服务器上的一个独立进程运行。

PowerDNS授权服务器的最新版本是3.4.4,但是当前EPEL仓库中可以获得的版本是3.4.3。我推荐安装EPEL仓库中提供的那一个,因为该版本已经在CentOS和Fedora中测试过。那样,你也可以在今后很容易地更新PowerDNS。

本文用于向你演示如何安装并配置以MariaDB作为后端的PowerDNS,以及它的界面友好的 Web 管理工具 PowerAdmin。

出于本文的写作目的,我将使用以下服务器:

主机名: centos7.localhost 
IP地址: 192.168.0.102

第一部分: 安装带有MariaDB后端的PowerDNS

1、 首先,你需要为你的系统启用EPEL仓库,只需使用:

# yum install epel-release.noarch 

Enable Epel Repository

启用Epel仓库

2、 下一步是安装MariaDB服务器。运行以下命令即可达成:

# yum -y install mariadb-server mariadb

Install MariaDB Server

安装MariaDB服务器

3、 接下来,我们将配置并启用MariaDB,并设置开机启动:

# systemctl enable mariadb.service
# systemctl start mariadb.service

Enable Start MariaDB System Boot

启用MariaDB开机启动

4、 现在MariaDB服务运行起来了,我们将为MariaDB设置密码进行安全加固,运行以下命令:

# mysql_secure_installation

按照指示做

/bin/mysql_secure_installation: line 379: find_mysql_client: command not found

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  Press ENTER
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y     
New password:  ← Set New Password
Re-enter new password:  ← Repeat Above Password
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y ← Choose “y” to disable that user
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] n ← Choose “n” for no
 ... skipping.

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y ← Choose “y” for yes
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y ← Choose “y” for yes
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

5、 MariaDB配置成功后,我们可以继续去安装PowerDNS。运行以下命令即可轻易完成:

# yum -y install pdns pdns-backend-mysql

Install PowerDNS with MariaDB Backend

安装带有MariaDB后端的PowerDNS

6、 PowerDNS的配置文件位于/etc/pdns/pdns,在编辑之前,我们将为PowerDNS服务配置一个MariaDB数据库。首先,我们将连接到MariaDB服务器并创建一个名为powerdns的数据库:

# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE powerdns;

Create PowerDNS Database

创建PowerDNS数据库

7、 接下来,我们将创建一个名为powerdns的数据库用户:

MariaDB [(none)]> GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY ‘tecmint123’;
MariaDB [(none)]> GRANT ALL ON powerdns.* TO 'powerdns'@'centos7.localdomain' IDENTIFIED BY 'tecmint123';
MariaDB [(none)]> FLUSH PRIVILEGES;

Create PowerDNS User

创建PowerDNS用户

注意: 请将“tecmint123”替换为你想要设置的实际密码。

8、 我们继续创建PowerDNS要使用的数据库表。像堆积木一样执行以下这些:

MariaDB [(none)]> USE powerdns;
MariaDB [(none)]> CREATE TABLE domains (
id INT auto_increment,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
primary key (id)
);

Create Table Domains for PowerDNS

创建用于PowerDNS的表domains

MariaDB [(none)]> CREATE UNIQUE INDEX name_index ON domains(name);
MariaDB [(none)]> CREATE TABLE records (
id INT auto_increment,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(6) DEFAULT NULL,
content VARCHAR(255) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
primary key(id)
);

Create Table Records for PowerDNS

创建用于PowerDNS的表 records

MariaDB [(none)]> CREATE INDEX rec_name_index ON records(name);
MariaDB [(none)]> CREATE INDEX nametype_index ON records(name,type);
MariaDB [(none)]> CREATE INDEX domain_id ON records(domain_id);

Create Index of Table

创建表索引

MariaDB [(none)]> CREATE TABLE supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
);

Create Table Supermaster

创建表supermasters

你现在可以输入以下命令退出MariaDB控制台:

MariaDB [(none)]> quit;

9、 最后,我们可以继续配置PowerDNS了,以MariaDB作为后台。请打开PowerDNS的配置文件:

# vim /etc/pdns/pdns.conf 

在该文件中查找像下面这样的行:

#################################
# launch        Which backends to launch and order to query them in
#
# launch=

在这后面放置以下代码:

launch=gmysql
gmysql-host=localhost
gmysql-user=powerdns
gmysql-password=user-pass
gmysql-dbname=powerdns

修改“user-pass”为你先前设置的实际密码,配置如下:

Configure PowerDNS

配置PowerDNS

保存修改并退出。

10、 现在,我们将启动并添加PowerDNS到系统开机启动列表:

# systemctl enable pdns.service 
# systemctl start pdns.service 

Enable and Start PowerDNS

启用并启动PowerDNS

到这一步,你的PowerDNS服务器已经起来并运行了。要获取更多关于PowerDNS的信息,你可以参考手册http://downloads.powerdns.com/documentation/html/index.html

第二部分: 安装PowerAdmin来管理PowerDNS

11、 现在,我们将安装PowerAdmin——一个界面友好的PowerDNS服务器的 Web 管理器。由于它是用PHP写的,我们将需要安装PHP和一台网络服务器(Apache):

# yum install httpd php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mhash gettext

Install Apache PHP

安装Apache 和 PHP

PowerAdmin也需要两个PEAR包:

# yum -y install php-pear-DB php-pear-MDB2-Driver-mysql 

Install Pear

安装Pear

你也可以参考一下文章了解CentOS 7中安装LAMP堆栈的完整指南:

安装完成后,我们将需要启动并设置Apache开机启动:

# systemctl enable httpd.service
# systemctl start httpd.service

Enable Start Apache System Boot

启用Apache开机启动

12、 由于已经满足PowerAdmin的所有系统要求,我们可以继续下载软件包。因为Apache默认的网页目录位于/var/www/html/,我们将下载软件包到这里。

# cd /var/www/html/
# wget http://downloads.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz 
# tar xfv poweradmin-2.1.7.tgz

Download PowerAdmin

下载PowerAdmin

13、 现在,我们可以启动PowerAdmin的网页安装器了,只需打开:

http://192.168.0.102/poweradmin-2.1.7/install/

这会进入安装过程的第一步:

Select Installation Language

选择安装语言

上面的页面会要求你为PowerAdmin选择语言,请选择你想要使用的那一个,然后点击“进入步骤 2”按钮。

14、 安装器需要PowerDNS数据库:

PowerDNS Database

PowerDNS数据库

15、 因为我们已经创建了一个数据库,所以我们可以继续进入下一步。你会被要求提供先前配置的数据库详情,你也需要为Poweradmin设置管理员密码:

Enter PowerDNS Database Settings

输入PowerDNS数据库配置

16、 输入这些信息后,进入步骤 4。你将创建为Poweradmin创建一个受限用户。这里你需要输入的字段是:

  • 用户名(Username) - PowerAdmin用户名。
  • 密码(Password) – 上述用户的密码。
  • 主机管理员(Hostmaster) - 当创建SOA记录而你没有指定主机管理员时,该值会被用作默认值。
  • 主域名服务器 - 该值在创建新的DNS区域时会被用于作为主域名服务器。
  • 辅域名服务器 – 该值在创建新的DNS区域时会被用于作为辅域名服务器。

PowerDNS Configuration Settings

PowerDNS配置设置

17、 在下一步中,Poweradmin会要求你在数据库表中创建一个新的受限数据库用户,它会提供你需要在MariaDB控制台输入的代码:

Create New Database User

创建新的数据库用户

18、 现在打开终端并运行:

# mysql -u root -p

提供你的密码并执行由PowerAdmin提供的代码:

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE
ON powerdns.*
TO 'powermarin'@'localhost'
IDENTIFIED BY '123qweasd';

Grant Mysql Permissions to User

为用户授予Mysql权限

19、 现在,回到浏览器中并继续下一步。安装器将尝试创建配置文件到/var/www/html/poweradmin-2.1.7/inc。

文件名是config.inc.php。为防止该脚本没有写权限,你可以手动复制这些内容到上述文件中:

Configuration Settings of PowerDNS

配置PowerDNS设置

20、 现在,进入最后页面,该页面会告知你安装已经完成以及如何访问安装好的PowerAdmin:

PowerDNS Installation Completed

PowerDNS安装完成

你可以通过运行以下命令来启用用于其他动态DNS提供商的URL:

# cp install/htaccess.dist .htaccess 

出于该目的,你将需要在Apache的配置中启用mod\_rewrite。

21、 现在,需要移除从PowerAdmin的根目录中移除“install”文件夹,这一点很重要。使用以下命令:

# rm -fr /var/www/html/poweradmin/install/

在此之后,你可以通过以下方式访问PowerAdmin:

http://192.168.0.102/poweradmin-2.1.7/

PowerDNS Login

PowerDNS登录

在登录后,你应该会看到PowerAdmin的主页:

PowerDNS Dashboard

PowerDNS仪表盘

到这里,安装已经完成了,你也可以开始管理你的DNS区域了。

第三部分: PowerDNS中添加、编辑和删除DNS区域

22、 要添加新的主区域,只需点击“添加主区域”:

Add Master Zone

添加主区域

在下一页中,你需要填写一些东西:

  • 域(Domain) – 你要添加区域的域。
  • 所有者(Owner) – 设置DNS区域的所有者。
  • 模板(Template)– DNS模板 – 留空。
  • DNSSEC – 域名系统安全扩展(可选——看看你是否需要)。

点击“添加区域”按钮来添加DNS区域。

Master DNS Zone

主DNS区域

现在,你可以点击“首页”链接回到PowerAdmin的首页。要查看所有现存的DNS区域,只需转到“列出区域(List Zones)”:

Check List of Zones

查看区域列表

你现在应该看到一个可用DNS区域列表:

Check List of DNS Zones

检查DNS区域列表

23、 要编辑现存DNS区域或者添加新的记录,点击编辑图标:

Edit DNS Zone

编辑DNS区域

在接下来的页面,你会看到你选择的DNS区域的条目:

Domain DNS Zone Entries

域名的DNS区域条目

24、 在此处添加新的DNS条目,你需要设置以下信息:

  • 名称(Name) – 条目名称。只需添加域/子域的第一部分,PowerAdmin会添加剩下的。
  • 类型(Type) – 选择记录类型。
  • 优先级(Priority) – 记录优先级。
  • TTL – 存活时间,以秒计算。

出于本文目的,我将为子域new.example.com添加一个A记录用于解析IP地址192.168.0.102,设置存活时间为14400秒:

Add New DNS Record

添加新DNS记录

最后,点击“添加记录”按钮。

25、 如果你想要删除DNS区域,你可以回到“列出区域”页面,然后点击你想要删除的DNS区域旁边“垃圾桶”图标:

Delete DNS Zone

删除DNS区域

Poweradmin将问你是否确定想要删除DNS区域。只需点击“是”来完成删除。

如要获取更多关于怎样创建、编辑和删除区域的说明,你可以参与Poweradmin的文档:https://github.com/poweradmin/poweradmin/wiki/Documentation

我希望你已经发现本文很有趣,也很有用。一如既往,如果你有问题或要发表评论,请别犹豫,在下面评论区提交你的评论吧。


via: http://www.tecmint.com/install-powerdns-poweradmin-mariadb-in-centos-rhel/

作者:Marin Todorov 译者:GOLinux 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

今天我们来谈谈 Centos 7 中的一个文件系统tmpfs,这是一个将所有文件和文件夹写到虚拟内存中而不是实际写到磁盘中的虚拟文件系统。这意味中tmpfs中所有的内容都是临时的,在tmpfs卸载、系统重启或者电源切断后内容都将会丢失。技术的角度上来说,tmpfs将所有的内容放在内核内部缓存中并且会调整大小来容纳文件,并可从交换空间中交换出不需要的页。

CentOS默认使用tmpfs做的几种用途可用df -h命令的输出来看:

# df –h

df

  • /dev - 含有针对所有设备的设备文件的目录
  • /dev/shm - 包含共享内存分配
  • /run - 用于系统日志
  • /sys/fs/cgroup - 用于cgrpups, 一个针对特定进程限制、管制和审计资源利用的内核特性

显然,它也可以用作/tmp目录, 你可以用下面的两种方法来做到:

使用systemctl来在/tmp中启用tmpfs

你可以使用systemctl命令在tmp目录启用tmpfs, 首先用下面的命令来检查这个特性是否可用:

# systemctl is-enabled tmp.mount

这会显示当先的状态,(如果未启用,)你可以使用下面的命令来启用它:

# systemctl enable tmp.mount

systemctl

这会让系统控制/tmp目录并在该目录下挂载一个tmpfs文件系统。

手动挂载/tmp文件系统

你可以在/etc/fstab中添加下面这行,来手工在/tmp下挂载 tmpfs。

tmpfs /tmp tmpfs size=512m 0 0

接着运行这条命令

# mount –a

df

这应该就会在df -h中显示tmpfs了,同样也会在你下次重启时自动挂载。

立即创建tmpfs

如果由于一些原因,你需要在一个文件夹下立即创建tmpfs,你可以使用下面的命令:

# mount -t tmpfs -o size=1G tmpfs /mnt/mytmpfs

当然你可以在size选项中指定你希望的大小和希望的挂载点,只要记住是有效的目录就行了。


via: http://linoxide.com/file-system/use-tmpfs-rhel-centos-7-0/

作者:Adrian Dinu 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我们为你的面试准备选择了 70 个你可能遇到的 shell 脚本面试问题及解答。了解脚本或至少知道基础知识对系统管理员来说至关重要,它也有助于你在工作环境中自动完成很多任务。在过去的几年里,我们注意到所有的 linux 工作职位都要求脚本技能。

1) 如何向脚本传递参数 ?

./script argument

例子 : 显示文件名称脚本

./show.sh file1.txt

cat show.sh
#!/bin/bash
echo $1

(LCTT 译注:谢谢某匿名访客的提醒,原题有误,修改之。)

2) 如何在脚本中使用参数 ?

第一个参数 : $1,第二个参数 : $2

例子 : 脚本会复制文件(arg1) 到目标地址(arg2)

./copy.sh file1.txt /tmp/

cat copy.sh
#!/bin/bash
cp $1 $2

3) 如何计算传递进来的参数 ?

$#

4) 如何在脚本中获取脚本名称 ?

$0

5) 如何检查之前的命令是否运行成功 ?

$?

6) 如何获取文件的最后一行 ?

tail -1

7) 如何获取文件的第一行 ?

head -1

8) 如何获取一个文件每一行的第三个元素 ?

awk '{print $3}'

9) 假如文件中每行第一个元素是 FIND,如何获取第二个元素

awk '{ if ($1 == "FIND") print $2}'

10) 如何调试 bash 脚本

将 -xv 参数加到 #!/bin/bash 后

例子:

#!/bin/bash –xv

11) 举例如何写一个函数 ?

function example() {
echo "Hello world!"
}

12) 如何向连接两个字符串 ?

V1="Hello"
V2="World"
V3=${V1}${V2}
echo $V3

输出

HelloWorld
据匿名网友评论,本题原答案有误,已经修正。

13) 如何进行两个整数相加 ?

V1=1
V2=2
let V3=$V1+$V2
echo $V3

输出

3

据 @kashu 的意见,本题的更佳回答为:

两个整数相加,还有若干种方法实现:

A=5
B=6

echo $(($A+$B))  # 方法 2
echo $[$A+$B]    # 方法 3
expr $A + $B     # 方法 4
echo $A+$B | bc  # 方法 5
awk 'BEGIN{print '"$A"'+'"$B"'}'   # 方法 6

14) 如何检查文件系统中是否存在某个文件 ?

if [ -f /var/log/messages ]
then
echo "File exists"
fi

15) 写出 shell 脚本中所有循环语法 ?

for 循环 :

for i in $( ls ); do
echo item: $i
done

while 循环 :

#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done

until 循环 :

#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done

16) 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ?

这一行说明要使用的 shell。#!/bin/bash 表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。(LCTT译注:这一行称之为释伴行。)

17) 如何获取文本文件的第 10 行 ?

head -10 file|tail -1

18) bash 脚本文件的第一个符号是什么

#

19) 命令:[ -z "" ] && echo 0 || echo 1 的输出是什么

0

20) 命令 “export” 有什么用 ?

使变量在子 shell 中可用。

21) 如何在后台运行脚本 ?

在脚本后面添加 “&”。

据 @kashu 的意见,更好的答案是:

nohup command &

大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的command &没了...

22) "chmod 500 script" 做什么 ?

使脚本所有者拥有可执行权限。

23) ">" 做什么 ?

重定向输出流到文件或另一个流。

24) & 和 && 有什么区别

  • & - 希望脚本在后台运行的时候使用它
  • && - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它

25) 什么时候要在 [ condition ] 之前使用 “if” ?

当条件满足时需要运行多条命令的时候。

26) 命令: name=John && echo 'My name is $name' 的输出是什么

My name is $name

27) bash shell 脚本中哪个符号用于注释 ?

#

28) 命令: echo ${new:-variable} 的输出是什么

variable

29) ' 和 " 引号有什么区别 ?

  • ' - 当我们不希望把变量转换为值的时候使用它。
  • " - 会计算所有变量的值并用值代替。

30) 如何在脚本文件中重定向标准输出和标准错误流到 log.txt 文件 ?

在脚本文件中添加 "exec >log.txt 2>&1" 命令。

31) 如何只用 echo 命令获取字符串变量的一部分 ?

echo ${variable:x:y}
x - 起始位置
y - 长度

例子:

variable="My name is Petras, and I am developer."
echo ${variable:11:6} # 会显示 Petras

32) 如果给定字符串 variable="User:123:321:/home/dir",如何只用 echo 命令获取 home\_dir ?

echo ${variable#*:*:*:}

echo ${variable##*:}

33) 如何从上面的字符串中获取 “User” ?

echo ${variable%:*:*:*}

echo ${variable%%:*}

34) 如何使用 awk 列出 UID 小于 100 的用户 ?

awk -F: '$3<100' /etc/passwd

35) 写程序为用户计算主组数目并显示次数和组名

cat /etc/passwd|cut -d: -f4|sort|uniq -c|while read c g
do
{ echo $c; grep :$g: /etc/group|cut -d: -f1;}|xargs -n 2
done

36) 如何在 bash shell 中更改标准的域分隔符为 ":" ?

IFS=":"

37) 如何获取变量长度 ?

${#variable}

38) 如何打印变量的最后 5 个字符 ?

echo ${variable: -5}

39) ${variable:-10} 和 ${variable: -10} 有什么区别?

  • ${variable:-10} - 如果之前没有给 variable 赋值则输出 10;如果有赋值则输出该变量
  • ${variable: -10} - 输出 variable 的最后 10 个字符

40) 如何只用 echo 命令替换字符串的一部分 ?

echo ${variable//pattern/replacement}

41) 哪个命令将命令替换为大写 ?

tr '[:lower:]' '[:upper:]'

42) 如何计算本地用户数目 ?

wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l

43) 不用 wc 命令如何计算字符串中的单词数目 ?

set ${string}
echo $#

44) "export $variable" 或 "export variable" 哪个正确 ?

export variable

45) 如何列出第二个字母是 a 或 b 的文件 ?

ls -d ?[ab]*

46) 如何将整数 a 加到 b 并赋值给 c ?

c=$((a+b))

c=`expr $a + $b`

c=`echo "$a+$b"|bc`

47) 如何去除字符串中的所有空格 ?

echo $string|tr -d " "

48) 重写这个命令,将输出变量转换为复数: item="car"; echo "I like $item" ?

item="car"; echo "I like ${item}s"

49) 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 …)的命令 ?

for i in {0..100..3}; do echo $i; done

for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done

50) 如何打印传递给脚本的所有参数 ?

echo $*

echo $@

51) [ $a == $b ] 和 [ $a -eq $b ] 有什么区别

  • [ $a == $b ] - 用于字符串比较
  • [ $a -eq $b ] - 用于数字比较

52) = 和 == 有什么区别

  • = - 用于为变量赋值
  • == - 用于字符串比较

53) 写出测试 $a 是否大于 12 的命令 ?

[ $a -gt 12 ]

54) 写出测试 $b 是否小于等于 12 的命令 ?

[ $b -le 12 ]

55) 如何检查字符串是否以字母 "abc" 开头 ?

[[ $string == abc* ]]

56) [[ $string == abc\* ]] 和 [[ $string == "abc*" ]] 有什么区别

  • [[ $string == abc* ]] - 检查字符串是否以字母 abc 开头
  • [[ $string == "abc*" ]] - 检查字符串是否完全等于 abc*

57) 如何列出以 ab 或 xy 开头的用户名 ?

egrep "^ab|^xy" /etc/passwd|cut -d: -f1

58) bash 中 $! 表示什么意思 ?

后台最近执行命令的 PID.

59) $? 表示什么意思 ?

前台最近命令的结束状态。

60) 如何输出当前 shell 的 PID ?

echo $$

61) 如何获取传递给脚本的参数数目 ?

echo $#

(LCTT 译注:和第3题重复了。)

62) $\* 和 $@ 有什么区别

  • $* - 以一个字符串形式输出所有传递到脚本的参数
  • $@ - 以 $IFS 为分隔符列出所有传递到脚本中的参数

63) 如何在 bash 中定义数组 ?

array=("Hi" "my" "name" "is")

64) 如何打印数组的第一个元素 ?

echo ${array[0]}

65) 如何打印数组的所有元素 ?

echo ${array[@]}

66) 如何输出所有数组索引 ?

echo ${!array[@]}

67) 如何移除数组中索引为 2 的元素 ?

unset array[2]

68) 如何在数组中添加 id 为 333 的元素 ?

array[333]="New_element"

69) shell 脚本如何获取输入的值 ?

a) 通过参数

./script param1 param2

b) 通过 read 命令

read -p "Destination backup Server : " desthost

70) 在脚本中如何使用 "expect" ?

/usr/bin/expect << EOD
spawn rsync -ar ${line} ${desthost}:${destpath}
expect "*?assword:*"
send "${password}\r"
expect eof
EOD

祝你好运 !! 如果你有任何疑问或者问题需要解答都可以在下面的评论框中写下来。让我们知道这对你的面试有所帮助:-)


via: http://linoxide.com/linux-shell-script/shell-scripting-interview-questions-answers/

作者:Petras Liumparas 译者:ictlyh 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

'!'符号在Linux中不但可以用作否定符号,还可以用来从历史命令记录中取出命令或不加修改的执行之前运行的命令。下面的所有命令都已经在Bash Shell中经过确切地检验。尽管我没有试过,但大多都不能在别的Shell中运行。这里我们介绍下Linux命令行中符号'!'那惊人和奇妙的用法。

1. 使用数字从历史命令列表中找一条命令来执行

您也许没有意识到您可以从历史命令列表(之前已经执行的命令集)中找出一条来运行。首先,通过"history"命令查找之前命令的序号。

$ history

使用history命令找到最后执行的命令

使用history命令找到最后执行的命令

现在,只需要使用历史命令输出中显示在该命令前面的数字便可以运行这个命令。例如,运行一个在history输出中编号是1551的命令。

$ !1551

使用命令ID来执行最后运行的命令

使用命令ID来执行最后运行的命令

这样,编号为1551的命令(上面的例子是top命令)便运行了。这种通过ID号来执行之前的命令的方式很有用,尤其是在这些命令都很长的情况下。您只需要使用![history命令输出的序号]便可以调用它。

2. 运行之前的倒数第二个、第七个命令等

您可以以另一种方式来运行之前执行的命令,通过使用-1代表最后的命令,-2代表倒数第二个命令,-7代表倒数第七个命令等。

首先使用history命令来获得执行过的命令的列表。history命令的执行很有必要,因为您可以通过它来确保没有rm command > file或其他会导致危险的命令。接下来执行倒数第六个、第八个、第十个命令。

$ history
$ !-6
$ !-8
$ !-10

通过负数序号运行之前执行的命令

通过负数序号运行之前执行的命令

3. 传递最后执行的命令的参数,以方便的运行新的命令

我需要显示/home/$USER/Binary/firefox文件夹的内容,因此我执行:

$ ls /home/$USER/Binary/firefox

接下来,我意识到我应该执行'ls -l'来查看哪个文件是可执行文件。因此我应该重新输入整个命令么?不,我不需要。我仅需要在新的命令中带上最后的参数,类似:

$ ls -l !$

这里!$将把最后执行的命令的参数传递到这个新的命令中。

将上一个命令的参数传递给新命令

将上一个命令的参数传递给新命令

4. 如何使用!来处理两个或更多的参数

比如说我在桌面创建了一个文本文件file1.txt。

$ touch /home/avi/Desktop/1.txt

然后在cp命令中使用绝对路径将它拷贝到/home/avi/Downloads

$ cp /home/avi/Desktop/1.txt /home/avi/downloads

这里,我们给cp命令传递了两个参数。第一个是/home/avi/Desktop/1.txt,第二个是/home/avi/Downloads。让我们分别处理他们,使用echo [参数]来打印两个不同的参数。

$ echo "1st Argument is : !^"
$ echo "2nd Argument is : !cp:2"

注意第一个参数可以使用"!^"进行打印,其余的命令可以通过"![命令名]:[参数编号]"打印。

在上面的例子中,第一个命令是cp,第二个参数也需要被打印。因此是"!cp:2",如果任何命令比如xyz运行时有5个参数,而您需要获得第四个参数,您可以使用"!xyz:4"。所有的参数都可以通过"!*"来获得。

处理两个或更多的参数

处理两个或更多的参数

5. 以关键字为基础执行上个的命令

我们可以以关键字为基础执行上次执行的命令。可以从下面的例子中理解:

$ ls /home > /dev/null                      [命令1]
$ ls -l /home/avi/Desktop > /dev/null                       [命令2]   
$ ls -la /home/avi/Downloads > /dev/null                    [命令3]
$ ls -lA /usr/bin > /dev/null                       [命令4]

上面我们使用了同样的命令(ls),但有不同的开关和不同的操作文件夹。而且,我们还将输出传递到/dev/null,我们并未显示输出,因而终端依旧很干净。

现在以关键字为基础执行上个的命令。

$ ! ls                  [命令1]
$ ! ls -l               [命令2]   
$ ! ls -la              [命令3]
$ ! ls -lA              [命令4]

检查输出,您将惊奇发现您仅仅使用关键字ls便执行了您已经执行过的命令。

以关键字为基础执行命令

以关键字为基础执行命令

(LCTT 译注:澄清一下,这种用法会按照命令名来找到最后匹配的命令,不会匹配参数。所以上述执行的四个命令都是执行了 ls -lA /usr/bin > /dev/null,并增加了新的参数而已。)

6. !!操作符的威力

您可以使用(!!)运行/修改您上个运行的命令。它将附带一些修改/调整并调用上个命令。让我给您展示一些实际情境。

昨天我运行了一行脚本来获得我的私有IP,因此我执行了:

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/

接着,我突然发现我需要将上面脚本的输出重定向到一个ip.txt的文件,因此,我该怎么办呢?我该重新输入整个命令并重定向到一个文件么?一个简单的解决方案是使用向上光标键并添加'> ip.txt'来将输出重定向到文件。

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt

在这里要感谢救世主"向上光标键"。现在,考虑下面的情况,这次我运行了下面这一行脚本。

$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

一旦我运行了这个脚本,Bash提示符便返回了错误消息"bash: ifconfig: command not found"。原因并不难猜,我运行了本应以root权限的运行的命令。

所以,怎么解决呢?以root用户登录并且再次键入整个命令就太麻烦了!而且向上导航键也不管用了(LCTT 译注:当你以新的用户身份登录了,是不能用向上光标键找到之前的另外一个用户的命令历史的)。因此,我们需要调用"!!"(去掉引号),它将为那个用户调用上个命令。

$ su -c !! root

这里su是用来切换到root用户的,-c用来以某用户运行特定的命令,最重要的部分是!!,它将被替换为上次运行的命令。当然!您需要提供root密码。

!!操作符的威力

!!操作符的威力

我通常在下面的情景中使用!!

当我用普通用户来运行apt-get,我通常收到提示说我没有权限来执行。

$ apt-get upgrade && apt-get dist-upgrade

好吧,有错误。但别担心,使用下面的命令来成功的执行...

$ su -c !!

同样的适用于:

$ service apache2 start

$ /etc/init.d/apache2 start

$ systemctl start apache2

普通用户不被授权执行那些任务,这样相当于我运行:

$ su -c 'service apache2 start'

$ su -c '/etc/init.d/apache2 start'

$ su -c 'systemctl start apache2'

(LCTT 译注:使用!!之前,一定要确认你执行的是什么命令!另外,在 root 身份下,千万不要养成使用它的习惯,因为你总是会在不合适的目录执行不合适的命令!)

7.运行一个影响所有除了![FILE\_NAME]的文件命令

!(逻辑非)能用来对除了'!'后的文件的所有的文件/扩展名执行命令。

(LCTT 译注:该功能需要用 shopt 设置 extglob 模式: shopt -s extglob 才行。)

A.从文件夹移除所有文件,2.txt除外。

$ rm !(2.txt)

B.从文件夹移除所有的文件类型,pdf类型除外。

$ rm !(*.pdf)

8.检查某个文件夹(比如/home/avi/Tecmint)是否存在?并打印

这里,我们使用'! -d'来验证文件夹是否存在,当文件夹不存在时,将使用其后跟随AND操作符(&&)进行打印,当文件夹存在时,将使用OR操作符(||)进行打印。

逻辑上,当[ ! -d /home/avi/Tecmint ]的输出为0时,它将执行AND逻辑符后面的内容,否则,它将执行OR逻辑符(||)后面的内容。

$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'

9.检查某文件夹是否存在?如果不存在则退出该命令

类似于上面的情况,但这里当期望的文件夹不存在时,该命令会退出。

$ [ ! -d /home/avi/Tecmint ] && exit

10.如果您的home文件夹内不存在一个文件夹(比方说test),则创建它

这是脚本语言中的一个常用的实现,当期望的文件夹不存在时,创建一个。

[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint

这便是全部了。如果您知道或偶尔遇到其他值得了解的'!'使用方法,请您在反馈的地方给我们提建议。保持联系!


via: http://www.tecmint.com/mysterious-uses-of-symbol-or-operator-in-linux-commands/

作者:Avishek Kumar 译者:wwy-hust 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

SUSE( Software and System Entwicklung,即软件和系统开发。其中‘entwicklung‘是德语,意为开发)Linux 是由 Novell 公司在 Linux 内核基础上建立的操作系统。SUSE Linux 有两个发行分支。其中之一名为 openSUSE,这是一款自由而且免费的操作系统 (free as in speech as well as free as in wine)。该系统由开源社区开发维护,支持一些最新版本的应用软件,其最新的稳定版本为 13.2。

另外一个分支是 SUSE Linux 企业版。该分支是一个为企业及商业化产品设计的 Linux 发行版,包含了大量的企业应用以及适用于商业产品生产环境的特性。其最新的稳定版本为 12。

以下的链接包含了安装企业版 SUSE Linux 服务器的详细信息。

Zypper 和 Yast 是 SUSE Linux 平台上的软件包管理工具,他们的底层使用了 RPM(LCTT 译者注:RPM 最初指 Redhat Pacakge Manager ,现普遍解释为递归短语 RPM Package Manager 的缩写)。

Yast(Yet another Setup Tool )是 OpenSUSE 以及企业版 SUSE 上用于系统管理、设置和配置的工具。

Zypper 是软件包管理器ZYpp的命令行接口,可用于安装、删除SUSE Linux上的软件以及进行系统更新。ZYpp为Zypper和Yast提供底层支持。

本文将介绍实际应用中常见的一些Zypper命令。这些命令用来进行安装、更新、删除等任何软件包管理器所能够胜任的工作。

重要 : 切记所有的这些命令都将在系统全局范围内产生影响,所以必须以 root 身份执行,否则命令将失败。

获取基本的 Zypper 帮助信息

  1. 不带任何选项的执行 zypper, 将输出该命令的全局选项以及子命令列表(LCTT 译者注:全局选项,global option,控制台命令的输入分为可选参数和位置参数两大类。按照习惯,一般可选参数称为选项'option',而位置参数称为参数 'argument')。
#  zypper
    Usage:
    zypper [--global-options]
  1. 获取一个具体的子命令的帮助信息,比如 'in' (install),可以执行下面的命令
# zypper help in

或者

# zypper help install
install (in) [options] {capability | rpm_file_uri}

Install packages with specified capabilities or RPM files with specified
location. A capability is NAME[.ARCH][OP], where OP is one
of <, <=, =, >=, >.

  Command options:
--from <alias|#|URI>    Select packages from the specified repository.
-r, --repo <alias|#|URI>    Load only the specified repository.
-t, --type            Type of package (package, patch, pattern, product, srcpackage).
                            Default: package.
-n, --name                  Select packages by plain name, not by capability.
-C, --capability            Select packages by capability.
-f, --force                 Install even if the item is already installed (reinstall),
                            downgraded or changes vendor or architecture.
    --oldpackage            Allow to replace a newer item with an older one.
                            Handy if you are doing a rollback. Unlike --force
                            it will not enforce a reinstall.
    --replacefiles          Install the packages even if they replace files from other,
                            already installed, packages. Default is to treat file conflicts
                            as an error. --download-as-needed disables the fileconflict check.
...... 
  1. 安装之前搜索一个安转包(以 gnome-desktop 为例 )
# zypper se gnome-desktop

Retrieving repository 'openSUSE-13.2-Debug' metadata ............................................................[done]
Building repository 'openSUSE-13.2-Debug' cache .................................................................[done]
Retrieving repository 'openSUSE-13.2-Non-Oss' metadata ......................................................... [done]
Building repository 'openSUSE-13.2-Non-Oss' cache ...............................................................[done]
Retrieving repository 'openSUSE-13.2-Oss' metadata ..............................................................[done]
Building repository 'openSUSE-13.2-Oss' cache ...................................................................[done]
Retrieving repository 'openSUSE-13.2-Update' metadata ...........................................................[done]
Building repository 'openSUSE-13.2-Update' cache ................................................................[done]
Retrieving repository 'openSUSE-13.2-Update-Non-Oss' metadata ...................................................[done]
Building repository 'openSUSE-13.2-Update-Non-Oss' cache ........................................................[done]
Loading repository data...
Reading installed packages...

S | Name                                  | Summary                                                   | Type
--+---------------------------------------+-----------------------------------------------------------+-----------
  | gnome-desktop2-lang                   | Languages for package gnome-desktop2                      | package
  | gnome-desktop2                        | The GNOME Desktop API Library                             | package
  | libgnome-desktop-2-17                 | The GNOME Desktop API Library                             | package
  | libgnome-desktop-3-10                 | The GNOME Desktop API Library                             | package
  | libgnome-desktop-3-devel              | The GNOME Desktop API Library -- Development Files        | package
  | libgnome-desktop-3_0-common           | The GNOME Desktop API Library -- Common data files        | package
  | gnome-desktop-debugsource             | Debug sources for package gnome-desktop                   | package
  | gnome-desktop-sharp2-debugsource      | Debug sources for package gnome-desktop-sharp2            | package
  | gnome-desktop2-debugsource            | Debug sources for package gnome-desktop2                  | package
  | libgnome-desktop-2-17-debuginfo       | Debug information for package libgnome-desktop-2-17       | package
  | libgnome-desktop-3-10-debuginfo       | Debug information for package libgnome-desktop-3-10       | package
  | libgnome-desktop-3_0-common-debuginfo | Debug information for package libgnome-desktop-3_0-common | package
  | libgnome-desktop-2-17-debuginfo-32bit | Debug information for package libgnome-desktop-2-17       | package
  | libgnome-desktop-3-10-debuginfo-32bit | Debug information for package libgnome-desktop-3-10       | package
  | gnome-desktop-sharp2                  | Mono bindings for libgnome-desktop                        | package
  | libgnome-desktop-2-devel              | The GNOME Desktop API Library -- Development Files        | packag
  | gnome-desktop-lang                    | Languages for package gnome-desktop                       | package
  | libgnome-desktop-2-17-32bit           | The GNOME Desktop API Library                             | package
  | libgnome-desktop-3-10-32bit           | The GNOME Desktop API Library                             | package
  | gnome-desktop                         | The GNOME Desktop API Library                             | srcpackage
  1. 获取一个模式包的信息(以 lamp\_server 为例)。
# zypper info -t pattern lamp_server

Loading repository data...
Reading installed packages...

Information for pattern lamp_server:
------------------------------------
Repository: openSUSE-13.2-Update
Name: lamp_server
Version: 20141007-5.1
Arch: x86_64
Vendor: openSUSE
Installed: No
Visible to User: Yes
Summary: Web and LAMP Server
Description: 
  Software to set up a Web server that is able to serve static, dynamic, and interactive content (like a Web shop). This includes Apache HTTP Server, the database management system MySQL,
  and scripting languages such as PHP, Python, Ruby on Rails, or Perl.
Contents:

S | Name                          | Type    | Dependency
--+-------------------------------+---------+-----------
  | apache2-mod_php5              | package |
  | php5-iconv                    | package |
i | patterns-openSUSE-base        | package |
i | apache2-prefork               | package |
  | php5-dom                      | package |
  | php5-mysql                    | package |
i | apache2                       | package |
  | apache2-example-pages         | package |
  | mariadb                       | package |
  | apache2-mod_perl              | package |
  | php5-ctype                    | package |
  | apache2-doc                   | package |
  | yast2-http-server             | package |
  | patterns-openSUSE-lamp_server | package |
  1. 开启一个Zypper Shell 的会话。
# zypper shell 

或者

# zypper sh 
zypper> help
  Usage:
    zypper [--global-options]

注意:在 Zypper shell里面可以通过键入 ‘help‘ 获得全局选项以及子命令的列表。

Zypper 软件库管理

列举已定义的软件库

  1. 使用 'zypper repos' 或者 'zypper lr' 来列举所有已定以的软件库。
# zypper repos

或者

# zypper lr
  | Alias                     | Name                               | Enabled | Refresh
--+---------------------------+------------------------------------+---------+--------
1 | openSUSE-13.2-0           | openSUSE-13.2-0                    | Yes     | No
2 | repo-debug                | openSUSE-13.2-Debug                | Yes     | Yes
3 | repo-debug-update         | openSUSE-13.2-Update-Debug         | No      | Yes
4 | repo-debug-update-non-oss | openSUSE-13.2-Update-Debug-Non-Oss | No      | Yes
5 | repo-non-oss              | openSUSE-13.2-Non-Oss              | Yes     | Yes
6 | repo-oss                  | openSUSE-13.2-Oss                  | Yes     | Yes
7 | repo-source               | openSUSE-13.2-Source               | No      | Yes
8 | repo-update               | openSUSE-13.2-Update               | Yes     | Yes
9 | repo-update-non-oss       | openSUSE-13.2-Update-Non-Oss       | Yes     | Yes
  1. 在表格里面显示 zypper URI
# zypper lr -u
  | Alias                     | Name                               | Enabled | Refresh | URI
--+---------------------------+------------------------------------+---------+---------+----------------------------------------------------------------
1 | openSUSE-13.2-0           | openSUSE-13.2-0                    | Yes     | No      | cd:///?devices=/dev/disk/by-id/ata-VBOX_CD-ROM_VB2-01700376
2 | repo-debug                | openSUSE-13.2-Debug                | Yes     | Yes     | http://download.opensuse.org/debug/distribution/13.2/repo/oss/
3 | repo-debug-update         | openSUSE-13.2-Update-Debug         | No      | Yes     | http://download.opensuse.org/debug/update/13.2/
4 | repo-debug-update-non-oss | openSUSE-13.2-Update-Debug-Non-Oss | No      | Yes     | http://download.opensuse.org/debug/update/13.2-non-oss/
5 | repo-non-oss              | openSUSE-13.2-Non-Oss              | Yes     | Yes     | http://download.opensuse.org/distribution/13.2/repo/non-oss/
6 | repo-oss                  | openSUSE-13.2-Oss                  | Yes     | Yes     | http://download.opensuse.org/distribution/13.2/repo/oss/
7 | repo-source               | openSUSE-13.2-Source               | No      | Yes     | http://download.opensuse.org/source/distribution/13.2/repo/oss/
8 | repo-update               | openSUSE-13.2-Update               | Yes     | Yes     | http://download.opensuse.org/update/13.2/
9 | repo-update-non-oss       | openSUSE-13.2-Update-Non-Oss       | Yes     | Yes     | http://download.opensuse.org/update/13.2-non-oss/
  1. 根据优先级列举软件库。
# zypper lr -P
  | Alias                     | Name                               | Enabled | Refresh | Priority
--+---------------------------+------------------------------------+---------+---------+---------
1 | openSUSE-13.2-0           | openSUSE-13.2-0                    | Yes     | No      |   99
2 | repo-debug                | openSUSE-13.2-Debug                | Yes     | Yes     |   99
3 | repo-debug-update         | openSUSE-13.2-Update-Debug         | No      | Yes     |   99
4 | repo-debug-update-non-oss | openSUSE-13.2-Update-Debug-Non-Oss | No      | Yes     |   99
5 | repo-non-oss              | openSUSE-13.2-Non-Oss              | Yes     | Yes     |   85
6 | repo-oss                  | openSUSE-13.2-Oss                  | Yes     | Yes     |   99
7 | repo-source               | openSUSE-13.2-Source               | No      | Yes     |   99
8 | repo-update               | openSUSE-13.2-Update               | Yes     | Yes     |   99
9 | repo-update-non-oss       | openSUSE-13.2-Update-Non-Oss       | Yes     | Yes     |   99

刷新软件库

  1. 使用 'zypper refresh' or 'zypper ref' 来刷新 zypper 软件库。
# zypper refresh 

或者

# zypper ref
Repository 'openSUSE-13.2-0' is up to date.
Repository 'openSUSE-13.2-Debug' is up to date.
Repository 'openSUSE-13.2-Non-Oss' is up to date.
Repository 'openSUSE-13.2-Oss' is up to date.
Repository 'openSUSE-13.2-Update' is up to date.
Repository 'openSUSE-13.2-Update-Non-Oss' is up to date.
All repositories have been refreshed. 
  1. 刷新一个指定的软件库(以 'repo-non-oss' 为例 )。
# zypper refresh repo-non-oss
Repository 'openSUSE-13.2-Non-Oss' is up to date.
Specified repositories have been refreshed. 
  1. 强制更新一个软件库(以 'repo-non-oss' 为例 )。
# zypper ref -f repo-non-oss 
Forcing raw metadata refresh
Retrieving repository 'openSUSE-13.2-Non-Oss' metadata ............................................................[done]
Forcing building of repository cache
Building repository 'openSUSE-13.2-Non-Oss' cache ............................................................[done]
Specified repositories have been refreshed.

修改软件库

本文中我们使用‘zypper modifyrepo‘ 或者 ‘zypper mr‘ 来关闭或者开启 zypper 软件库。

  1. 在关闭一个软件库之前,我们需要知道在 zypper 中,每一个软件库有一个唯一的标示数字与之关联,该数字用于打开或者关闭与之相联系的软件库。假设我们需要关闭 'repo-oss' 软件库,那么我们可以通过以下的法来获得该软件库的标志数字。
# zypper lr
  | Alias                     | Name                               | Enabled | Refresh
--+---------------------------+------------------------------------+---------+--------
1 | openSUSE-13.2-0           | openSUSE-13.2-0                    | Yes     | No
2 | repo-debug                | openSUSE-13.2-Debug                | Yes     | Yes
3 | repo-debug-update         | openSUSE-13.2-Update-Debug         | No      | Yes
4 | repo-debug-update-non-oss | openSUSE-13.2-Update-Debug-Non-Oss | No      | Yes
5 | repo-non-oss              | openSUSE-13.2-Non-Oss              | Yes     | Yes
6 | repo-oss                  | openSUSE-13.2-Oss                  | No      | Yes
7 | repo-source               | openSUSE-13.2-Source               | No      | Yes
8 | repo-update               | openSUSE-13.2-Update               | Yes     | Yes
9 | repo-update-non-oss       | openSUSE-13.2-Update-Non-Oss       | Yes     | Yes

从以上输出的列表中我们可以看到 'repo-oss' 库的标示数字是 6,因此通过以下的命令来关闭该库。

# zypper mr -d 6
Repository 'repo-oss' has been successfully disabled.
  1. 如果需要再次开启软件库 ‘repo-oss‘, 接上例,与之相关联的标示数字为 6。
# zypper mr -e 6
Repository 'repo-oss' has been successfully enabled.
  1. 针对某一个软件库(以 'repo-non-oss' 为例 )开启自动刷新( auto-refresh )和 rpm 缓存,并设置该软件库的优先级,比如85。
# zypper mr -rk -p 85 repo-non-oss
Repository 'repo-non-oss' priority has been left unchanged (85)
Nothing to change for repository 'repo-non-oss'.
  1. 对所有的软件库关闭 rpm 文件缓存。
# zypper mr -Ka
RPM files caching has been disabled for repository 'openSUSE-13.2-0'.
RPM files caching has been disabled for repository 'repo-debug'.
RPM files caching has been disabled for repository 'repo-debug-update'.
RPM files caching has been disabled for repository 'repo-debug-update-non-oss'.
RPM files caching has been disabled for repository 'repo-non-oss'.
RPM files caching has been disabled for repository 'repo-oss'.
RPM files caching has been disabled for repository 'repo-source'.
RPM files caching has been disabled for repository 'repo-update'.
RPM files caching has been disabled for repository 'repo-update-non-oss'.
  1. 对所有的软件库开启 rpm 文件缓存。
# zypper mr -ka
RPM files caching has been enabled for repository 'openSUSE-13.2-0'.
RPM files caching has been enabled for repository 'repo-debug'.
RPM files caching has been enabled for repository 'repo-debug-update'.
RPM files caching has been enabled for repository 'repo-debug-update-non-oss'.
RPM files caching has been enabled for repository 'repo-non-oss'.
RPM files caching has been enabled for repository 'repo-oss'.
RPM files caching has been enabled for repository 'repo-source'.
RPM files caching has been enabled for repository 'repo-update'.
RPM files caching has been enabled for repository 'repo-update-non-oss'.
  1. 关闭远程库的 rpm 文件缓存
# zypper mr -Kt
RPM files caching has been disabled for repository 'repo-debug'.
RPM files caching has been disabled for repository 'repo-debug-update'.
RPM files caching has been disabled for repository 'repo-debug-update-non-oss'.
RPM files caching has been disabled for repository 'repo-non-oss'.
RPM files caching has been disabled for repository 'repo-oss'.
RPM files caching has been disabled for repository 'repo-source'.
RPM files caching has been disabled for repository 'repo-update'.
RPM files caching has been disabled for repository 'repo-update-non-oss'.
  1. 开启远程软件库的 rpm 文件缓存。
# zypper mr -kt
RPM files caching has been enabled for repository 'repo-debug'.
RPM files caching has been enabled for repository 'repo-debug-update'.
RPM files caching has been enabled for repository 'repo-debug-update-non-oss'.
RPM files caching has been enabled for repository 'repo-non-oss'.
RPM files caching has been enabled for repository 'repo-oss'.
RPM files caching has been enabled for repository 'repo-source'.
RPM files caching has been enabled for repository 'repo-update'.
RPM files caching has been enabled for repository 'repo-update-non-oss'.

增加新的软件库

可以通过这两个 zypper 指令 – 'zypper addrepo' 和 'zypper ar' 来增加新的软件库。在此过程中可以使用 URL 或者软件库的别名。

  1. 增加一个新的软件库( 以 “http://download.opensuse.org/update/12.3/” 为例 )。
# zypper ar http://download.opensuse.org/update/11.1/ update
Adding repository 'update' .............................................................................................................................................................[done]
Repository 'update' successfully added
Enabled     : Yes
Autorefresh : No
GPG check   : Yes
URI         : http://download.opensuse.org/update/11.1/
  1. 更改一个软件库的名字,这将仅仅改变软件库的别名。 命令 'zypper namerepo' 或者 'zypperr nr' 可以胜任此工作。例如更改标示数字为10的软件库的名字为 'upd8',或者说将标示数字为10的软件库的别名改为 'upd8',可以使用下面的命令。
# zypper nr 10 upd8
Repository 'update' renamed to 'upd8'.

删除软件库

  1. 删除一个软件库。要从系统删除一个软件库可以使 'zypper removerepo' 或者 'zypper rr'。例如以下的命令可以删除软件库 'upd8'
# zypper rr upd8
# Removing repository 'upd8' .........................................................................................[done]
Repository 'upd8' has been removed.

使用 zypper 进行软件包管理

用 zypper 安装一个软件包

  1. 在 zypper 中,我们可以通过软件包的功能名称来安装一个软件包。以 Firefox 为例,以下的命令可以用来安装该软件包。
# zypper in MozillaFirefox
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 128 NEW packages are going to be installed:
  adwaita-icon-theme at-spi2-atk-common at-spi2-atk-gtk2 at-spi2-core cantarell-fonts cups-libs desktop-file-utils fontconfig gdk-pixbuf-query-loaders gstreamer gstreamer-fluendo-mp3
  gstreamer-plugins-base gtk2-branding-openSUSE gtk2-data gtk2-immodule-amharic gtk2-immodule-inuktitut gtk2-immodule-thai gtk2-immodule-vietnamese gtk2-metatheme-adwaita
  gtk2-theming-engine-adwaita gtk2-tools gtk3-data gtk3-metatheme-adwaita gtk3-tools hicolor-icon-theme hicolor-icon-theme-branding-openSUSE libasound2 libatk-1_0-0 libatk-bridge-2_0-0
  libatspi0 libcairo2 libcairo-gobject2 libcanberra0 libcanberra-gtk0 libcanberra-gtk2-module libcanberra-gtk3-0 libcanberra-gtk3-module libcanberra-gtk-module-common libcdda_interface0
  libcdda_paranoia0 libcolord2 libdrm2 libdrm_intel1 libdrm_nouveau2 libdrm_radeon1 libFLAC8 libfreebl3 libgbm1 libgdk_pixbuf-2_0-0 libgraphite2-3 libgstapp-1_0-0 libgstaudio-1_0-0
  libgstpbutils-1_0-0 libgstreamer-1_0-0 libgstriff-1_0-0 libgsttag-1_0-0 libgstvideo-1_0-0 libgthread-2_0-0 libgtk-2_0-0 libgtk-3-0 libharfbuzz0 libjasper1 libjbig2 libjpeg8 libjson-c2
  liblcms2-2 libLLVM libltdl7 libnsssharedhelper0 libogg0 liborc-0_4-0 libpackagekit-glib2-18 libpango-1_0-0 libpciaccess0 libpixman-1-0 libpulse0 libsndfile1 libsoftokn3 libspeex1
  libsqlite3-0 libstartup-notification-1-0 libtheoradec1 libtheoraenc1 libtiff5 libvisual libvorbis0 libvorbisenc2 libvorbisfile3 libwayland-client0 libwayland-cursor0 libwayland-server0
  libX11-xcb1 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-render0 libxcb-shm0 libxcb-sync1 libxcb-util1 libxcb-xfixes0 libXcomposite1 libXcursor1 libXdamage1 libXevie1
  libXfixes3 libXft2 libXi6 libXinerama1 libxkbcommon-0_4_3 libXrandr2 libXrender1 libxshmfence1 libXtst6 libXv1 libXxf86vm1 Mesa Mesa-libEGL1 Mesa-libGL1 Mesa-libglapi0
  metatheme-adwaita-common MozillaFirefox MozillaFirefox-branding-openSUSE mozilla-nss mozilla-nss-certs PackageKit-gstreamer-plugin pango-tools sound-theme-freedesktop

The following 10 recommended packages were automatically selected:
  gstreamer-fluendo-mp3 gtk2-branding-openSUSE gtk2-data gtk2-immodule-amharic gtk2-immodule-inuktitut gtk2-immodule-thai gtk2-immodule-vietnamese libcanberra0 libpulse0
  PackageKit-gstreamer-plugin

128 new packages to install.
Overall download size: 77.2 MiB. Already cached: 0 B  After the operation, additional 200.0 MiB will be used.
Continue? [y/n/? shows all options] (y): y
Retrieving package cantarell-fonts-0.0.16-1.1.noarch                                                                                                   (1/128),  74.1 KiB (115.6 KiB unpacked)
Retrieving: cantarell-fonts-0.0.16-1.1.noarch.rpm .........................................................................................................................[done (63.4 KiB/s)]
Retrieving package hicolor-icon-theme-0.13-2.1.2.noarch                                                                                                (2/128),  40.1 KiB ( 50.5 KiB unpacked)
Retrieving: hicolor-icon-theme-0.13-2.1.2.noarch.rpm ...................................................................................................................................[done]
Retrieving package sound-theme-freedesktop-0.8-7.1.2.noarch                                                                                            (3/128), 372.6 KiB (460.3 KiB unpacked) 
  1. 安装指定版本号的软件包,(以 gcc 5.1 为例)。
# zypper in 'gcc<5.1'
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 13 NEW packages are going to be installed:
  cpp cpp48 gcc gcc48 libasan0 libatomic1-gcc49 libcloog-isl4 libgomp1-gcc49 libisl10 libitm1-gcc49 libmpc3 libmpfr4 libtsan0-gcc49

13 new packages to install.
Overall download size: 14.5 MiB. Already cached: 0 B  After the operation, additional 49.4 MiB will be used.
Continue? [y/n/? shows all options] (y): y 
  1. 为特定的CPU架构安装软件包(以兼容 i586 的 gcc 为例)。
# zypper in gcc.i586
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 13 NEW packages are going to be installed:
  cpp cpp48 gcc gcc48 libasan0 libatomic1-gcc49 libcloog-isl4 libgomp1-gcc49 libisl10 libitm1-gcc49 libmpc3 libmpfr4 libtsan0-gcc49

13 new packages to install.
Overall download size: 14.5 MiB. Already cached: 0 B  After the operation, additional 49.4 MiB will be used.
Continue? [y/n/? shows all options] (y): y
Retrieving package libasan0-4.8.3+r212056-2.2.4.x86_64                                                                                                  (1/13),  74.2 KiB (166.9 KiB unpacked)
Retrieving: libasan0-4.8.3+r212056-2.2.4.x86_64.rpm .......................................................................................................................[done (79.2 KiB/s)]
Retrieving package libatomic1-gcc49-4.9.0+r211729-2.1.7.x86_64                                                                                          (2/13),  14.3 KiB ( 26.1 KiB unpacked)
Retrieving: libatomic1-gcc49-4.9.0+r211729-2.1.7.x86_64.rpm ...............................................................................................................[done (55.3 KiB/s)] 
  1. 为特定的CPU架构安装指定版本号的软件包(以兼容 i586 且版本低于5.1的 gcc 为例)
# zypper in 'gcc.i586<5.1'
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 13 NEW packages are going to be installed:
  cpp cpp48 gcc gcc48 libasan0 libatomic1-gcc49 libcloog-isl4 libgomp1-gcc49 libisl10 libitm1-gcc49 libmpc3 libmpfr4 libtsan0-gcc49

13 new packages to install.
Overall download size: 14.4 MiB. Already cached: 129.5 KiB  After the operation, additional 49.4 MiB will be used.
Continue? [y/n/? shows all options] (y): y
In cache libasan0-4.8.3+r212056-2.2.4.x86_64.rpm                                                                                                        (1/13),  74.2 KiB (166.9 KiB unpacked)
In cache libatomic1-gcc49-4.9.0+r211729-2.1.7.x86_64.rpm                                           (2/13),  14.3 KiB ( 26.1 KiB unpacked)
In cache libgomp1-gcc49-4.9.0+r211729-2.1.7.x86_64.rpm                                             (3/13),  41.1 KiB ( 90.7 KiB unpacked) 
  1. 从指定的软件库里面安装一个软件包,例如从 amarok 中安装 libxine。
# zypper in amarok upd:libxine1
Loading repository data...
Reading installed packages...
Resolving package dependencies...
The following 202 NEW packages are going to be installed:
  amarok bundle-lang-kde-en clamz cups-libs enscript fontconfig gdk-pixbuf-query-loaders ghostscript-fonts-std gptfdisk gstreamer gstreamer-plugins-base hicolor-icon-theme
  hicolor-icon-theme-branding-openSUSE htdig hunspell hunspell-tools icoutils ispell ispell-american kde4-filesystem kdebase4-runtime kdebase4-runtime-branding-openSUSE kdelibs4
  kdelibs4-branding-openSUSE kdelibs4-core kdialog libakonadi4 l
.....
  1. 通过指定软件包的名字安装软件包。
# zypper in -n git
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 35 NEW packages are going to be installed:
  cvs cvsps fontconfig git git-core git-cvs git-email git-gui gitk git-svn git-web libserf-1-1 libsqlite3-0 libXft2 libXrender1 libXss1 perl-Authen-SASL perl-Clone perl-DBD-SQLite perl-DBI
  perl-Error perl-IO-Socket-SSL perl-MLDBM perl-Net-Daemon perl-Net-SMTP-SSL perl-Net-SSLeay perl-Params-Util perl-PlRPC perl-SQL-Statement perl-Term-ReadKey subversion subversion-perl tcl
  tk xhost

The following 13 recommended packages were automatically selected:
  git-cvs git-email git-gui gitk git-svn git-web perl-Authen-SASL perl-Clone perl-MLDBM perl-Net-Daemon perl-Net-SMTP-SSL perl-PlRPC perl-SQL-Statement

The following package is suggested, but will not be installed:
  git-daemon

35 new packages to install.
Overall download size: 15.6 MiB. Already cached: 0 B  After the operation, additional 56.7 MiB will be used.
Continue? [y/n/? shows all options] (y): y 
  1. 通过通配符来安装软件包,例如,安装所有 php5 的软件包。
# zypper in php5*
Loading repository data...
Reading installed packages...
Resolving package dependencies...

Problem: php5-5.6.1-18.1.x86_64 requires smtp_daemon, but this requirement cannot be provided
  uninstallable providers: exim-4.83-3.1.8.x86_64[openSUSE-13.2-0]
                   postfix-2.11.0-5.2.2.x86_64[openSUSE-13.2-0]
                   sendmail-8.14.9-2.2.2.x86_64[openSUSE-13.2-0]
                   exim-4.83-3.1.8.i586[repo-oss]
                   msmtp-mta-1.4.32-2.1.3.i586[repo-oss]
                   postfix-2.11.0-5.2.2.i586[repo-oss]
                   sendmail-8.14.9-2.2.2.i586[repo-oss]
                   exim-4.83-3.1.8.x86_64[repo-oss]
                   msmtp-mta-1.4.32-2.1.3.x86_64[repo-oss]
                   postfix-2.11.0-5.2.2.x86_64[repo-oss]
                   sendmail-8.14.9-2.2.2.x86_64[repo-oss]
                   postfix-2.11.3-5.5.1.i586[repo-update]
                   postfix-2.11.3-5.5.1.x86_64[repo-update]
 Solution 1: Following actions will be done:
  do not install php5-5.6.1-18.1.x86_64
  do not install php5-pear-Auth_SASL-1.0.6-7.1.3.noarch
  do not install php5-pear-Horde_Http-2.0.1-6.1.3.noarch
  do not install php5-pear-Horde_Image-2.0.1-6.1.3.noarch
  do not install php5-pear-Horde_Kolab_Format-2.0.1-6.1.3.noarch
  do not install php5-pear-Horde_Ldap-2.0.1-6.1.3.noarch
  do not install php5-pear-Horde_Memcache-2.0.1-7.1.3.noarch
  do not install php5-pear-Horde_Mime-2.0.2-6.1.3.noarch
  do not install php5-pear-Horde_Oauth-2.0.0-6.1.3.noarch
  do not install php5-pear-Horde_Pdf-2.0.1-6.1.3.noarch
....
  1. 使用模式名称(模式名称是一类软件包的名字)来批量安装软件包。
# zypper in -t pattern lamp_server
ading repository data...
Reading installed packages...
Resolving package dependencies...

The following 29 NEW packages are going to be installed:
  apache2 apache2-doc apache2-example-pages apache2-mod_perl apache2-prefork patterns-openSUSE-lamp_server perl-Data-Dump perl-Encode-Locale perl-File-Listing perl-HTML-Parser
  perl-HTML-Tagset perl-HTTP-Cookies perl-HTTP-Daemon perl-HTTP-Date perl-HTTP-Message perl-HTTP-Negotiate perl-IO-HTML perl-IO-Socket-SSL perl-libwww-perl perl-Linux-Pid
  perl-LWP-MediaTypes perl-LWP-Protocol-https perl-Net-HTTP perl-Net-SSLeay perl-Tie-IxHash perl-TimeDate perl-URI perl-WWW-RobotRules yast2-http-server

The following NEW pattern is going to be installed:
  lamp_server

The following 10 recommended packages were automatically selected:
  apache2 apache2-doc apache2-example-pages apache2-mod_perl apache2-prefork perl-Data-Dump perl-IO-Socket-SSL perl-LWP-Protocol-https perl-TimeDate yast2-http-server

29 new packages to install.
Overall download size: 7.2 MiB. Already cached: 1.2 MiB  After the operation, additional 34.7 MiB will be used.
Continue? [y/n/? shows all options] (y): 
  1. 使用一行命令安装一个软件包同时卸载另一个软件包,例如在安装 nano 的同时卸载 vi
# zypper in nano -vi
Loading repository data...
Reading installed packages...
'-vi' not found in package names. Trying capabilities.
Resolving package dependencies...

The following 2 NEW packages are going to be installed:
  nano nano-lang

The following package is going to be REMOVED:
  vim

The following recommended package was automatically selected:
  nano-lang

2 new packages to install, 1 to remove.
Overall download size: 550.0 KiB. Already cached: 0 B  After the operation, 463.3 KiB will be freed.
Continue? [y/n/? shows all options] (y):
...
  1. 使用 zypper 安装 rpm 软件包。
# zypper in teamviewer*.rpm
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 24 NEW packages are going to be installed:
  alsa-oss-32bit fontconfig-32bit libasound2-32bit libexpat1-32bit libfreetype6-32bit libgcc_s1-gcc49-32bit libICE6-32bit libjpeg62-32bit libpng12-0-32bit libpng16-16-32bit libSM6-32bit
  libuuid1-32bit libX11-6-32bit libXau6-32bit libxcb1-32bit libXdamage1-32bit libXext6-32bit libXfixes3-32bit libXinerama1-32bit libXrandr2-32bit libXrender1-32bit libXtst6-32bit
  libz1-32bit teamviewer

The following recommended package was automatically selected:
  alsa-oss-32bit

24 new packages to install.
Overall download size: 41.2 MiB. Already cached: 0 B  After the operation, additional 119.7 MiB will be used.
Continue? [y/n/? shows all options] (y):
..

使用 zypper 卸载软件包

  1. 命令 ‘zypper remove‘ 和 ‘zypper rm‘ 用于卸载软件包。例如卸载 apache2:
# zypper remove apache2 

或者

# zypper rm apache2
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 2 packages are going to be REMOVED:
  apache2 apache2-prefork

2 packages to remove.
After the operation, 4.2 MiB will be freed.
Continue? [y/n/? shows all options] (y): y
(1/2) Removing apache2-2.4.10-19.1 ........................................................................[done]
(2/2) Removing apache2-prefork-2.4.10-19.1 ................................................................[done] 

使用Zypper 进行软件包更新

  1. 更新所有的软件包,可以使用 ‘zypper update‘ 或者 ‘zypper up‘。
# zypper up 

或者

# zypper update

Loading repository data...
Reading installed packages...
Nothing to do. 
  1. 更新指定的软件包,例如更新 apache2 以及 openssh。
 zypper up apache2 openssh
Loading repository data...
Reading installed packages...
No update candidate for 'apache2-2.4.10-19.1.x86_64'. The highest available version is already installed.
No update candidate for 'openssh-6.6p1-5.1.3.x86_64'. The highest available version is already installed.
Resolving package dependencies...

Nothing to do.
  1. 安装一个软件库,例如 mariadb,如果该库存在则更新之。
# zypper in mariadb
Loading repository data...
Reading installed packages...
'mariadb' is already installed.
No update candidate for 'mariadb-10.0.13-2.6.1.x86_64'. The highest available version is already installed.
Resolving package dependencies...

Nothing to do.

安装源文件并且构建依赖关系

命令 ‘zypper source-install‘ 或者 ‘zypper si‘ 可以用于从源文件编译软件包

  1. 安装某一个软件包的源文件及其依赖关系,例如 mariadb。
# zypper si mariadb
Reading installed packages...
Loading repository data...
Resolving package dependencies...

The following 36 NEW packages are going to be installed:
  autoconf automake bison cmake cpp cpp48 gcc gcc48 gcc48-c++ gcc-c++ libaio-devel libarchive13 libasan0 libatomic1-gcc49 libcloog-isl4 libedit-devel libevent-devel libgomp1-gcc49 libisl10
  libitm1-gcc49 libltdl7 libmpc3 libmpfr4 libopenssl-devel libstdc++48-devel libtool libtsan0-gcc49 m4 make ncurses-devel pam-devel readline-devel site-config tack tcpd-devel zlib-devel

The following source package is going to be installed:
  mariadb

36 new packages to install, 1 source package.
Overall download size: 71.5 MiB. Already cached: 129.5 KiB  After the operation, additional 183.9 MiB will be used.
Continue? [y/n/? shows all options] (y): y 
  1. 仅为某一个软件包安装源文件,例如 mariadb
# zypper in -D mariadb
Loading repository data...
Reading installed packages...
'mariadb' is already installed.
No update candidate for 'mariadb-10.0.13-2.6.1.x86_64'. The highest available version is already installed.
Resolving package dependencies...

Nothing to do. 
  1. 仅为某一个软件包安装依赖关系,例如 mariadb
# zypper si -d mariadb
Reading installed packages...
Loading repository data...
Resolving package dependencies...

The following 36 NEW packages are going to be installed:
  autoconf automake bison cmake cpp cpp48 gcc gcc48 gcc48-c++ gcc-c++ libaio-devel libarchive13 libasan0 libatomic1-gcc49 libcloog-isl4 libedit-devel libevent-devel libgomp1-gcc49 libisl10
  libitm1-gcc49 libltdl7 libmpc3 libmpfr4 libopenssl-devel libstdc++48-devel libtool libtsan0-gcc49 m4 make ncurses-devel pam-devel readline-devel site-config tack tcpd-devel zlib-devel

The following package is recommended, but will not be installed due to conflicts or dependency issues:
  readline-doc

36 new packages to install.
Overall download size: 33.7 MiB. Already cached: 129.5 KiB  After the operation, additional 144.3 MiB will be used.
Continue? [y/n/? shows all options] (y): y

在脚本和应用中调用 Zypper (非交互式)

  1. 安装一个软件包,并且在安装过程中跳过与用户的交互, 例如 mariadb。
# zypper --non-interactive in mariadb
Loading repository data...
Reading installed packages...
'mariadb' is already installed.
No update candidate for 'mariadb-10.0.13-2.6.1.x86_64'. The highest available version is already installed.
Resolving package dependencies...

Nothing to do.
  1. 卸载一个软件包,并且在卸载过程中跳过与用户的交互,例如 mariadb
# zypper --non-interactive rm mariadb
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following package is going to be REMOVED:
  mariadb

1 package to remove.
After the operation, 71.8 MiB will be freed.
Continue? [y/n/? shows all options] (y): y
(1/1) Removing mariadb-10.0.13-2.6.1 .............................................................................[done] 
  1. 以 XML 格式显示 zypper 的输出。
# zypper --xmlout
  Usage:
    zypper [--global-options]  [--command-options] [arguments]

  Global Options
....
  1. 在安装过程中禁止详细信息输出到屏幕。
# zypper --quiet in mariadb
The following NEW package is going to be installed:
  mariadb

1 new package to install.
Overall download size: 0 B. Already cached: 7.8 MiB  After the operation, additional 71.8 MiB will be used.
Continue? [y/n/? shows all options] (y):
...
  1. 在卸载过程中禁止详细信息输出到屏幕
# zypper --quiet rm mariadb 
  1. 自动地同意版权或者协议。
# zypper patch --auto-agree-with-licenses
Loading repository data...
Reading installed packages...
Resolving package dependencies...

Nothing to do.

清除 Zypper 缓存以及查看历史信息

  1. 以下指令可以用来清理Zypper缓存。
# zypper clean
All repositories have been cleaned up.

如果需要一次性地清理元数据以及软件包缓存,可以通过 -all 或 -a 选项来达到目的

<pre><code># zypper clean -a
All repositories have been cleaned up.</code></pre>
  1. 查看 Zypper 的历史信息。任何通过 Zypper 进行的软件包管理动作,包括安装、更新以及卸载都会在 /var/log/zypp/history中保留历史信息。可以通过 cat 来查看此文件,或者通过过滤器来筛选希望看到的信息。
 cat /var/log/zypp/history
2015-05-07 15:43:03|install|boost-license1_54_0|1.54.0-10.1.3|noarch||openSUSE-13.2-0|0523b909d2aae5239f9841316dafaf3a37b4f096|
2015-05-07 15:43:03|install|branding-openSUSE|13.2-3.6.1|noarch||openSUSE-13.2-0|6609def94b1987bf3f90a9467f4f7ab8f8d98a5c|
2015-05-07 15:43:03|install|bundle-lang-common-en|13.2-3.3.1|noarch||openSUSE-13.2-0|ca55694e6fdebee6ce37ac7cf3725e2aa6edc342|
2015-05-07 15:43:03|install|insserv-compat|0.1-12.2.2|noarch||openSUSE-13.2-0|6160de7fbf961a279591a83a1550093a581214d9|
2015-05-07 15:43:03|install|libX11-data|1.6.2-5.1.2|noarch||openSUSE-13.2-0|f1cb58364ba9016c1f93b1a383ba12463c56885a|
2015-05-07 15:43:03|install|libnl-config|3.2.25-2.1.2|noarch||openSUSE-13.2-0|aab2ded312a781e93b739b418e3d32fe4e187020|
2015-05-07 15:43:04|install|wireless-regdb|2014.06.13-1.2|noarch||openSUSE-13.2-0|be8cb16f3e92af12b5ceb977e37e13f03c007bd1|
2015-05-07 15:43:04|install|yast2-trans-en_US|3.1.0-2.1|noarch||openSUSE-13.2-0|1865754e5e0ec3c149ac850b340bcca55a3c404d|
2015-05-07 15:43:04|install|yast2-trans-stats|2.19.0-16.1.3|noarch||openSUSE-13.2-0|b107d2b3e702835885b57b04d12d25539f262d1a|
2015-05-07 15:43:04|install|cracklib-dict-full|2.8.12-64.1.2|x86_64||openSUSE-13.2-0|08bd45dbba7ad44e3a4837f730be76f55ad5dcfa|
......

使用 Zypper 进行SUSE系统升级

  1. 可以使用 Zypper 命令的 'dist-upgrade' 选项来将当前的 SUSE Linux 升级至最新版本。
# zypper dist-upgrade
You are about to do a distribution upgrade with all enabled repositories. Make sure these repositories are compatible before you continue. See 'man zypper' for more information about this command.
Building repository 'openSUSE-13.2-0' cache .....................................................................[done]
Retrieving repository 'openSUSE-13.2-Debug' metadata ............................................................[done]
Building repository 'openSUSE-13.2-Debug' cache .................................................................[done]
Retrieving repository 'openSUSE-13.2-Non-Oss' metadata ..........................................................[done]
Building repository 'openSUSE-13.2-Non-Oss' cache ...............................................................[done]

正文至此结束。希望本文可以帮助读者尤其是新手们管理SUSE Linux系统和服务器。如果您觉得某些比较重要的命令被作者漏掉了,请在评论部分写下您的返回,作者将根据评论对文章进行更新。保持联络,保持评论,多谢支持。


via: http://www.tecmint.com/zypper-commands-to-manage-suse-linux-package-management/

作者:Avishek Kumar 译者:张博约 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

我们如何在Linux中杀掉一个资源/进程?很明显我们会找出资源的pid然后用kill命令。

说的更明白一点,我们可以找到某个资源(比如terminal)的PID:

$ ps -A | grep -i terminal

6228 ?        00:00:00 gnome-terminal

上面的输出中,‘6288’就是进程(gnome-terminal)的pid, 使用下面的命令来杀掉进程。

$ kill 6228

kill命令会发送一个信号给该pid的进程。

另外一个方法是我们可以使用pkill命令,它可以基于进程的名字或者其他的属性来杀掉进程。同样我们要杀掉一个叫terminal的进程可以这么做:

$ pkill terminal

注意: pkill命令后面进程名的长度不大于15个字符

pkill看上去更加容易上手,因为你你不用找出进程的pid。但是如果你要对系统做更好的控制,那么没有什么可以打败'kill'。使用kill命令可以更好地审视你要杀掉的进程。

我们已经有一篇覆盖了kill、pkill和killall命令细节的指导了。

对于那些运行X Server的人而言,有另外一个工具称为xkill可以将进程从X Window中杀掉而不必传递它的名字或者pid。

xkill工具强制X server关闭与它的客户程序之间的联系,其结果就是X resource关闭了这个客户程序。xkill是X11工具集中一个非常容易上手的杀掉无用窗口的工具。

它支持的选项如在同时运行多个X Server时使用-display选项后面跟上显示号连接到指定的X server,使用-all(并不建议)杀掉所有在屏幕上的所有顶层窗口,以及帧(-frame)参数。

要列出所有的客户程序你可以运行:

$ xlsclients

示例输出

'  ' /usr/lib/libreoffice/program/soffice
deb  gnome-shell
deb  Docky
deb  google-chrome-stable
deb  soffice
deb  gnome-settings-daemon
deb  gnome-terminal-server

如果后面没有跟上资源id,xkill会将鼠标指针变成一个特殊符号,类似于“X”。只需在你要杀掉的窗口上点击,它就会杀掉它与server端的通信,这个程序就被杀掉了。

$ xkill

Xkill Command

使用xkill杀掉进程

需要注意的是xkill并不能保证它的通信会被成功杀掉/退出。大多数程序会在与服务端的通信被关闭后杀掉。然而仍有少部分会继续运行。

需要指出的点是:

  • 这个工具只能在X11 server运行的时候才能使用,因为这是X11工具的一部分。
  • 不要在你杀掉一个资源而它没有完全退出时而困惑。
  • 这不是kill的替代品

我需要在linux命令行中使用xkill么

不是,你不必非在命令行中运行xkill。你可以设置一个快捷键,并用它来调用xkill。

下面是如何在典型的gnome3桌面中设置键盘快捷键。

进入设置-> 选择键盘。点击'+'并添加一个名字和命令。点击点击新条目并按下你想要的组合键。我的是Ctrl+Alt+Shift+x。

Gnome Settings

Gnome 设置

Add Shortcut Key

添加快捷键

下次你要杀掉一个X资源只要用组合键就行了(Ctrl+Alt+Shift+x),你看到你的鼠标变成x了。点击想要杀掉的x资源就行了。


via: http://www.tecmint.com/kill-processes-unresponsive-programs-in-ubuntu/

作者:Avishek Kumar 译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出