星期六, 一月 05, 2008

RedHat AS4下添加中文界面及输入

执行如下命令

插入RedHat 第三张光盘,
执行如下命令
mount /dev/cdrom
cd /media/cdrom/RedHat/RPMS/
rpm -ivh ttfonts-zh_CN-2.14-6.noarch.rpm
rpm -ivh iiimf-le-chinput-0.3-16.i386.rpm --aid
rpm -ivh iiimf-x-12.1-10.EL.i386.rpm
rpm -ivh iiimf-gnome-im-switcher-12.1-10.EL.i386.rpm
安装完毕后重新启动系统或者执行
(
init 3
init 5
)
然后敲
service iiim status
确认htt (pid XXXX) is running...

Alt+Ctrl+Backspace重启X
在登录截面选择LANGUAGE 简体中文
然后登录(可选择本次会话,或设为默认)
现在系统的界面以及输入法都接受中文了,
希望对大家有帮助.

星期五, 一月 04, 2008

RedHat AS4 整合MySql5 全过程讲解

1. 卸载RedHat上原有的MySql的老版本.本人AS4上是原有了Mysql4.

       1> 用" rpm -qa | grep mysql " 查看安装了mysql的哪些组件.看清楚有哪些组件名,在第二步卸载中使用.

       2> 用" rpm -evv <组件名> "完全卸载. 其中几个组件说缺少 ***.so.10啥的,就需要用" rpm -e --nodeps <组件名> "强制卸载.到此卸载完毕.

 

2. 安装Mysql5.

      1> 重要!关闭selinux.否则安装的时候,mysql无法连接成功的.关闭方法:更改/etc/selinux/config中的SELINUX=enforcing为SELINUX=disabled。重新启动redhat,用命令sestatus确定selinux已关闭.

      2> 下载mysql5的rpm包(www.mysql.com).本人机器是Red Hat Enterprise Linux 4 RPM (x86).所以在对应的栏目里面下载对应的server和client.

            server:            http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-server-standard-5.0.27-0.rhel4.i386.rpm/from/http://mysql.cdpa.nsysu.edu.tw/

            client:             http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-client-standard-5.0.27-0.rhel4.i386.rpm/from/http://mysql.cdpa.nsysu.edu.tw/

      3> 使用root用户,用"rpm -ivh <文件名>"安装server,再用"rpm -ivh <文件名>"安装client.

      4> 用"service mysql restart"重新启动mysql.看是否安装成功.

      5> 设置root密码,进入/usr/bin目录,执行"mysqladmin -u root -p password 123456"其中123456就是你的密码. 这个时候会让你输入root密码,默认时为空,直接回车就可以了。用"service mysql restart"重新启动mysql.

      6> 测试,用"mysql -h localhost -u root -p"登陆mysql数据库.用"show databases;"查看数据库.到此MySql5安装完毕.

 

3. 远程访问管理.

      Mysql默认只能本机访问.如果需要其他机器远程访问,需要设置.

       1> 增加一个用户,用来进行远程登陆.用上方法6中的localhost登陆mysql,执行sql语句
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; 
增加一个用户名为myuser,密码为mypassword.其中的"%"表示所有机器都可以访问.用上方法4重新启动MySql.

      2> 这样过后,在本机上可以用命令"mysql -h <自己机器的IP> -u myuser -p"来登陆MySql.说明设置成功.

      3> 最重要一点.你这个时候可以发现,在本机器上可以连接MySql.但是在其他机器上用相同方法,会出现" Can't connect to MySQL server on '9.186.100.178' (10065)"的错误.分析原因是AS4的防火墙导致.用下面方法设置防火墙:打开文件/etc/sysconfig/iptables,在最后一条之前加一条:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
然后执行 /etc/init.d/iptables restart. 至此设置AS4防火墙完毕.

      现在,您就可以在其他的机器上用MySql的client端访问该数据库了,登陆方法还是"mysql -h <IP> -u myuser -p".但如果总用这个控制台管理总不爽,建议用一些管理软件管理就很不错了,本人用的是MySQL-Front,很不错的软件.可以试试.大家有什么问题,请指出,谢谢!

Linux的基本操作

Linux的基本操作

 

本章内容:

 

3.1    基础知识

3.1.1 文件名

3.1.2 使用不同的目录

3.1.3 执行一个程序

3.1.4 改变路径(PATH)

3.1.5 关闭计算机

3.1.6 处理挂起的程序

3.1.7 命令选项

3.2    用户,密码,文件访问权限和安全性

3.2.1  主目录, 根目录和添加新用户

3.2.2  密码安全性

3.2.3  忘记了超级用户密码怎么办

3.2.4  忘记了普通用户密码怎么办

3.2.5  关闭或删除一个用户

3.2.6  文件的所有权和访问权

3.2.7  设置替代用户标识(SUID)

3.3    用"&", "at", "batch"和"cron"进行作业调度

3.3.1  怎样在后台执行命令

