1、/etc/inputrc
通过设置INPUTRC环境变量(参见/etc/profile文件),其作用主要定义或者改变一些功能键的定义,从而更好地使用命令行,通常情况下INPUTRC环境变量指向 /etc/inputrc文件,只要编辑/etc/inputrc文件,以及利用Tab键的命令补全功能,就可以实现类似于MSDOS的DOSKEY的功能。
以Redhat 7.3为例来说明,使用的bash shell版本号为2.0.5。你可以根据自己的需要定制与修改此文件,如想了解更多的内容,可以参阅man bash文档。
定制/etc/inputrc文件内容如下:
set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
set show-all-if-ambiguous On
"e[1~": beginning-of-line # home
"e[2~": insert-last-argument # insert
"e[3~": delete-char # delete
"e[4~": end-of-line # end
"e[5~": backward-kill-word # page up
"e[6~": kill-word # page down
# (F1 .. F5) are "e[[A" ... "e[[E"
"e[18~": history-search-forward # F7
"e[19~": history-search-backward # F8
具体修改说明如下(注以下[]中的内容为所按的键):
set bell-style none
关闭计算机小喇叭发出的声音。
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
这几行主要是实现命令行上实现汉字的输入以及显示。比如想输入汉字的文件名等等。
set show-all-if-ambiguous On
这一行主要是使命令补全的功能更好的发挥。许多Linux初学者并不知道这个功能,就是使用[Tab]键,能够减少键盘的敲打以及拼写错误。比如当前你想执行ifconfig命名,你输入if后按[Tab]键两次,就会出现所有以if开头的命令,文件名和目录名也可以使用这个方法输入,当打开上述命令后可以使用[Tab]键,仅仅需要按一次,这样更加方便与快捷。
"e[1~": beginning-of-line # home
"e[2~": insert-last-argument # insert
"e[3~": delete-char # delete
"e[4~": end-of-line # end
"e[5~": backward-kill-word # page up
"e[6~": kill-word # page down
这几行主要是使命令行编辑方便,[home]、[delete]、[end]键保持原意,意指移动到命令行的开始、删除一个字符、移动到命令行尾。
[insert] 键被定义为插入上一个命令的最后一个参数。比如执行如下命令:
$ mount /mnt/cdrom
$ cd[space][insert]
# 相当于 执行 cd /mnt/cdrom
可以试着按[insert]键几次看看会有什么出现内容.
[Pageup]和[PageDown]键定义为向前和向后删除单词。
"e[18~": history-search-forward # F7
"e[19~": history-search-backward # F8
[F7]和[F8]定义为命令历史查找功能,有点向MSDOS的DOSKEY功能类似,比如前面使用过mount命令,再次输入mount后按[F8]会调出先前使用的命令,特别是当命令非常长参数非常多的时候。
二.安装bash-completion
如果经常你使用[tab]键命令补全功能,就会发现它的不足之处,你可以发现它不能根据具体的需要或者命令补全所需要的参数与文件或者目录。例如你执行cd [tab],系统会将文件与目录一起显示出来,而实际上这时你仅仅需要显示文件类型为目录。bash从2.05版开始,已经加入命令complete内部命令,从而能够使用复杂的命令行接口,通过一个复杂的脚本bash_completion实现可编程的补全程序,减少系统管理员日常维护工作,减少差错提高工作效率。
具体操作如下:
1. 下载最新的bash-completiton脚本,检查bash的版本号【执行bash --version】,如果版本低于2.0.5最好升级bash.
http://www.caliban.org/files/bash/bash-completion-latest.tar.gz
http://www.caliban.org/files/redhat/RPMS/i386/bash-2.05-51.i386.rpm
2. 安装
# rpm -Uvh bash-2.05-12.i386.rpm
# tar xzvf bash-completion-latest.tar.gz -C /tmp
3. 仔细阅读bash_completetion目录下的README文件,修改/etc/bashrc文件,在行尾加入如下命令:
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
if [ "$PS1" ] && [ $bmajor -eq 2 ] && [ $bminor '>' 04 ]
&& [ -f /etc/bash_completion ]; then # interactive shell
# Source completion code
. /etc/bash_completion
fi
unset bash bmajor bminor
4. 拷贝bash_completion文件:
# cp /tmp/bash_completion/bash_completion /etc
注销再重新进入后,你就会发现许多命令在使用命令补全时都会发生一些变化。
通过以上的修改,你会发现在命令行上使用Linux,同样高效与快捷,减少了许多不必要的错误。
2、/.bash_profile ~/.bash_login ~/.profile
这三个文档有一个就可以了,用来定义个人化的路径与环境变量,bash启动时,先读取~/.bash_profile,如果找不到,就去读取 ~/.bash_login,如果还找不到,那就读取~/.profile。
3、~/.bashrc
我们一般把自己的个性化定制环境变量写在这里,如命令别名、路径等等。这个文件在每次执行shell script的时候都会被重新使用一遍,所以是最完整的的。而上头的~/.bash_profile 则只有在登入的时候会被读取一次。
4、~/.bash_logout
这个文件记录了当我注销bash后,系统再帮我做完什么动作后才离开。预设情况下,注销bash只是帮我们清掉屏幕讯息,不过我们也可以将一些备份或者其他你认为重要的工作写在这个文件中(例如清空暂存盘)。
5、/etc/login.defs
与密码还有 UID/GID 有关的设定档则是在 /etc/login.defs 里面, 这个档案有点像这样:
MAIL_DIR /var/spool/mail <==使用者预设邮件信箱放置目录
PASS_MAX_DAYS 99999 <==/etc/shadow 内的第 5 栏
PASS_MIN_DAYS 0 <==/etc/shadow 内的第 4 栏
PASS_MIN_LEN 5 <==密码最短的字符长度,建议可以改到 6 以上
PASS_WARN_AGE 7 <==/etc/shadow 内的第 6 栏
UID_MIN 500 <==使用者最小的 UID,意即小于 500 的 UID 为系统保留
UID_MAX 60000 <==使用者能够用的最大 UID
GID_MIN 500 <==使用者自订群组的最小 GID,小于 500 为系统保留
GID_MAX 60000 <==使用者自订群组的最大 GID
CREATE_HOME yes <==在不加 -M 及 -m 时,是否主动建立使用者家目录?
看到这个档案后,您应该晓得的是,为何新建的使用者的 UID 都会大于 500 了吧? 而且某些版本的 distributions (例如 SuSE server 9) 则是将 UID_MIN 设定为 1000 , 所以,他的一般身份使用者的 UID 就会从 1000 起跳啰~ 那如果我现在新增一个使用者,这个使用者的 UID 会是多少?答案是:『 如果 /etc/passwd 里面的账号所属的 UID 没有大于 /etc/login.defs 里头的 UID_MIN (在本例中是 500)时,则以 UID 500 来作为一个新账号的 UID。 如果 /etc/passwd 已有大于 500 以上的 UID 时,则取 /etc/passwd 内最大的那个 UID + 1 作为新设帐号的 UID。』而如果我是想要建立系统用的账号,所以使用 useradd -r sysaccount 这个 -r 的参数时,就会找『比 500 小的最大的那个 UID + 1 』就是了。 ^_^
6、PAM模块
PAM 模块:/etc/nologin, /etc/securetty
当一个使用者想要登入 Linux 主机时,他受到什么限制呢?我们说, 他除了必须要通过 /etc/passwd 及 /etc/shadow 的验证并取得相关的权限数据, 最后获得一个 shell 之外,事实上,他在登入系统之前,就得要通过 PAM (Pluggable Authentication Modules, 嵌入式模块) 的验证才行。
PAM 模块的用途非常的多,除了可以在使用者登入时进行身份的验证之外, 也可以辅助一些应用程序的验证之用喔!举例来说,我们前面提到的密码修改程序『 passwd 』 ,当我们执行密码修订的时候,这个程序不是会告诉我们您输入的密码是否合于规范吗? 如果是记录在字典当中的密码,或者是与账号相同的密码,那么就会被 PAM 模块打回票, 也就无法通过验证了!
那么 PAM 怎么运作呢?我们同样以 /usr/bin/passwd 这支程序来作为简单的说明好了:
1. 使用者开始执行 /usr/bin/passwd 这支程序,并输入密码;
2. passwd 开始呼叫 PAM 模块,PAM 模块会搜寻 passwd 程序的 PAM 相关设定档案, 这个设定档一般是在 /etc/pam.d/ 里面的与程序同名的档案,所以,在本例中, PAM 会去搜寻 /etc/pam.d/passwd 这个设定档;
3. 经由 /etc/pam.d/passwd 设定文件的数据,取用 PAM 所提供的相关模块来进行验证;
4. 将验证结果回传给 passwd 这支程序,而 passwd 这支程序会根据 PAM 回传的结果决定下一个动作 (重新输入新密码或者通过验证!)
这个过程提供我们几个重要的信息:
•• PAM 的设定档放置在 /etc/pam.d/ 这个目录中;
• 至于更多的环境相关设定则放置在 /etc/security/* 内;
• PAM 是透过自己提供的相关模块来进行验证,模块放置在 /lib/security/* 内。
至于 PAM 相关模块的运作,有兴趣的话,您可以前往您 Linux 主机的: /usr/share/doc/pam* 目录去瞧一瞧,里面有相当多丰富的信息可以提供给你参考。 我们这里仅就使用者登入相关的模块来进行一些简单的说明而已喔。
• PAM 的设定文件设定范例:
反正 PAM 模块就是让程序呼叫用的,而当程序呼叫时, PAM 就会利用相对应的设定档来进行一些验证就是了。我们还是举 passwd 为例好了, 如果你去观察一下 /etc/pam.d/passwd 的内容时,他是这样的:
[root@linux ~]# cat /etc/pam.d/passwd
#%PAM-1.0
auth required pam_stack.so service=system-auth
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
基本上,在这个档案内,每一行都是一个动作,而每个动作都分为四个字段,分别是:
验证的类别 验证的控制标准 使用的PAM模块 该模块的能使用的参数
验证的类别 (Module type) 共分为四种类,分别说明:
• auth 这种类别主要用来检验使用者的身份验证,所以这种类别通常是需要密码来检验的。
• account 这种类别则主要在检验使用者是否具有正确的使用权限,举例来说,当你使用一个过期的密码来登入时, 当然就无法正确的登入了。
• session 这种类别主要在管理当使用者正确的使用该程序时的环境设定。举例来说,我们登入 Linux 其实使用的是 /bin/login 这个程序的相关功能的,所以,当实际登入后,在操作 shell 的过程中,都是受 session 这种类别的设定所控制的喔!另外,如果使用 session 这种类别时, 则该程序在正式使用之前与使用结束之后,都会有相关纪录被记到登录文件当中喔!
• password 至于这种类别,则主要在提供验证的修订工作,举例来说,就是修改/变更密码啦!
那么『验证的控制标准(control flag)』又是什么?简单的说,他就是『验证通过的标准』啦! 总共也有四种方式,分别是:
• required 当模块设定为这种控制标准时,该模块的验证必须要成功,否则就会回传一个 failure 的讯息。 不过,不论此一动作的模块是否成功,接下去的模块都还会继续动作! 而若有 failure 的讯息时,也会在后续的动作都进行完毕之后,才会回传给原程序。 比底下的 requisite 还要优秀的地方,在于该模块底下的动作可能具有登录文件纪录 (log) 的举动,则错误的讯息才会被纪录起来喔!
• requisite 当模块设定为 requisite 时,该模块的认证要求同样的需要成功才行。 不过,如果该模块没有通过验证,那么 PAM 会『立刻』回报程序一个 failure 的值, 也就是说,若该次动作的模块后续还有其它模块时,其它模块的动作将不会被启用。
• optional 这个模块控件目大多是在显示讯息而已,并不是用在验证方面的。
• sufficient 这个模块控制标准也挺有趣的,相对于 requisite 是『发生错误时,立刻回报原执行程序 failure , 并且中断 PAM 的运作』, sufficient 则是『顺利通过验证时,立刻回报原程序通过的讯息, 并且中断 PAM 的运作』。呵呵!完全相反喔!
至于PAM 的模块方面,目前我们的 FC4 提供的 PAM 模块真的够多了, 这些模块实际上都放置在 /lib/security/ 目录中,FC4 相关的 PAM 说明文件则放置在 /usr/share/doc/pam-*/* 里面,您可以根
据每个不同的模块去讨论他的用途, 鸟哥在这里仅针对我们登入时所使用的 login 这个程序的 PAM 设定文件,也就是 /etc/pam.d/login 这个档案的内容来稍做说明:
[root@linux ~]# cat /etc/pam.d/login
#%PAM-1.0
auth required pam_securetty.so
auth required pam_stack.so service=system-auth
auth required pam_nologin.so
account required pam_stack.so service=system-auth
password required pam_stack.so service=system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_stack.so service=system-auth
session optional pam_console.so
# pam_selinux.so open should be the last session rule
session required pam_selinux.so multiple open
在我们登入 Linux 的时候,使用到的 login 这个程序时,他使用的 PAM 设定档大多是 required 的控制标准,所以必须要通过上述的几个 PAM 模块的验证后,才能够判定是否登入 Linux 。 需要留意的是,我们会看到 session 的模块类型,这表示我们在实际使用 Linux 的资源之前,以及注销 Linux 主机后,相关的数据都会被纪录到登录文件当中。 嘿嘿!所以啰,如果您仔细的看过 /var/log/messages 与 /var/log/secure , 就能够发现你的一举一动其实是有被纪录下来的喔! ^_^ 另外,在上面表格当中的模块中,比较有趣的是被鸟哥注明特殊字体的部分, 这两个模块: pam_securetty.so 及 pam_nologin 是挺有趣的喔! 我们就额外来谈一谈这两个关于登入环境的验证模块吧!
• /etc/securetty
这个 pam_securetty 模块是干嘛用的?其实他最主要的功能就是在预防不安全的登入环境啦! 而且主要是针对 root 这个使用者的身份喔! 这个模块在被启用时,会去读取 /etc/securetty 这个档案, 我们『可以将被认定是安全的终端机 (terminal) 环境写入这个档案中, 则 root 仅可以在那几个终端机环境下登入』的啦! 一般来说,我们会认定在主机前面的环境是安全的,而使用网络登入的环境则比较危险。 因此,一般 /etc/securetty 的内容大多是这样:
tty1
tty2
tty3
tty4
...
而没有 pts/0 这类的网络登入的终端接口。这也就是说, root 仅能经由 tty1 这种终端机登入的啦!支持 login 程序的软件有 telnet 服务与本机前面的 tty1~tty6 的 login, 这也是我们提到的,为何使用传统的 telnet 联机主机联机到 Linux 时,预设无法使用 root 身份登入的主要原因啰。
那么如何克服呢?其实也很简单啦,就将这个模块的验证移除即可! 主要有两种方式:
• 将 /etc/pam.d/login 内,关于 pam_securetty.so 模块的那一行批注掉;
• 将 /etc/securetty 这个档案移除。
如此一来,当我们使用 telnet 联机到 Linux 主机时,就能够直接使用 root 的身份登入了。 不过,鸟哥不建议这么做喔!不过或许您又会问啦,那为什么我使用 ssh 联机时, 就可以直接使用 root 登入呢?呵呵!这是因为 ssh 没有用到这个模块ㄇㄟ! 不相信吗?仔细自己去查阅一下 /etc/pam.d/sshd 就知道啦! ^_^。
• /etc/nologin
那么 pam_nologin 又是在搞什么咚咚啊?其实,这个模块也是在控制使用者登入用的。 不过,这个模块只针对一般身份使用者有效,对 root 是没有效果的。这个模块必须要与 /etc/nologin 搭配使用,注意喔,是 /etc/nologin ,而不是 /etc/nologin.txt , 这两个档案的用途是不相同的喔! ^_^。 当 /etc/nologin 档案存在时,则任何一个一般身份账号在尝试登入时, 都仅会获得 /etc/nologin 内容的信息,而无法登入主机。举例来说,当我建立 /etc/nologin ,并且内容设定为『This Linux server is maintaining....』, 那么任何人尝试登入时,都仅会看到上面提到的这段讯息,而且无法登入喔! 一直要到 /etc/nologin 被移除后,一般身份使用者才能够再次的登入啊!
• /etc/security/*
事实上,更多的 PAM 模块设定信息您可以参考 /etc/security/* 里面的档案设定, 尤其是针对使用者利用 Linux 系统资源的 limits.conf 以及时间的 time.conf 。 我们知道使用者利用系统资源的指令是 ulimit ,那么假如我想要让 dmtsai 仅能存取 10MBytes (10240KBytes) 的档案大小,那么我可以这样做:
[root@linux ~]# vi /etc/pam.d/limits.conf
# 新增这两行
dmtsai hard fsize 10240
@users hard fsize 10240
# 注意到,账号前面加上 @ 表示为『群组!』
那么下次 dmtsai 或者是属于 users 的群组的使用者登入这个 Linux 主机时, 你可以利用 ulimit -a 去察看一下,嘿嘿!他们能用的资源就减小很多了! 更多的用法您可以自行参考一下该档案内的说明啊! ^_^ (记得测试完毕要将资料改回来~否则....以后就麻烦了!)
Linux 系统上使用者的对谈与 mail 的使用:
谈了这么多的系统账号问题,总是该要谈一谈,那么如何针对系统上面的使用者进行查询吧?! 想几个状态,如果你在 Linux 上面操作时,刚好有其它的使用者也登入主机,你想要跟他对谈,该如何是好? 你想要知道某个账号的相关信息,该如何查阅?呼呼!底下我们就来聊一聊~