3.3.2  怎样在某一特定时间执行命令(使用at"和"batch")

3.3.3  怎样设置"cron"

3.4    Shell

3.4.1  什么是Shell? 需要一个不同的Shell吗?

3.4.2  怎样定制自己的Shell

3.4.3  设置文本终端的颜色

3.4.4  在文本模式或 X模式控制台下,如何打印符号

3.4.5  如何编写简单的Shell脚本(Script)文件

3.4.6  引号的含义

3.4.7  输入输出重定向

3.4.8  Shell的特殊字符(metacharacters)

3.5    如何安装软件包(Package)及 rpm 软件包管理器

3.5.1  如何安装从Internet下载的程序?

 

 

 

3.1         基础知识

3.1.1 文件名

 

Linux 系统区分英文字符的大小写。比如,myfile, Myfile myFILE表示的是三个不同的文件。同样,用户密码和登录名也需要区分大小写(这里沿用了Unix C 语言的命名规则)。命名目录和命名文件的规则是相同的。除非有特别的原因,否则用户创建的文件和目录名要使用小写字符。大多数的 Linux 命令也使用小写字符。

 

Linux 系统下的文件名长度最多可到256个字符。通常情况下,文件名的字符包括:字母、数字、"."(点)、"_"(下划线)和"-"(连字符)。Linux 允许在文件名中使用除上述符号之外的其它符号, 但并不建议用户这样做。 有些转意字符 (即该字符被系统借用,表示某种特殊含义) 在Linux 的 命令解释器(shell)中有特殊的含义(shell 类似于 DOS下的命令处理器 COMMAND.COM)。这样的转意字符有:"?"(问号),"*"(星号), " "(空格), "$"(货币符), "&", 扩号等等。在文件名中应尽量避免使用这些字符。文件名中可以有" "(空格),但建议用户用"_"(下划线)来替代。

"/" 既可代表目录树的根也可作为路径名中的分隔符(类似DOS下的"\),因此"/"不能出现在文件名中。

和DOS一样,"." 和 ".." 分别用来表示"当前目录"和"父目录", 因此它们也不能作为文件名。

 

正如DOS 中一样,我们不能将文件命名为 . 或者 .. (点或者双点)——它们分别代表当前目录和当前目录的父目录(上一级目录)。这跟DOS中是完全一致的。

 

下面列出了一些转意字符及其意义:

* = 用于匹配任意长度大于等于零的字符序列。以 . (点)开头的文件名除外。

= 用于匹配任意单个字符

[abC1] = 用于匹配枚举集合中任意单个字符。比例中,集合由'a','b',C ','1'组成。

[a-z] = 用于匹配任意小字字母

[A-F] = 用于匹配任意大写字母

[0-9] = 用于匹配任意个位数字

[a-zA-Z0-9] = 用于匹配任意字母(大小写)或者数字。

 

 \ (反斜线)也是一个特殊的字符。它屏蔽后继特殊字母的特殊含义(转意),使该字符仅取其符号所代表的字面意义。

 

: 下面的命令会列出当前目录中除了文件名以 . 开头的文件之外的任何文件。

 

ls *

 

与此等价的命令是ls 或者 dir (不需要后跟 "* ")。 文件名以 . 开头的文件不被列出是因为 "."是文件名的首字符,它并不与"*"匹配。我们可以把文件名以 . 开头的文件等价地理解成DOS 中隐藏文件。使用ls –a (带 all 选项的ls 命令)或者 ls  .* 命令来查看这些"点"文件。"点"文件在用户的home目录中很常见。它们通常是用户级的配置文件。

 

以下命令可列出当前目录中文件名含 . 的任何文件 (文件名以点开头的除外)。

 

ls *.*

 

以下命令可列出当前目录中文件名含两个点的任何文件(文件名以点开头的除外)。

 

ls *.*.*

 

请注意Linux中没有与DOS中文件扩展名相应的概念,但是你可以使用扩展名。例如,一个文件可以命名为 my_text.txt.zip 。另有一些DOS中的命名特色在Linux中是完全找不到的(比方说Micro~1.doc )。

 

以下的命令会找出扩展名为"htm"后再跟任意一个字符的文件:

 

locate *.htm?

 

以下命令可列出当前目录中所有文件名以a,b或者任意大写字母开头的文件:

 

ls [abA-Z]*

 

以下命令可列出当前目录中所有文件名以a开头,n 结尾的文件:

 

ls a*n

 

命令行自动完成是一个有用的功能——使用[Tab]键可以极大的节约时间,使处理复杂的长文件名变得轻松。例如,使用自动完成的功能,可以极大的减化输入以下这个长文件名的工作。

 

dir Eurosong\ 2000\ Olson\ Brothers\ -\ Fly\ on\ the\ wings\ of\ love\ \(denmark\).mp3

 

我只要输入

 

dir Eu<Tab>

 

如果没有其他文件的文件名以Eu 开头,输入<Tab>之后,系统会自动输入文件名的其余部分。

如果还有其他文件的文件名也以Eu开头,我们可以查看一下可能的选择(系统会列出),进一步输入文件名中的下一两个字符,从而使文件的选择唯一化,系统的自动写成功能就可以启动完成整个长文件名的输入了。文件名中的反斜线作用在于提示系统其后继的字符"空格"仅取其字面意义,即,文件名中包含的确实是空格。

 

文件名中的有"怪"字符怎么办?大部分问题可以通过自动完成功能解决。 另外,处理文件名中含有转意字符的文件,我们可以使用成对的''(单引号)。由于这些特殊的转意字符被单引号引用,命令解释器不会试图去解释其特殊意义。例如,给一个名为 my file*的文件更名(文件名中含空格和*), 我们可以使用:

 

mv 'my file*' filename_without_weird_characters.txt

 

请注意我使用了一对''号 (单引号)。使用成对的""(双引号)引用通常没有使用''有效。如果你使用""号(双引号) , 部份转意字符可能会被命令解释器加以解释(这就意味着它们可能被转意,而不是保持字面意义)。

 

跟从UNIX的传统,在Linux上,创建文件时,我们可以在文件名中可以使用几乎任何字符,包括不可打印字符(控制字符)。但是这情况非常少见。如果你在遇到文件名使用了这些字符,你可能会感觉很异样。我通常会在适当的位置使用一个转意字符 *对这种文件进行重命名。我会先使用ls命令确认我要重命名的文件的文件名,然后对这个文件进行更名(使用mv 命令):

 

ls –l myfile*y.html

mv myfile*y.html myfile.html

 

(此例中我假定非标准字符位于字母ey之间)

 

这里举一个关于在文件名中使用非常规字符的极端的例子: 创建一个文件名以短横线 - 开头的文件,再等它删除。 用常规的删除命令似乎没有办法(因为短横钱通常是用来引导命令选项的)。例如:

 

dir > -junk

 

以上命令将创建一个以-junk为名的文件(跟DOS类似,符号 > dir 命令的输出重定向到一个名为"-junk"的文件。常规的删除文件命令无法把这个文件删除。我们需要使用:

 

rm ./-junk

 

文件名前的./ 表示当前目录。在此其目的是避免文件名把的首字符 - 被命令解释器当作 rm命令的选项引导。事实上没有必要在文件名中使用这些特殊字符。遵从传统的命名规则,不会过多地使事情复杂化。

 

除了使用自动完成,单引号,双引号之外,我们也可以利用 \ (反斜线) 对文件名中包含了非常规字符的文件进行操作。反斜线的作用在于屏蔽其后继字符的特殊意义。例如,我可以使用如下命令创建一个以 *?[ 为文件名的文件:

 

touch \*\?\[

 

(touch 命令创建一个空文件。如果同名文件已存在,则改变该文件最后更新的日期/时间)

 

3.1.2 使用不同的目录

 

Linux的文件系统目录树庞大而复杂。如果你非常熟悉它的话,会极大地提高你应用Linux的技巧。简单地说,典型的Linux包含五大文件系统目录。根据你自己系统的需要和大小,这些文件系统目录能安装在单个或多个物理硬盘的分区中。(如果需要的话,单个文件系统目录也可以安装在不同的设备中。)

 

"/"根目录

包含基本的操作系统和维护工具。这个目录的文件可以启动系统,并且需要的话,可以完成紧急维护和修复的功能。

 

"/usr"目录

包含所有的命令、程序库、文档和其它文件。这些文件在正常操作中不会被改变的。这个目录也包含你的Linux发行版本的主要的应用程序,譬如, Netscape

 

"/var"目录

包含在正常操作中被改变的文件:假脱机文件、记录文件、加锁文件、临时文件和页格式化文件等。

 

"/home"目录

包含用户的文件:参数设置文件、个性化文件、文档、数据、EMAIL 缓存数据等。这个目录在系统省级时应该保留。

 

"/proc"目录

整个包含虚幻的文件。它们实际上并不存在磁盘上,也不占用任何空间。(用 ls –l 可以显示它们的大小)当查看这些文件时,实际上是在访问存在内存中的信息,这些信息用于访问系统。

 

"/"根目录 部分有以下子目录:

 

/bin 系统启动时需要的执行文件(二进制),这些文件可以被普通用户使用。

 

/sbin 系统执行文件(二进制),这些文件不打算被普通用户使用。(普通用户仍然可以使用它们,但要指定目录。)

 

/etc 操作系统的配置文件目录。

 

/root 系统管理员(也叫超级用户或根用户)的Home目录。

 

/dev 设备文件目录。LINUX下设备被当成文件,这样一来硬件被抽象化,便于读写、网络共享以及需要临时装载到文件系统中。正常情况下,设备会有一个独立的子目录。这些设备的内容会出现在独立的子目录下。 LINUX没有所谓的驱动符。

 

/lib 根文件系统目录下程序和核心模块的共享库。

 

/boot 用于自举加载程序(LILOGRUB)的文件。当计算机启动时(如果有多个操作系统,有可能允许你选择启动哪一个操作系统),这些文件首先被装载。这个目录也会包含 LINUX核(压缩文件 vmlinuz),但LINUX核也可以存在别处,只要配置LILO并且LILO知道LINUX核在哪儿。

 

/opt 可选的应用程序,譬如,REDHAT 5.2下的KDE REDHAT 6.0 下,KDE放在其它的X-WINDOWS应用程序中,主执行程序在/usr/bin目录下)

 

/tmp 临时文件。该目录会被自动清理干净。

 

/lost+found 在文件系统修复时恢复的文件。

 

"/usr"目录 下比较重要的部分有:

 

/usr/X11R6 X-WINDOWS系统(version 11, release 6)

 

/usr/X11 /usr/X11R6 /usr/X11R6的符号连接)

 

/usr/X11R6/bin 大量的小X-WINDOWS应用程序 (也可能是一些在其它子目录下大执行文件的符号连接)。

 

/usr/doc LINUX的文档资料(在更新的系统中,这个目录移到/usr/share/doc)。

 

/usr/share 独立与你计算机结构的数据,譬如,字典中的词。

 

/usr/bin/usr/sbin 类似与"/"根目录 下对应的目录(/bin/sbin),但不用于基本的启动(譬如,在紧急维护中)。大多数命令在这个目录下。

 

/usr/local 本地管理员安装的应用程序(也可能每个应用程序有单独的子目录)。在"main"安装后,这个目录可能是空的。这个目录下的内容在重安装或升级操作系统后应该存在。

 

/usr/local/bin 可能是用户安装的小的应用程序,和一些在/usr/local目录下大应用程序的符号连接。

 

需要理解的是:所有目录出现在单一的文件目录树下,即使这些目录在不同的分区,物理驱动器(包括软驱),或者甚至分布在网络上。所以,在LINUX 下没有类似在DOS下的驱动符。在DOSWINDOWS下的驱动符,在LINUX下以一个装载位置下的子目录的形式出现。

 

大多数的LINUX发行版本,目录系统很完善并且标准(Linux Standard Base 发布了微小的区别)。LINUX目录系统和典型的商业UNIX目录系统完全相似。

 

总结来说:

 

bullet 用户应该将文件存在/home/user_login_name目录下( 及其子目录下)
bullet 本地管理员大多数情况下将额外的软件安装在/usr/local目录下并符号连接在 /usr/local/bin下的主执行程序。
bullet 系统的所有设置在/etc目录下。
bullet 不要修改根目录("/")或/usr 目录下的任何内容,除非真的清楚要做什么。这些目录最好和LINUX发布时保持一致。
bullet 大多数工具和应用程序安装在目录:/bin, /usr/sbin, /sbin, /usr/x11/bin, /usr/local/bin
bullet 所有的文件在单一的目录树下。没有所谓的"驱动符"。

 

更多关于/proc目录 (仅为真正好奇的读者)

 

/proc"虚拟"文件系统目录是一个实时的居留内存的文件系统,用于监视操作系统内核和在计算机上运行的进程的状态。/proc目录是完全虚拟的,即它不写入任何特殊的磁盘或其它永久的媒体,它仅居留于计算机的内存,并且它是不断地更新以反映系统的变化。 /proc目录的大小总是0,最后的日期总是当前日期。手工改变/proc目录下文件的内容可能会改变系统设置。许多LINUX使用工具利用/proc目录作为信息资源,如,dmesg, ps, top 等。

 

/proc目录的内容:

 

/proc/cpuinfo 关于处理器的信息,如类型、厂家、型号和性能等。

 

/proc/devices 当前运行内核所配置的所有设备清单。

 

/proc/dma 当前正在使用的DMA通道。

 

/proc/filesystems 当前运行内核所配置的文件系统。

 

/proc/interrupts 正在使用的中断,和曾经有多少个中断。

 

/proc/ioports 当前正在使用的I/O端口。

 

举例,使用下面的命令能读出系统的CPU信息。

cat /proc/cpuinfo

 

3.1.3 执行一个程序

 

在命令行输入可执行程序的文件名但是程序不能运行?有三种可能性:

 

第一种可能性:没有输入正确的文件名。注意: Linux文件名是区分大小写的!举个例子,输入"Pico"或者"PICO"并不能启动pico编辑器程序。

 

第二种可能性:程序不在缺省路径 PATH下?在Linux和其他的Unix下,可执行程序必须在你的PATH下面你才能够运行。如果程序所在的目录不在缺省路径下,你可以进入到程序所在的目录:

 

cd the_program_directory          (the_program_directory是程序所在的目录名)

./program_name                    (program_name是程序的文件名)

 

或者你可以输入程序完整的路径名如下:

 

/the_program_directory/./program_name

 

注意,必须在程序名前面加上点"."和斜杠"/"才能够正确运行。这是 Linux的另外一个安全特性,可以使"特洛伊木马程序"更难于入侵。点"."指的是当前目录,斜杠"/"是文件和目录之间的间隔符(DOS用的是反斜杠"\")。

 

可以用一下命令来检查一下缺省路径:

 

echo $PATH

 

如果忘记了可执行程序的文件放在哪一个目录下面了,可以用以下命令查找:

 

find / -name "netscape"

 

以上命令从根目录"/"开始查找文件名叫"netscape"的程序。用这个命令可能速度更快一些:

 

locate netscape

 

(locate命令运行速度更快是因为它依赖于系统预先建立的文件数据库。这个数据库由一个在背景运行的程序cron来建立。因为cron一般安排在夜间运行,所有如果你经常在夜晚关机,就不要依赖 locate可以找到你要的文件,也不要巴望locate可以找到刚刚才安装的软件名称)

 

请注意,PATH对于超级用户root和普通用户一般来说是不相同的。超级用户 rootPATH包括/sbin/usr/sbin,而普通用户一般不包括。所以,普通用户不能执行在/sbin下面的文件,除非他们指定程序的全路径名(目录加文件名)。还有,如果你是使用 su命令从普通用户变成超级用户root的,因为继承了普通用户的缺省路径PATH,要执行/sbin目录下的文件,还是要指定程序的全路径名。

 

如果你知道程序的名字但是不知道程序的全路径名,可以用以下命令:

 

which  netscape

 

就可以找到所有叫做netscape的文件的全路径名

 

第三种可能:程序可能是不可执行的。如果是这个原因,把它改成可以执行的(必须是超级用户 root或者文件的所有者)

 

chmod a+x my_file

 

这个命令把"my_file"变成是所有人都可以执行的。检查是否可行:

 

ls –l my_file

 

请注意,在LinuxUnix下,修改文件的扩展名(比如.exe 或者.bat)并不能使文件变成可以运行。文件能够被执行需要"可执行访问模式",而不是象DOS下的"文件属性".

 

3.1.4 改变路径(PATH

 

一般来说,你不需要去修改缺省路径PATH

 

PATH是当你要求执行程序时,文件搜索的目录列表。你可以用以下命令检查你的PATH

 

echo $PATH

 

比如说,在我的系统里,显示用户yoginPATH:

 

/opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/yogin/bin

 

 ":"是间隔符,以上的PATH代表以下的目录表:

 

/opt/kde/bin

/usr/local/bin

/bin

/usr/bin

/usr/X11R6/bin

/home/yogin/bin

 

以下是在我系统上的超级用户root运行 "echo $PATH" 的结果:

 

/opt/kde/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

 

你可以修改文件/etc/profile里以"PATH=" 打头的行,这样所有用户的缺省路径都将被修改,我一般用pico编辑器:

 

pico -w /etc/profile

 

(可选项 -w 用于关闭文件的自动换行)

 

你必须重新登录,才能验证修改的结果。仅修改个别用户的缺省路径,可以编辑文件:

 

/home/user_login_name/.bash_profile

 

注意文件名前面的"."。如果文件名的第一个字符是".",通常这个文件是不可见的,必须用

ls –a的命令显示。

 

如果你真的想要当前目录在你的缺省路径PATH里,在你的PATH里加上" ."

 

/etc/.bash_profile 文件看起来可能是这样子的

 

PATH="$PATH:$HOME/bin:"."

export PATH

 

这个命令从环境变量里得到PATH(对于所有用户,PATH/etc/profile 文件里),然后加上用户的$HOME目录(比如,用户susan$HOME目录一般就是/home/susan目录),再加上"." 指的是当前目录。修改完PATH或者其他环境变量后,一般要使用export命令。这样才能使所有环境变量在修改之后,在设置脚本之外的环境都是可视的。

3.1.5 关闭计算机

 

在关闭计算机之前最好把所有的运行程序都关闭。从GUI的主菜单(GNOME或者 KDE)选择"Logout"。接着,在logout的窗口里,选择"Shutdown"

 

你也可以采用另外一种办法,在字符终端,按住<CTRL><ALT><DEL>(三个键同时按住 ),等待系统关机完成后,在机器重新启动的时候关掉计算机电源。如果你在X-Windows里,先按<CTRL><ALT><F1>(三个键同时按住)切换到字符终端,然后再按<CTRL><ALT><DEL>

 

从来不要在未正常关机的情况下关闭计算机的电源,否则下一次重新启动可能会有硬盘出错的信息。一般来说,由于不正常关机导致的硬盘错误会被系统自动修复,但是在某些场合下也可能导致严重的问题,你可能要手工修复损坏的文件或者重新安装系统!

 

如果你希望按住<CTRL><ALT><DEL>只是关闭计算机而不是重新启动,你可以编辑文件 /etc/inittab。这个文件看起来如下:

 

# Trap CTRL-ALT-DELETE

ca:ctrlaltdel:/sbin/shutdown –t3 –r now

 

root用户登陆,把文件修改如下:

 

# Trap CTRL-ALT-DELETE

ca:ctrlaltdel:/sbin/shutdown –t3 –h now

 

"#"打头的行只是注释行,只是给人看的,对计算机不起影响

"t3"告诉shutdown程序在关闭所有的进程之前等待"三秒钟"

"r"选项指的是reboot(重新启动), "h "选项指的是halt(关机)

 

如果你是root用户,也可以直接使用shutdown命令关机。这个命令可以在用于关闭本地和远程的计算机。但是最常用的是当本地计算机的键盘不起作用(由于系统挂住等原因),无法按 <CTRL><ALT><DELETE>时从远程登陆后使用shutdown命令关机。

telnet name_of_machine_with_no_operatable_keyboard

 

[以一般用户登陆到远程计算机name_of_machine_with_no_operatable_keyboard]

 

su root

 

[登陆到root用户]

 

/sbin/shutdown –rn now

 

[关闭计算机]

 

这个命令跳过标准的关机程序,所以关机的速度很快,当系统变得很不稳定的时候特别有用。(选项-n在重新启动之前强行中止所有的进程)

 

注意,出于安全的考虑,你不能在远端或者通过因特网使用root用户直接登陆。你必须先login 到一般用户,然后执行su root命令,输入正确的秘密后进入到超级用户root.

 

你也可以使用shutdown把关机的时间安排得往后一点

 

/sbin/shutdown –r 23:59

 

将在午夜0点之前的一分钟重新启动计算机。 或者

 

/sbin/shutdown –r  +1

 

将在你命令输入后的一分钟重新启动计算机

 

如果shutdown命令对你来说太长太难记了,也可以使用以下命令:

 

reboot        (重新启动)

halt          (关机)

 

另外一个比较偏门的办法是把计算机切换到runlevel 0 (关机状态) 或者 runlevel 6 (重新启动状态)。命令如下:

 

init 0               (关机)

init 6        (重新启动)

 

关于不同的runlevel的描速可以在文件/etc/inittab里找到。

 

3.1.6 处理挂起的程序

 

有错误的程序在Linux下照样会引起系统挂起没有响应。但是一个崩溃的程序一般不会影响操作系统本身,所有你不需要经常因为某个程序崩溃而重新启动系统。很多 Linux的服务器运行超过一年也不需要重新启动。按我们的经验,一个不太稳定的操作系统一般是由硬件或者不正确的系统配置引起的。比如,我们多次碰到奔腾处理器的过热问题(CPU风扇转的不如所要求的速度快或者干脆停了,CPU芯片与散热片之间由于有赃东西导致接触不太紧密) ,质量不好的内存条,速度不匹配的内存条,错误的BIOS设置(你最好把一些先进功能的设置去掉,让Linux来负责这些设置)。"signal 11"是一个典型的与硬件有关的出错信息,特别是当你执行一些要求复杂运算的任务:Linux安装,内核的编译等等。如果你的奔腾芯片有过热的现象(特别是早期的一些奔腾芯片),这里有一些小诀窍让它"冷却 ":清洗芯片上的散热片,更换CPU风扇,把计算机用机壳装起来(一些计算机玩家喜欢"裸机"),在计算机内多安装一个风扇,不要"超频",减少一些不必要的任务,等等,还有,使用空白屏幕替代很复杂的屏幕保护。

 

非真正的系统挂机

 

有些程序运行时看起来好像是系统挂住了,其实是在等待用户的输入。比较经常碰到的是一些程序的命令行需要输入对应的文件名作为选项,但是用户只输入程序名却没有给需要的文件名,程序就假设用户即将在标准输入终端上输入文件名,于是处于等待状态。比如命令:

 

cat

 

输入回车后,看起来好像没有响应,其实程序在等待你的键盘输入。按住<CTRL>D(代表"文件结束") 就可以看到真正的结果了。

 

再举另外一个例子:我在用户新闻组上看到很多关于使用tar命令解压一个下载的文件时,引起系统挂死的问题。比如:

 

tar -zxv my_tar_file (命令错误!)

 

其实这也是在等待用户输入。因为命令没有带选项"-f 文件名",所以文件 my_tar_file并不被认为是一个文件名。正确的命令应该是:

 

tar –zxvf my_tar_file

 

要注意的是文件名必须紧跟在选项-f后面,否则照样出错,比如:

 

tar –zxfv my_tar_file (命令错误!)

 

 

出错的程序都可以被中止

 

一个在前台运行的文本程序可以在任何时候使用<CTRL>C中止,但是这对比较大的应用程序不起作用,因为这些应用程序为避免用户的误操作,通常把 <CTRL>C的功能屏蔽。当程序被挂起时,你可以使用<CTRL>Z将程序送到后台运行(不是百分百可行),或者切换到不同的终端(使用<CTRL><ALT><F2>,然后,使用相同的用户名登录到系统。一旦你重新回到系统里,找到你需要中止的程序:

 

ps

 

这个命令代表"列出当前状态"(print status),可以显示当前系统中由该用户运行的进程列表。在ps 的输出中,找到挂起的程序的PID号,然后执行命令:

 

kill 123

 

该命令将中止PID号码为123的进程。

 

作为一般用户,我只能中止那些由我运行的进程。而作为超级用户可以中止任何进程。想要看系统中所有正在运行的进程的完整列表,用命令:

 

ps –axu | more

 

这命令将列出正在运行的所有进程(选项a,包括那些没有控制终端的进程(选项 x,包括每个进程所属的用户名(选项u)。因为显示的内容可能要超过一个屏幕,所以用管道命令"|"加上"more"让换屏幕之间有个停顿。

 

kill命令另有一个快捷的方法killall,举例:

 

killall netscape

 

这个命令将中止名称是netscape的所有进程

 

killall pppd

 

这个命令将中止ppp daemon进程,取消所有的拨入连接

 

X-windows的程序没有控制终端,可以很容易用xkill命令中止(在X终端里输入命令):

 

xkill

 

你可以看到光标变成一个"宣判死刑"的标志,把光标移到你要关闭的窗口,点击鼠标左键,窗口立刻关闭,该程序被中止。

 

对于上述命令,另外一个快捷的办法是按住<CTRL><ALT><ESC>,等待光标变成一个"宣判死刑"的标志指到对应的窗口。点击鼠标后,窗口就会消失,程序退出。

 

如果X-Windows系统崩溃实在无法恢复,强行中止X-Server最快的办法是按 <CTRL><ALT><BACKSPACE>。然后,运行ps –aux找到任何可能还在运行的X-Windows程序,逐一使用kill命令中止这些进程。如果你不这样做,其他任何一个有问题的 X-Windows程序可能又会引起整个X-Windows系统崩溃。如果你有在后台运行的程序,操作系统会要求你退出,接着发送信息"There are stopped jobs"。你只要重复运行命令logout(或者exit ),后台运行的程序将会被自动退出,然后你也会退出系统。

 

核心文件 (core files

 

当一个程序崩溃时,它经常导出一个"核心文件"到用户的主目录下。一个"核心文件"通常是一个内存映像文件,这个文件带有一些给程序错误解析时要用到的信息。如果你只是普通用户不想解析任何错误程序,可以把"核心文件"删除。

 

rm core

 

或者放在那里不管,下一次有程序出错的时候,该文件会被自动覆盖。你也可以使用以下命令关闭"核心文件导出"的功能:

 

ulimit -c o

 

看看是否生效使用命令:

 

ulimit -a

 

(该命令显示"用户限制",选项"-a"代表"所有")。如果想要关闭所有用户的"核心文件导出"功能,编辑文件 /etc/profile (要求超级用户root),调整你要的设置。

 

如果你想知道"核心文件"有什么用处,可以在"核心文件"所在的目录使用命令:

 

gdb –c core

 

这个命令将启动GNU的程序调试工具,显示产生"核心文件"的程序名,程序中止时的信号等信息。输入quit 退出程序调试工具。如果想知道更多的信号,用命令:

 

cat /usr/include/bits/signum.h | more

 

3.1.7 命令选项

 

大部分命令带很多选项,大部分选项在字符前面带有"",举个例子:

 

dir -l

 

显示当前目录下的文件(以长文件名格式显示,不带选项为缺省时按短文件名格式显示),

 

dir –l –a

 

或者

 

dir –la

 

以长文件名格式(选项-l)显示所有文件包括隐含文件( 选项-a)

 

一般情况下,选项只带一个字符。这是为了遵循旧的Unix的传统。当然也有一些新的选项不止一个字符:

 

dir --help

 

这里,如果选项超过一个字符,选项前面就必须使用两个"-"作为引导。以上命令显示关于命令dir 的一些简单帮助信息。如果显示的内容超过一个屏幕,可以使用管道命令:

 

dir –help | more

 

3.2         用户,密码,文件访问权限和安全性

3.2.1   主目录, 根目录和添加新用户

 

对于一般用户来说,主目录(home directory)是硬盘上唯一可以原来写东西的地方。一般的路径名是/home/login_user_name

 

主目录用于存储各种用户文件:设置文件,程序配置文件,用户文档,数据,netscape的缓存,邮件等等。作为一个普通用户,你可以在主目录下建立新的目录安排你自己的目录结构。其他用户无法阅读你的文件或者写数据到你的主目录,除非你给他们适当的权限。

 

除了自己的主目录以内的文件,一般用户也可以看到,阅读和执行很多系统里的文件,但是一般来说他们不能修改和删除这些文件。

 

root用户(也叫"超级用户")是一个特殊的系统管理帐号,可以修改系统里的任何文件。经常使用root用户作为缺省的登录用户不是什么好习惯――你的误操作将有可能导致严重后果。建议设置一个一般用户给自己作为日常使用的帐号,只在必要使用 root用户的权限时才登陆到root用户模式下。一般来说,root用户是Linux初始化安装后的唯一一个用户。

 

使用root用户建立一个普通用户:

 

adduser joe

passwd joe

[输入用户秘密]

[再次输入用户秘密确认]

 

在上述的例子里,要求超级用户root。以上命令在系统里产生一个joe的用户,接着设置该用户的密码。现在,可以告诉 joe他的用户名和初始密码,然后他可以登录到系统,然后修改他的密码。还要注意的是,用户名和密码都是大小写敏感。

 

超级用户可以修改任何人的密码,尽管他/她无法阅读该用户的密码。用户密码采用单向加密算法,加密后仅仅在系统上储存加密后的密码,对于旧的系统一般存在 /etc/passwd文件里,新的系统一般存在/etc/shadow文件里,未经加密的密码文件从来不被储存在系统里。当用户登录的时候,系统把用户的输入密码使用相同的加密算法得到的结果再和密码文件(/etc/passwd或者/etc/shadow )里的结果相比较。

 

超级用户和一般用户的分开使得Linux系统更加安全――甚至让病毒在Linux系统下很难有所作为(因为用户运行的程序只能把数据写到他 /她自己的有读写权限的目录里,不会感染整个操作系统的核心部分)。

 

一般建议用户在第一次登录到系统的时候立刻修改自己的密码:

 

passwd

Changing password for joe

(current) UNIX password:   [输入旧的密码]

New password:              [输入新的密码]

Retype new password:       [重复输入新的密码]

passwd: all authentication tokens updated successfully.passwd

 

实际上,当你输入密码时,出于安全原因,键盘输入并不会显示在屏幕上。如果你是第一次修改密码,看不到键盘输入的结果可能会有点不适应。

 

Linux里,同一个密码可以用来:

 

·          登录到文本终端

·          登录到图形用户界面(GNOME或者KDE

·          取消锁定的文本终端

·          取消密码保护的图形用户界面下的屏幕保护(GNOME或者KDE

 

3.2.2   密码安全性

 

一个"脆弱"(指容易被破解)的密码通常是安全问题的根源。即使在家里,完全有可能当你在浏览因特网的同时,黑客已经攻破你的计算机,正在修改和删除你计算机上的文件,或者通过你的计算机在本地警察局的网络里做一些令人头痛的事情。所以,即使在家里也要保证用户密码的安全。一旦有人登录到你的计算机,即使是普通用户,他也有可能找到其他方法获得超级用户的密码。其实就看你管理计算机系统的能力和黑客破解能力的较量了。

 

以下是一些不好的密码:

 

bullet 根本没有密码
bullet 密码就是"password"
bullet 密码和登录用户名相同
bullet 你的名字,女儿的名字,儿子的名字,妻子的名字,丈夫的名字……或者任何一个亲人的名字。人的名字其实非常的有限――只要查一下一些类似"如何给婴儿取名"之类的书就可以了,不要以为你是印度来的就没有人知道你的名字。
bullet 你的姓或者其他人的姓。姓的数量比名字更加有限!
bullet 你家小狗的昵称,老婆的昵称等等。昵称的数量比姓更少!
bullet 你喜欢的体育俱乐部的名称,节日名称,牙膏的名称等等。避免使用非常出名的足球队的名称,也不要用任何摇滚乐队的名字
bullet 你的生日,社会保险号码,等等。
bullet 公司,部门,小组的名称
bullet 密码写在你的记事本上或者计算机壳子上
bullet 你在因特网联机商店使用的密码,电子邮件邮箱的密码等
bullet 任何在字典里可以找到的单词。英文字典其实没有包含你想象中那么多的单词(10万个单词? 10万个单词的文件小于1MB!)。一个水平很一般的黑客很容易就加密所有的字典词汇然后逐一和你的密码比较。一个不可否认的事实,因特网上的确已经存在用来制造 "字典攻击"的现成工具。不信?试着找一个工具来破解你的密码看看有多容易!
bullet 任何其他词汇,姓,宠物或者成语,不管是哪一种语言。对于一个有经验的黑客来说,如果他已经覆盖了一种语言,稍微加工一下就可以很容易覆盖其他常用的语言。有多少常用的语言? 40个?黑客只需要把预先做好的几个文件加到破解文件清单里就行了。
bullet 任何以上的密码在前面或者后面加上一两个数字或者字符

 

一个好的密码最少要6个字符,有些专家甚至建议最少要10个字符,包含字符(最好大小写混合),数字和特殊字符(比如?, *$%,#),还要定期做修改(建议816周之间)。

 

不巧的是,越不好破解的密码往往越难以记住。为了解决这个问题,我花了十分钟发明了我自己的"密码公式"。比如说,我总是以"@"字符作为密码的开头和结尾,然后使用两个单词并且用" !"把它们连接起来,每一个单词的最后一个字符大写,比如"@whitE!housE@"。看起来象一个不太好记的密码,但是只要我记得自己的"密码规则",其实可以很容易记住这个密码。当然,如果你是一个记忆的超级天才,你可以使用mkpasswd并且试着记住它 J

 

系统管理员可以使用Linux自带的工具来设置密码的规则(密码最小长度,是否要求特殊字符,密码过期的期限等),以root 用户运行:

 

linuxconf

 

在菜单"user account"-"policies"-"password & account policies" 设置。在以下场合里,一般的用户不能设置一个密码:

 

bullet 当密码长度太短
bullet 密码是一个字典里的单词
bullet 密码中不包含数字或者特殊字符

 

但是对于root用户,可以设置任何密码而只接收系统的警告信息。

 

还要保证任何包含你的密码的文件(比如/root/.kde/share/config/kpprc)有正确,安全的权限设置,这样才能保证你的密码不会被其他人看到。举个例子,你可能要运行命令:

 

chmod 600 kpprc

 

如果你使用电话线上网,每周只用几个小时,你的密码太脆弱可能不会有什么大问题。但是如果你使用cable modem宽带上网,或者如果大部分时间你都呆在因特网上,你最好重新考虑一下你的系统安全。

 

有些计算机半文盲使用一些脆弱得让人惊讶的密码,根据CNN的相关报道,"大概有50 %的计算机用户基于家庭成员的名字,配偶的名字或者宠物的名字作为密码。大概30%的计算机用户基于流行音乐歌手的名字或者体育明星的名字作为密码"

http://www.cnn.com/2002/TECH/ptech/03/13/dangerous.passwords/index.html

 

特别要请注意的是:在以上"基础密码"后面加上一两个数字并不会使密码安全提高多少。

 

3.2.3   忘记了超级用户密码怎么办

 

尽管我从来不会忘记自己的密码,但是我还是会仔细研究一下这个专题,以防将来有一天突然看到我的母亲在阅读我的ICQ聊天记录时,可能会派上用场。

 

第一种办法:

 

最容易解决"忘记密码问题"的方法是将Linux重新启动到单用户模式,可以在"lilo" 的命令提示符下输入:

 

linux single

 

这种办法将使你变成root超级用户而不需要输入任何密码。现在作为root用户,你可以使用以下命令重新设置密码(不需要输入旧的密码)

 

passwd

 

你可能觉得这实在是太不安全了!那是因为,如果有人可以物理上"访问"你的计算机硬件,没有计算机系统是安全的。但是,我并不喜欢在我的计算机上有这个"linux single" 的漏洞存在,所以我在文件/etc/lilo.conf里(在 "image="段落的尾部)加上以下内容就可以把这个漏洞拔除:

 

password="my_password"

restricted

 

这个设置使得Linux启动时,在lilo的命令提示符下,当用户输入 linux带任何参数时必须输入正确的密码。如果用户不是使用命令行的启动模式而使用正常的启动模式,没有密码也能够启动系统。为了让修改生效,必须重新运行lilo命令。因为我设置的密码在lilo.conf文件里没有加密,我还必须把文件/etc/lilo.conf 改成只有root用户可以读写:

 

chmod 600 /etc/lilo.conf

 

第二种办法

 

另外一个解决"超级用户密码丢失"的办法是使用Linux启动盘或者安装CD来启动你的计算机。然后找到你计算机硬盘上的 root分区,使用mount命令挂载该分区,接着修改文件/etc/shadow。因为当我从软盘启动Linux时,我可以不需要输入任何密码就成为root用户。在密码文件里,把 root用户的加密密码删除,所以root的密码将是空的。

 

用户帐号的信息储存在以下纯文本文件里:

 

/etc/passwd

/etc/shadow

 

文件/etc/passwd包含了我计算机上的所有用户,并且很容易阅读。文件每行包含一个帐号信息,总共包含六个" :"间隔符号(这意味着七个字段)。举例如下

 

/etc/passwd文件例子

 

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

apache:x:48:48:Apache:/var/www:/sbin/nologin

                                                                                           

1

root

登录用户名

2

x

字符x

3

0

用户标识

4

0

该用户的优先用户组标识

5

root

注释(比如用户的全名)

6

/root

用户的主目录(HOME DIRECTORY)

7

/bin/bash

用户的shell的名字

 

真正最重要的用户信息其实储存在文件/etc/shadow文件里。这个文件相对安全因为只有 root用户才能阅读。在这个文件里,每行包含九个字段:

 

1

登录用户名

2

加密后的密码

3

197011日到上一次修改密码的天数

4

距离下一次修改密码的天数

5

密码定期作修改的天数

6

密码即将过期时提前通知用户的天数

7

密码过期到用户被取消的天数

8

密码被取消时距离197011 日的天数

9

预留字段

 

一些旧的Unix版本不包含/etc/shadow 文件,而是把密码存放在/etc/passwd每行中的第二个字段。这个字段在新的系统中只显示一个"x"字符。

 

举个例子,我的/etc/shadow文件中的root用户看起来是这样的:

 

root:$1$BuPbmLAz$1G7.evIChyqaEI0TlZp0F.:11071:0:99999:7:-1:-1:134540356

 

当密码被消除后,看起来是这样的:

 

root::11071:0:99999:7:-1:-1:134540356

 

现在,root用户就没有密码了,所以我就可以重新启动计算机,在login登录提示下,输入" root",对于密码提示只需要按回车键就可了(没有密码)。登录成功后,可以立刻使用以下命令修改root密码:

 

passwd

 

有个例外,尽管在/etc/shadow删除了密码,对于Debian的发行版本并不允许你按"无密码"状态登录,在这种情况下,你需要做的是用其他用户(密码已经)的加密后的密码取代 root的密码,然后使用该密码重新登录。

 

想给远程用户设置用户帐号,用电子邮件发送加密密码也是一个安全的办法,"我正在帮你在我的计算机上设置ftp帐号,请把你的加密密码用电子邮件发送给我 "。等你收到加密密码后,把它插入到/etc/shadow文件里。这样,用户就可以登录了,因为只有她知道她的密码,其他人不知道。

 

为了让我的计算机没有"软盘访问"功能有点难度,我喜欢在没有软驱的情况下运行计算机。不幸的是,Linux光盘现在是可以自启动的。我在 BIOS里设置启动设备的顺序以保证系统从硬盘启动而不是软驱或者光驱,然后给BIOS设置加上密码保护,这样就没有其他人能够修改BIOS设置。但是,我还是很担心BIOS的密码很容易被破解,或者有人打开计算机盖把BIOS 的电池放电来重新设置BIOS。还可能有人把我的硬盘拿走然后在别的计算机上阅读J 。所以,我正在考虑在我的计算机上安装一个现在已经有效的 Linux"加密文件系统",但是以其考虑这么多麻烦问题,我觉得还是干脆把计算机锁在屋里才是一个真正的好办法。这些听起来头很大吧?事实大概也是这样的――这里我只是把一些计算机的安全问题稍微罗列了一下,即使在Linux下,如果黑客有潜在可能可以直接接触你的计算机硬件,Linux 也是不安全的。

 

3.2.4   忘记了普通用户密码怎么办

 

如果是普通用户(非root用户)忘记密码,这个不是什么大问题,因为root可以修改任何人的密码。举个例子(要求 root用户)

 

passwd barbara

 

按回车键后,将提示输入用户barbara的新密码(root用户不需要知道旧的密码)。如果一个普通用户想要修改自己的密码,该用户会被要求输入旧的密码(这是一个安全特性,以避免当你离开你的坐位有人试图修改你的密码)。

 

3.2.5   关闭或删除一个用户

 

用户帐号可以被临时关闭或者永久删除

 

临时关闭(锁定)一个用户帐号,并不需要修改该用户的密码。只需要在/etc/shadow文件里属于该用户的行的第二个字段(密码)前面加上星号" *"就可以了。星号"*"指的是该用户不允许登录。当你想要把该用户恢复正常,只需要把星号"*"去掉就可以了,用户就可以恢复正常。

 

以下是一个在/etc/shadow关闭用户peter的例子:

 

peter:*$1$narMEFm6$fhA1puOU422HiSL5aggLI/:11193:0:99999:7:-1:-1:134539228

 

我也可以使用以下命令来关闭用户帐号:

 

passwd peter –l

 

使用以下命令重新释放该用户:

 

passwd peter –u

 

对于永久性(不可恢复)的删除一个用户帐号,我一般这样做:

 

- root登录

- 把我的用户标识改成要删除的那个用户,检查是否有新的重要的电子邮件:

 

su doomed_user_login_name

mail

logout

 

- 删除用户和用户组:

 

userdel doomed_user_login_name

groupdel doomed_user_login_name

 

- 然后把该用户从所属的其他用户组里面删除:

 

usermod –G doomed_user_login_name doomed_user_login_name

 

- 强制删除该用户的主目录和主目录下的所有文件和子目录:

 

rm –fr /home/doomed_user_login_name

 

3.2.6   文件的所有权和访问权

 

Linux(还有其他Unix)是一个安全,多用户的操作系统,同时,这也产生了文件访问权限的复杂性。没有设置好文件的访问权限可能会导致一些莫名其妙的问题。充分了解文件的访问权限是管理任何多用户操作系统( Linux, Unix, Windows NT)的最重要环节。

 

我的建议是:学习Linux(或者其他Unix)的文件访问权限的内容,你从来不会为此感到后悔。

 

文件拥有者

 

每个文件(或者目录)从属于一个文件拥有者(一般是一个用户名)和一个用户组。文件拥有者一般来说就是生成(或者拷贝)这个文件的用户。用户组经常包含一个用户-文件拥有者。用户组通常有一个名字来标识该用户,但是也不是必须的。一个文件只能被文件拥有者删除,或者是文件所属的用户组里的其他用户,或者是 root用户。对于其他用户,如果被赋于适当的权限,也有可能修改或者删除该文件。文件所属的用户和用户组可以通过命令ls –l(长文件名显示格式)来显示:

 

ls –l junk

 

屏幕输出如下:

 

-rwx------ 1 yogin inca 27 Apr 24 14:12 junk

 

该文件属于拥有者yogin和用户组inca

 

文件的从属可以通过命令chown(修改文件拥有者)和chgrp(修改用户组),一般来说需要 root用户:

 

chown peter junk

chgrp peter junk

ls –l junk

 

执行以上三条命令后,命令ls –l输出如下:

 

-rwx------ 1 peter peter 27 Apr 25 20:27 junk

 

当你以root用户身份为其他用户删除或者拷贝文件时,修改文件的从属可能是经常要做的事情,在做完文件的整理工作后,把文件的拥有者改成对应的用户。

 

文件的权限

 

文件的拥有者可以把文件的访问属性设成三种不同的模式: (r),写 (w)和运行(x)和三个不同的用户级别: 文件拥有者(u),所属的用户组(g),系统里的其他用户(o)。你可以检查当前的文件访问权限:

 

ls –l filename

 

如果文件对于三种不同的用户都提供三种文件访问模式,输出结果看起来应该是:

 

-rwxrwxrwx

 

跳过第一个字符"-"(第一个字符显示文件的类型, "-" 表示普通文件," d" 表示目录文件," l" 表示链接文件,"c"表示字符设备,"b"表示块设备,"p"表示命名管道比如 FIFO文件(First In First Out, 先进先出)," f"表示堆栈文件比如LIFO文件(Last In First Out ,后进先出)。

 

第一个字符之后的第一个三位字符组表示对于文件拥有者对该文件的权限,第二个三位字符组表示文件用户组对该文件的权限,第三个三位字符组表示系统其他用户对该文件的权限。如果没有权限,一般显示"-"字符。

 

以下是一个显示一个属于root的文件用户权限:该文件的拥有者root拥有所有权限,但是用户组和其他用户只能阅读和执行。

 

drwxr-xr-x 2 root root 21504 Apr 24 19:27 dev

 

第一个字符d显示该文件是一个目录。

 

你可以使用chmod命令来修改属于你的文件的访问权限。举个例子,以下命令将把文件junk 给所有用户增加"只读"权限。

 

Chmod a+r junk

 

在以上的命令,除了用"a"表示所有用户(all),我还可以用"u "表示用户(user),"g"表示用户组(group),"o"表示其他用户(other users)。除了加号"+"增加权限,我还可以使用减号"-"删除权限,等于号" ="设置权限。除了"r"表示只读权限(read),我还可以用"w"表示写权限(write),"x"表示执行权限(execute)

 

第二个例子,以下命令将删除其他用户对junk文件的执行权限:

 

chmod o-x junk

 

除了字符,也可以使用数字来设置权限。想知道是然后工作的,看以下例子:

 

execute=1

write=2

read=4

 

对于指定的三种不同用户级别总结如下:

 

0 = 没有任何权限 (不能读,不能写,不能执行)     (常见)

1 = 只能执行                                    (看起来不太正常)

2 = 只能写                                      (看起来不太正常)

3 = 只能写和执行                                (看起来不太正常)

4 = 只读                                       (常见)

5 = 只读和执行                                  (常见)

6 = 读和写                                      (常见)

7 = 读,写和执行                                (常见)

 

 

要给三个不同的用户级别设置访问权限,只需要把三个数字粘在一起就可以了。举例:

 

chmod 770 junk

 

将给文件拥有者和所属用户组所有权限(读,写和执行),而对于其他用户没有任何权限。

 

chmod 666 junk

 

将给所有用户(文件拥有者,所属用户组,其他用户)读写权限,但是没有执行权限。请注意这个666权限设置里很经常用到,有人认为这是整个 Linux(或者其他Unix里)的精髓所在。

 

chmod 411 junk

 

将给文件拥有者以只读权限,对于所属用户组和其他用户只有执行权限。这个看起来好像没什么实际用处,但是对于北美的Linux用户可能会感到很有趣,因为 411电话号码是他们用来获得电话号码查号帮助的。如果对于权限设置,你还能想出什么好主意,别忘了给我来电子邮件哦 (可能是007?)!

 

文件访问权限的数字表示法叫做"八位组"因为是基于八进制的(我们的日常计数系统是基于十进制)。八进制有八个数值从07 ,最大数字是7。对应的,十进制有十个数字从09,最大数字是9。八进制表示法对于二进制的文件权限表示法的确非常方便,每一个标志都可以通过设置成0或者1 来表示"允许"或者"不允许",如以下的例子:

 

用户级别:                   文件拥有者     用户组         其他用户

权限设置例子                     rwx             rw-             r--

缺省权限                         ---             --x -           wx

权限的二进制表示法                111             110             100

权限的八进制表示法                7               6               4

 

目录权限

 

目录的访问权限和一般文件的访问权限是不同的。对于一般文件:

 

r      =允许读文件内容

w      =允许修改文件内容

x      =允许执行该文件

 

对于目录而言:

 

r      =允许列出该目录下的文件和子目录

w      =允许生成和删除该目录下的文件

x      =允许访问该目录

 

使用umask设置缺省文件属性

 

当一个文件生成时,系统给以文件缺省的文件权限。在我的系统里,缺省权限是:

 

-rw-r--r--

 

这意味着由该用户生成的文件能被该用户读和写,而用户组和其他用户只能读。还有,在我的Redhat系统里,用户不能读取其他用户的主目录,因为用户主目录的缺省权限是

 

drwx------

 

我可以使用以下命令检查我刚生成的文件的缺省权限:

 

umask -S

 

(可选项-S代表"符号"告诉umask按容易阅读的格式显示文件权限,而不是缺省的数字格式)

我可以修改新生成文件的缺省权限

 

umask u=rw,g=,o=

 

对于新生成的文件,以上命令将给文件拥有者以读和写的权限,而用户组和其他用户将没有任何访问权限。

 

umask命令里使用数值来设置文件的缺省属性更加麻烦。因为数值显示的是从用户那里去除掉的权限(刚好和chmod 相反),比如:

 

umask 000

 

对于新生成的文件,你将给所有人所有的权限。下一个例子给文件拥有者以读和写的权限,而其他用户没有任何权限:

 

umask 177

 

为了让设置对系统永久有效,在文件/etc/profile里修改对应的行。

 

3.2.7   设置替代用户标识 (SUID)

 

我的MP3播放器播放音乐的时候断断续续,听起来好像受到干扰似的。这是因为程序没有得到足够的处理器"能量"(它对处理器的要求有点大)。这可能是你的计算机实在太老掉牙了,或者是你可能同时运行太多的" CPU饥渴型"的程序。这种情况下,可以把播放器进程以较高的的任务优先级别运行(程序的优先级别可以通过nice来设置,了解更多情况使用命令man nice或者info nice)。或者也可以用root 用户来运行程序,root用户运行的程序的优先级别通常给比一般用户的要高。

 

如果这个解决了你的"音乐干扰"问题,使用suid修改可执行文件,这样其他用户运行该程序的时候,系统能够给以该用户和文件拥有者(一般是 root用户)同样的"有效用户标识",举例:

 

chmod a+s /usr/bin/xmms

 

这将给xmms程序动了一点小手脚,文件显示时:

 

ls –l /usr/bin/xmms

 

在我的计算机上输出结果如下:

 

-rwsr-sr-x 1 root root 908k Feb 22 2000 /usr/bin/xmms

 

第一个s指示用户替代标识(suid)已经被设置。第二个s 指示替代组标识(sgid)已经被设置。这样,每一个运行该程序的用户将给予和程序拥有者同样有效的用户标识,和用户所属组同样有效的组标识,在这个例子里,指的是用户root和用户组root

 

设置替代用户标识suid可能会在你的计算机上产生一个安全漏洞。在一个封闭的家庭网络里,看起来不会构成什么很大的问题,因为所有的来源都可以很容易追踪得到。但是,即使在家里,我绝对不会在任何不能确定来源的程序上设定替代用户标识,即使有些安装程序建议我这么做。还有,在你的系统里的可执行文件里设置太多的替代用户标识肯定不是什么好主意,这违背了 Unix系统的安全理念。的确,有些程序要求你设置替代用户标识才能正常运行,举个例子比如kpppKDE图形用户界面下的最常用的modem拨号程序)。这是因为他们要求直接访问硬件,一般来说只有root 用户才允许这么做。

 

如果你的系统一直有与性能相关的问题,或者一些"实时硬件" (比如CD刻录机)程序经常崩溃,可以试着关闭一些后台服务程序。在 Redhat Linux下以root用户运行setup,然后关闭那些你不需要的服务程序。更快捷的办法,你可以转换到命令行窗口,把整个图形用户界面关闭。这样,你的计算机的性能肯定大大好于以前的任何时候。

 

对于那些需要或者喜欢Linux作为"唯一"的操作系统(工作站,服务器,办公室桌面电脑,游戏机,多媒体等等),有专门两个 Linux的内核补丁:"低迟延补丁"和"抢先多任务补丁",专门用来有效解决由于系统过载导致的"迟延"问题。

 

 

3.3         "&", "at", "batch""cron" 进行作业调度

3.3.1   怎样在后台执行命令

 

在命令的最后加上& 。举例,以下命令将在X窗口下后台启动icq 客户端程序,所以当icq运行时,我的 X窗口不会被挂住。

 

licq&

 

进程识别号,任务编号(job_number ),显示在屏幕上,在运行其他相关命令的时候你可以使用。相关的命令有:

 

fg job_number

fg=foreground,把后台进程恢复到前台运行,如果该任务已经被停止,将重新启动任务

 

bg job_number

bg=background把前台的进程送到后台运行,如果该任务已经被停止,将重新启动任务。跟命令行后面加 &具有相同效果

 

<CTRL><Z>

把当前正在前台运行的进程送到后台并且停止该进程

 

jobs

列出所有的激活的任务进程

 

kill process_ID

中止进程识别号为process_ID 的进程,可以使用ps命令找到你要中止的进程的识别号

 

为了让一个后台运行的进程在你退出系统后继续运行,可以使用命令nohup(=no hungup), 举例 :

 

nohup make &

 

该命令可能在编译一个很大的程序。

 

3.3.2   怎样在某一特定时间执行命令( 使用at""batch")

 

 

at命令可以让你指定特定的日期和时间来运行某个程序。举个例子,我可以在每天早上七点钟开始在我的 CDROM上播放音乐:

 

at 7:00

cdplay <CTRL><D>

 

在以上例子,我在命令行里输入  "at 7:00"接着按回车。接着,at 命令显示一个 " at> "的提示符,然后我输入 " cdplay"接着按回车,最后,我同时按住 <CTRL><D> 结束输入。如果我接着按回车,另外一个"at> "提示符出现,我可以接着输入那些我希望在早上 7点钟运行的程序。然后在最后输入<CTRL><D><CTRL><D>就象是向当前的输入送一个文件结束符合,告诉输入已经完毕。不要连续按 <CTRL><D>两次,否则你就自动退出系统了。

 

你可以使用以下命令列出当前在任务调度表里的任务:

 

at –l

 

你可以看到那些还在任务调度表里还在等待的程序的清单。

 

如果你改变主意,绝对把某个程序从任务调度表里删除。举例:

 

atrm 8

 

该命令将从任务调度表里删除命令编号为8 的程序

我也可以安排一个程序在稍晚一点的时间运行,比如:

 

at 23:55 12/31/00

startx

 

该命令将在新千年夜晚启动我的X-Windows 系统(20001231日,午夜前5 分钟)。

 

如果你不能运行at 命令,查看一下是否任务调度服务程序(atd)已经被加载(可以使用 root用户运行ntsysv加载)。如果 at命令对root 用户有效但是对于普通用户无效,检查一下是否文件/etc/at.deny是否存在,同时,确认文件 /etc/at.allow不存在。这是所有用户可以运行at 命令的缺省设置。如果你想要只有指定的用户才能够运行at命令,可以生成文件 /etc/at.allow并且把用户的名单加到文件里。

 

对于at命令其他的可选项,运行

 

man at

 

当系统载荷很低的时候,如果你希望在后台运行一个"处理器饥渴型"的任务,你可以选择使用batch 命令。举例,我可以运行setiathome(一个数据分析程序用来帮助寻找外部智能生命, SETI):

 

batch

at>setiathome <CTRL><D>

 

在以上例子里,我在命令行输入batch然后回车,在"at>"命令提示符下,我输入想要在后台运行的程序名称。程序试图立刻运行,但是其实会等到系统载荷小于 0.8的时候才会开始运行。你可以通过检查虚拟文件/proc/loadavg来检查系统载荷:

 

cat /proc/loadavg

 

当批命令完成后,输出结果将会以电子邮件的方式送到我的信箱。

 

3.3.3   怎样设置"cron"

 

cron(一个 Linux的后台进程,经常在夜间运行)在Redhat 系统里是缺省配置。所有你不需要做任何事情,除非你想在系统里加入一些自己的任务,或者想修改一些任务的运行时间表。

 

请注意,要使你系统里的一些功能长期运行正常,cron 可能是不可缺少的。其他和cron关联的比如:

 

bullet 重建locate 命令需要使用的数据库文件
bullet 清除/tmp 目录
bullet 重建命令手册
bullet "翻转"记录文件,比如,丢弃旧的记录,重新命名中间过程记录,产生新的记录等等
bullet 运行其他任务。比如把你最近拷贝的字体加入到系统里面

 

所以,总是把你的Linux 在夜晚关机可能不是什么好的主意。这样可能导致cron根本没有机会来运行任何任务。如果你倾向于在夜晚关机,最好调整 cron在一些其他的时间运行。

 

想了解cron 什么时候被唤醒开始运行它的任务,可以查看/etc/crontab,举例 :

 

cat /etc/crontab

 

你会看到内容大概如下 :

 

# run-parts

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

 

你可以看到有四种不同的cron任务: 每小时,每天,每周和每月。你可以修改修改它,或者加入你自己的任务。以下介绍它是如何工作的 :

 

每列的顺序表示如下:

 

分钟(059),小时(023),日期(131),月份(112),星期(从06分别表示星期天到星期六)。" *"表示任何有效的数值。

 

在以上例子里,"每小时"的任务在时钟的"第一分钟"运行,这相当于每小时发生一次。"每日"的任务发生在每天时钟的402 分,刚好每天一次。"每周"任务发生在星期天早晨402分。"每月"的任务发生在每月第一天的442分。该任务的运行脚本名称放在每行的最后。

 

如果你想要让早上4点的任务在中午执行,只需要把4改成12 就可以了。Cron每分钟被唤醒一次检查是否/etc/crontab已经被修改,所以当你修改完文件后不需要重新启动cron程序。

 

如果你想要增加一个任务到cron里,把运行任务的脚本(或者脚本的连接)放在对应的目录里:/etc/cron.hourly /etc/cron.daily/etc/cron.weekly/etc/cron.monthly

 

以下是/etc/crontab的一个例子,该任务每周运行三次(星期一,星期三,星期五 )

 

02 4 * * 1,3,5 root run-parts/etc/cron.weekly

 

以下是一个新闻组上的例子,显示如何自动用电子邮件发送一个日记文件

 

回复:help in crontab

发信:Dean Thompson <Dean.Thompson@csse.monash.edu.au > 日期: 2001-03-03 16:35

Newsgroups: comp.os.linux.admin,comp.os.linux.networking,comp.os.linux.security

 

> 我该如何在 /etc/crontab文件里设置,让每天的工作记录文件自动发送到信箱abc@abc.com < /var/log

 

你可以试试看以下的例子

 

0 0 * * * (/bin/mail abc@abc.com < /var/log/messages) > /dev/null 2>&1

 

3.4         Shell

3.4.1   什么是Shell? 需要一个不同的Shell?

 

shell是计算机用来解释你输入的命令然后决定进行何种处理的程序。 shell也可以在非交互模式下调用。举个例子,可以把一些要输入的命令预先存放在文本文件里(叫做shell 脚本)然后执行该文件。可以把shell看作是 DOS下面的command.com (命令行解释器),而shell脚本就象是 DOS的批处理文件(*.bat)。和 DOS相比较,shell 的功能要先进和丰富得多。

 

Linux 系统下有几个不同的shell(如果你全部安装):

 

bash          "Bourne Again" shell

sh            Bourne shell,在很多 UNIX下是标准的shell

csh           C shell,和 C编程语言语法相近,在大部分UNIX下有效

pdksh        public domain Korn shell

tcsh          微型 C shell, 在小的系统里经常使用

sash          单机版本的 shell,当文件库无效的时候可以使用

ash, zsh     可能还有更多其他版本

 

Linux系统下缺省的 shellbash(你的计算机上应该也是),这是一个非常出色和标准的 shell,象我这样的Linux 新手实在想不出有什么理由要修改它。bash 不仅对UNIX下应用广泛的Bourne shell 后向兼容,而且合并了其他shell的一些非常有用的特性。从一个新手的角度来看,出于历史原因,一些既存的 shell脚本可能要求特定的shell 程序才能够运行,为了保证shell脚本充分的后向兼容性, Linux保留了不同类型的shell 。一些shell可能很有用,比如,如果你准备给一些小型"嵌入式设备"写程序,那么你可能需要 tcsh(微型C shell )。

 

你可以检查你现在正在运行的shell :

 

echo $SHELL

 

如果你想要试一下其他类型的shell ,举个例子 :

 

tcsh

 

该命令将启动微型C shell 。结束使用,输入:

 

exit

 

这将回到你原来的shell (在第一个shell下输入exit 会把你退出系统)。你可以通过显示环境变量"shell level "(shell层次)看看你当前环境下的shell 的堆栈:

 

echo $SHLVL

 

在以上的命令里,  "$"表示"扩展shell 环境变量", " SHLVL"是"变量名","echo"是屏幕输出命令。

 

每个用户的缺省shell 在文件/etc/passwd最后一个字段指定。如果你真的想要修改它,(要求 root用户)把你想要的shell替换文件里的  "/bin/bash "。

 

3.4.2   怎样定制自己的Shell

 

 

在我的计算机上,命令提示符看起来是这样的:

 

[stan@marie stan]$ _

 

在这里, "stan "是用户名,"marie"是计算机名,第二个" stan"是我当前的工作目录,而"_"代表光标。

 

提示符通过环境变量PS1 来设置。可以使用以下命令显示当前设置:

 

echo $PS1

 

提示符的系统范围(对于系统里的所有用户有效)的设定在文件/etc/bashrc 里,可能包含以下的行:

 

PS1="[\u@\h \W]\$ "

 

要定制提示符,我可以编辑文件/etc/bashrcroot用户)然后在两个引号之内输入任何你想要的文本。以下是一些我可能会使用的特别代码:

 

\u     -      当前用户的用户名( =$LOGNAME

\h     -      运行 shell的计算机名(hostname

\H     -      完整的计算机名

\W     -      当前工作目录名

\w     -      当前工作命令全路径名

\$     -      对于普通用户显示 $,对于超级用户显示#

\!     -      当前命令的历史编号

\#     -      当前命令编号(在当前的 shell下运行的命令)

\d     -      当前日期

\t     -      当前时间 ( 24小时制)

\T     -      当前时间 ( 12小时制),bash 2.0有效

\@     -      当前时间 ( AM/PM格式),bash 2.0有效

\s     -      shell的类型

\a     -      告警声音

\j     -      用户的任务数

\n     -      新行

\\     -      反斜杠

\[     -      不可打印字符开始标志

\]     -      不可打印字符结束标志

\nnn   -      ASCII字符对应的八进制数值

$(date) -     date(输出当前日期)命令输出或者其他的命令

 

 

以下是一个关于如何加彩色的例子。更详细的信息参考后面一节。

 

PS1="\[\033[1;32m\][\u@\h \W]\$\[\033[0m\] "

 

这里还存在有  "第二层"输出提示符,在环境变量里是PS2。当需要附加输入时, shell使用"第二层"输出提示,在我的系统上"第二层"输出提示符是"> "。我不是很在意"第二层"输出提示符,尽管我可以使用修改PS1相同的办法修改 PS2。除此之外,还有PS3 PS4,但是非常少见。

      

3.4.3   设置文本终端的颜色

 

文本终端的颜色可以使用"ANSI 非常规字符序列"来生成。举例:

 

echo -e "\033[44;37;5m ME \033[0m COOL"

 

以上命令设置背景成为蓝色,前景白色,闪烁光标,输出字符"ME",然后重新设置屏幕到缺省设置,输出字符"COOL" 。"e"是命令echo的一个可选项,它用于激活特殊字符的解析器。"\033"引导非常规字符序列。" m"意味着设置属性然后结束非常规字符序列,这个例子里真正有效的字符是"44;37;5" 和"0 "。

 

修改"44;37;5"可以生成不同颜色的组合,数值和编码的前后顺序没有关系。可以选择的编码如下所示:

 

编码    颜色/动作

0       重新设置属性到缺省设置

1       设置粗体

2       设置一半亮度(模拟彩色显示器的颜色)

4       设置下划线(模拟彩色显示器的颜色)

5       设置闪烁

7       设置反向图象

22      设置一般密度

24      关闭下划线

25      关闭闪烁

27      关闭反向图象

30      设置黑色前景

31      设置红色前景

32      设置绿色前景

33      设置棕色前景

34      设置蓝色前景

35      设置紫色前景

36      设置青色前景

37      设置白色前景

38      在缺省的前景颜色上设置下划线

39      在缺省的前景颜色上关闭下划线

40      设置黑色背景

41      设置红色背景

42      设置绿色背景

43      设置棕色背景

44      设置蓝色背景

45      设置紫色背景

46      设置青色背景

47      设置白色背景

49      设置缺省黑色背景

 

其他有趣的代码还有:

 

\033[2J         清除屏幕

\033[0q         关闭所有的键盘指示灯

\033[1q         设置"滚动锁定"指示灯  (Scroll Lock)

\033[2q         设置"数值锁定"指示灯  (Num Lock)

\033[3q         设置"大写锁定"指示灯  (Caps Lock)

\033[15:40H     把关闭移动到第15行,40

\007            发蜂鸣生beep

 

想要了解更多,使用命令 man console_codes

 

3.4.4   在文本模式或 X模式控制台下,如何打印符号

 

以下描述的是如何快速访问PC扩展字符集(codes 128-255)的办法,它在 PC世界里非常通用:微软的WindowsDOS(如果你安装了ANSI的驱动程序),任何文本模式的Linux应用程序(包含shell 命令行)。

 

它是这样工作的。首先确认<Num Lock>是打开的,接着按住<ALT> 键。当<ALT>被按住的时候,在小的数字键盘上输入:0181。现在,释放<ALT>接着希腊字母mu"µ"就出现了。以下是一个完整的清单:

 

 

现在,如果我真的想要有点与众不同,我可以给一个文件命名:µm·°C±b³。微软Windows, DOSUnicode的字符集和上面显示的有一些小差别,但是有用的"核心部分"是一样的。如果你想要了解详细的ANSI的信息,参考: http://www.hclrss.demon.co.uk/demos/ansi.htmlLinux使用Unicode标准。

 

XWindows下,以上的组合键不能正常工作,但是我可以使用:

 

kcharselect&

 

或者

 

gcharmap&

 

选择一个Unicode然后复制到我的应用程序里。不是所有的Unicode现在都有效,但是大部分是有效的。在以下链接,你还可以找到一些通用的 Unicode编码(数值)和它们对应的html符号。

http://www.hclrss.demon.co.uk/demos/ent4_frame.html.

 

3.4.5   如何编写简单的Shell脚本(Script)文件

 

新建一个文本文件包含所需要的脚本。举例,我会使用pico编辑器写一个脚本用来运行程序tar ,带上必要的可选项可以用来解压从因特网下载下来的*.tar的文件(我好像总是记不住tar的所有参赛)。我决定把我的脚本名称叫做"untar":

pico untar

 

因为在我的当前工作目录里untar文件不存在,所有pico文本编辑器自动创建这个文件,现在,我输入以下内容:

 

#!/bin/bash

echo this is the script file $0

echo untarring the file $1

# this calls tar with options -xvzf (extract,

# verbose, filter through gzip, input filename)

tar -xvzf $1

 

我使用<CTRL>O保存这个文件,然后<CTRL>X退出。

 

脚本的第一行,以"#!"开始是特别的提示-它告诉shell应该用哪一个程序来解释我的脚本。在这个例子里,我使用 bash shell /bin/bash。第一行必须使用"#!"开头,否则脚本不会运行(系统认为是一个文本文件)。其他以"#"开始的行是注释行只是给作者和读者使用的,计算机将跳过这些行。

 

在以上脚本里,参数$0, $1, $2…是传递到脚本里面的参数。举个例子,如果我运行我的脚本名"myscript "带七个参数如下:

 

myscript a b c d e f g

 

那么,参赛$0就是myscript, $1就是a, $2 就是b$3就是c,依此类推。

 

脚本的第二行和第三行,echo命令输出所有在它后面同一行上的文本,然后扩展在脚本里对应的参数$0$1。第四行和第五行是我写的注释文本,提醒我在这个脚本里要做的事情。只有最后一行是真正起作用的。

 

一旦脚本已经写好,我把文件属性改成对文件拥有者是"可执行"的:

 

chmod u+x untar

 

然后我的脚本就可以这样运行了:

 

./untar my_tar.tar.gz

 

Liunx脚本的确非常丰富,灵活,功能强劲,还可能有点复杂。然而,对于日常任务编写一些简单脚本,它并不需要什么特别高深的知识。你可以把一些要用到的命令放在一起,一个接一个,输入到文件里。我使用脚本很频繁是因为我太懒了,不想一次一次的输入相同的命令。

 

一个最简单的方法,可以把一组命令放在文本文件里然后使用source命令传递给shell 让它直接运行:

 

source my_file

 

这个时候就不需要在文本第一行加上"#!"的标志了。

 

3.4.6   引号的含义

 

一般来说,以下字符对于shell有特殊的含义:

 

\ ' " ` < > [ ] ? | ; # $ ^ & * ( ) = <Space> <Tab> <Newline>

 

这里有四种不同的符号:反斜杠(\),单引号('),双引号(") ,反向单引号(`)

 

bullet 反斜杠(\)表示:关闭后面字符的特殊含义
bullet 单引号(')表示:关闭在两个单引号之间所有字符的特殊含义
bullet 双引号(")表示:关闭在两个双引号之间所有字符的特殊含义除了$ ` \
bullet 反向单引号(`)表示:告诉shell 首先运行两个反向单引号之间的命令,然后把得到的结果再传递给两个单引号之外的命令。同样的功能也可以通过"$command"命令来实现,而且可能会更方便。

 

举个例子,我可以创建一个奇怪的目录名叫做"*"通过使用"\"或者" '"符号:

 

mkdir \*

mkdir '*'

 

这屏蔽了"*"对于shell的特别含义。如果没有"\ ","*"意味着当前目录下所有文件。

 

3.4.7   输入输出重定向

 

有三个最重要的输入输出流:标准输入(stdin),标准输出(stdout),标准错误 (stderr)。它们对于控制台("控制台"指的是键盘用于输入,屏幕用于输出)来说是缺省的,但是它们可以被重定向。

 

重定向标准输出,可以使用">"符号,举例:

 

dir my_dir > filelisting.txt

 

将把dir命令的标准屏幕输出重定向到文本文件 filelisting.txt文件里,所以屏幕上没有任何输出。这个文件可以用来编辑(比如使用 pico文本编辑器)或者合并到其他的文件里。

 

重定向标准错误,可以使用结构"2>",举例:

 

dir my_dir 2> errorlisting.txt

 

以上命令将送标准输出到屏幕上,如果没有错误信息,将没有任何信息写到errorlisting.txt文件里。如果出错,则没有什么东西输出到屏幕,而文件 errorlisting.txt将包含错误信息。错误信息有可能是这样的:

 

dir: my_dir:  Permission denied

 

最后,我也可以把标准输出和标准错误一起输出到同一个文件里,

 

dir my_dir > file_and_error_listing.txt 2>&1

 

以上命令先重定向标准输出到文本文件里,然后再重定向标准错误到和标准输出同样的位置。它如何实现可能看起来有点古怪,但是是可行的。

 

在以上的例子里,如果重定向的文件已经存在,该文件会被覆盖。如果你要追加到该文件的末尾,可以使用">>"符号,以上的例子就变成:

 

dir my_dir >> filelisting.txt

dir my_dir 2>> errorlisting.txt

dir my_dir >> file_and_error_listing.txt 2 > &1

 

如果你对"2>"感到很迷惑,这里有一个简单的办法可以帮你理解,标准流有标准的解析器:"0 "代表标准输入,"1"代表标准输出,"2"代表标准错误。

 

dir my_dir > file.txt

 

是以下命令的简写方式:

 

dir my_dir 1 > file.txt

 

那么以下命令就是用来输出标准错误:

 

dir my_dir 2 > file.txt

 

还有,你还可以使用符号"|"(管道命令)把一个命令的标准输出送到另外一个命令的标准输入。在以下这个标准的例子里,dir 命令的标准输出通过管道输入到命令more里(输出满屏的时候自动暂停):

 

dir | more

 

你还可以使用"tee"命令把标准输出同时写到文件和屏幕,

 

dir | tee filelisting.txt

 

tee是"T型连接器"的模拟音,在管道中的主要的用途是分流。

 

这个部分这样都用来讲述标准输出重定向,对于标准输入重定向不像标准输出重定向那么有用,但是它可以使用以下方式实现:

 

cat < my_file

 

还有一种叫做"直接插入式"的标准输出,可以通过"<<"来实现。不要管它了,看起来对我没有什么实际用处。不过,如果你真的想知道,这里有一个例子(这里" >"式第二个提示符)

 

cat << my_marker

> my_line_from_the_keyboard

> another_line_from_the_keyboard

> my_marker

 

除了重定向到常规文件和"过滤器"之外(如以上的例子所示),你还可以重定向到设备和其他特殊文件。看下面这些例子。

 

重定向到设备文件的例子。以下命令将显示文件列表到第四个文本终端:

 

dir > /dev/tty4

 

以下是一个重定向到一个特殊的FIFO(先进先出)文件的例子。该命令送信息 "you are lucky"到叫做"lucky"的ICQ用户UIN 7777777 (假定你已经用你的ICQ程序连接到ICQF服务器上了)

 

echo message 7777777 "you are lucky" < ~/.licq/licq_fifo

 

以上的例子能够工作是因为在你licq目录下的文件"licq_fifo"是一个特别的 FIFO序列文件。以上这个例子,对比于在图形用户界面下的ICQ程序有什么特别有用的地方吗?举个例子,你可以写一个短的脚本带上多个信息给你的那些ICQ伙伴们:

 

#!/bin/bash

echo Messaging UIN: $1 Message: $2 Times: $3

# The next command puts puts your licq in the status "on-line, invisible".

echo 'status *online' > ~/.licq/licq_fifo

c=0

while [ $c -le $3]

do

echo message $1 $2 > ~/.licq/licq_fifo

c=`expr $c + 1`

echo $c " "

done

echo 'status offline' > ~/.licq/licq_fifo

echo "all done"

 

 

这个例子利用了licq通信模型(FIFO文件)和简单的文件重定向功能,给你一个关于如何 "自动化" licq的主意。

 

3.4.8   Shell的特殊字符(metacharacters)

 

一般来说,这些字符对于shell有特别的含义:

 

\ ' " ` < > | ; <Space> <Tab> <Newline> ( ) [ ] ? # $ ^ & * =

 

以下是这些字符的含义:

 

\ ' " ' 主要用来注释,前面已经描述过 (参见 3.4.6)

 

< > 主要用来输入和输出重定向

 

| 是管道命令,管道左边的标准输出是管道右边的标准输入

 

; 用于间隔在同一命令行上的几个命令

 

<Space> <Tab> 间用于分开命令的字符和单词

 

<Newline> 完成一条命令或者一组命令

 

( ) 用于封装需要使用不同的shell启动的命令, 比如 ( dir )

 

{ } 用于封装要用当前shell启动的一组命令,比如 { dir },需要空格间隔

& 使当前命令在后台运行(有它自己独立的进程),所以下一条命令不需要等待前一条命令结束才能开始。

 

* 当搜索文件时,它匹配除了以"."开头的所有文件

 

?当搜索文件时,它匹配任何单个字符

 

[ ] 当搜索文件时,它匹配任何在[]里面的单个字符

 

&& 是用于连接两个命令的"与操作",

 

command1 && command2, 只有当command1退出状态为0时(没有错误), command2才会被执行。比如, cat file1 && cat file2 只有当file1正常显示时, file2才能被显示。

 

||  是用于连接两个命令的"或操作"

 

command1 || command2, 只有当command1退出状态非0时(有错误),command2 才会被显示。比如:cat file1 || cat file2 只有当显示file1出错时,file2才能被显示

 

= 指定值给变量

 

举例,命令me=blahblah设定值"blahblah" 给变量"me",我可以输出变量名:

 

echo $me

 

$      预处理扩展变量名

 

变量可以使用"="来设定值,也可以通过预先变量设定来设置

 

$0     被执行的shell脚本的名称

$#     按位置对应的命令输入参数, $1第一个参赛, $2第二个参数, $3 第三个参数直到$9

$*     扩展所有的位置参数给命令

$@     扩展所有的位置参数给命令,但是当"$@"使用时,参数个别标注

 

3.5         如何安装软件包(Package)rpm 软件包管理器

3.5.1   如何安装从Internet下载的程序?

 

答案基于你所下载的是哪一种软件包.如果你下载的程序是Red Hat 二进制形式软件包*.rpm (如果假定一个选择, 我选择这种格式), 你能避免很多安装上的问题.

RedHat 二进制形式程序包的安装

如果我想安装的程序是RedHat 二进制形式软件包 (*.rpm), 我能使用命令行或 GUI 工具.我喜欢用命令行因为它运行快而且不出错. Red Hat 软件包管理器安装程序被称作 rpm . 首先我要阅读软件包内容的信息(选项):

rpm -qpi my_new_file.rpm

该行查询(模式"q", 必须在破折号后第一个字母)尚未安装的软件包 (选项"p") 以便显示该软件包所包含的信息 (选项 "i") .目如果我想安装该程序, (作为超级用户)运行


rpm -ihv my_new_file.rpm

上面的命令安装了该组件.运行
rpm来安装该组件(模式 "i",必须是在破折号后第一个字母), 此时屏幕上显示比平常更多的信息 (选项"h"=显示 "hashes" 来展现解包过程, 选项"v"  =详细).  软件包内容放到了它们所在的目录下 (rpm 知道它们的位置). 安装后, 准备运行, 我得知道可执行文件的名字和位置. 如果找不到可执行文件, 下面一行列出了软件包所包含的所有文件和它们所在的目录:

rpm -qpl my_new_file.rpm

该行查询(模式"q")尚未安装的软件包 (选项"p") 以便显示该软件包所包含的所有文件清单( 选项 "l").


调用
rpm GUI 前端界面是: gnopro (旧版本, 导致 RH6.0 有些混淆, 但新版本已改进), kpackage (用于更新的版本), 老的 glint (很慢 ,用于 RH5.2).

Troubleshooting. rpm被认为是智能软件包管理器 . 如果安装失败, 我可以读错误信息,并能知道下一步所要做的事:

(1) 安装失败是由于我有相同软件包的早期版本且版本冲突. 解决方法:不安装, 仅需升级该软件包.

rpm -Uvh my_new_file.rpm

(2) 安装失败是因为须首先安装另一个软件包.我得找到这个缺少的软件包并安装它, 然后在尝试安装该套件. 在下面特殊的例子里, 我可以选择忽略缺少的附件(我真的知道我正在做的会导致软件发生故障):

rpm -ivh --nodeps my_new_file.rpm

或甚至可能是

rmp -ivh --nodeps --force my_new_file.rpm

TARBALL源代码 中安装

 

如果我从网上所下载的是一个已压缩的tarball(*.tar.gz or *.tgz ) 形式的Linux 源代码,安装步骤比二进制的rpm更长更棘手.我作为超级用户来安装该程序.

 

首先,我改变我当前的工作目录到 /usr/local  :

cd /usr/local

其次
我将我从网上下载的 tarball解压:


tar -xvzf /home/the_dir_where_the_tarball_is/my_tarball.tar.gz

这选取了 (选项 "x") *.tar.gz (or *.tgz) tarball的内容, 解压它 (选项 "z"),同时给我比平常更多的信息 (选项"v" = 详细). 请注意选项"f" 是指"file", 所以字母"f"后面要紧跟着文件名.  Tarball的内容被释放到在我的当前目录下的由
tar 创建的子目录里. 典型的例 /usr/local/.   tarball 知道新的子目录的名字.

如果 tarball 未被压缩(比如, *.tar), 我可以用:

tar -xvf /home/the_dir_where_the_tarball_is/my_tarball.tar

第三,  我要知道新目录的名称, 然后用
cd 进入:

dir
cd the_new_program_subdir

因为有些目录的名字很长, 我使用autocompletion 选项来节省键盘输入时间我只要输入头几个字母再按下 <TAB> .

第四, 通过执行下面的三条命令能编译大多数程序:

 

./configure
make
make install

上面的命令要花点时间完成(1分钟 ?0.5小时?). 如果上面命令的任意一个运行失败, 可以读README INSTALL 或任何该程序所提供的信息. 一些程序要求环境的定制 (如路径的定义)或额外库文件的安装, 或其它.有时这是痛苦的事.很简单的程序可能不需要"./configure" / "make install" 步骤, 在此情况下"make"将单独工作.

第五, 如果运行正常, 我可以发现我刚刚编译的新的可执行文件.当运行以下命令时,该可执行文件的名字显示绿色:

 
ls --color

现在, 我能运行这个可执行文件, 例如:

./the_executable

一些程序自动将可执行文件安装到/usr/local/bin 目录下,所以我可以试着:

/usr/local/bin/the_executable

第六,  如果我想更频繁运行这个程序, 我从/usr/local/bin 目录创建一个到该可执行文件的软连接:

cd /usr/local/bin
ln -s /usr/local/the_new_program_subdir/the_executable .

这种方式,使可执行文件(实际是到该文件的软连接)在我设置的路径中. 只需简单输入其文件名即可运行(不需输入到该文件的全路径 ). 一些程序安装了可执行文件(或一个连接)"bin" 目录下, 在此情况下你能略过最后一步。



RPM 软件包源代码安装


也有作为"rpm 源代码" 的软件包. 正如在本章开始部分所描述, 它们要求用"rpm" 工具对*.rpm  软件包进行安装. 但是因为 "rpm" 安装了源代码(典型地使用 C 语言写的源代码),我需要通过执行相同的"./configure ;  make ; make install"顺序编译源代码 ,正如从 tarballs源代码中安装一样 (参见前面的答案).