什么是登录环境?
登录系统时,在进入命令提示符前,系统要做两个工作。键入用户名和密码后,系统检
查是否为有效用户,为此需查询/ e t c / p a s s w d文件。如果登录名正确并且密码有效,开始下一
步过程,即登录环境。
其实平常我们使用telnet或者ssh或者直接在tty中登录Linux主机的时候,系统会出现一个login画面让你输入帐号,其接下来的过程可以分为以下三步:
1、先找出/etc/passwd里面是否有这个帐号?如果没有则退出,如果有,将该帐号对应的UID(User ID)与GID(Group ID)读出来,同时读取shell设置和家目录。
2、核对密码表,查看对应的/etc/shadow文件的设置是否和输入的密码一致。
3、在上一步成功执行的情况下,进入了shell控制阶段了。
在进行下一步处理之前,先看看文件/ e t c / p a s s w d。这是一个文本文件,可以任意修改其中
的文本域,但要小心。此文本有7个域,并用冒号作分隔符,以下是其部分文件内容列表。在
顶端加有列号,这样各域标识得更加清晰。普通用户用cat就可以查看/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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
第一个域为帐号名称,对应UID,这个不用多解释,就是登录的那个名字。
第二个是密码,早期的UNIX系统的密码字段,如上所说,任何用户都可以用cat查看该文件的内容,所以后来的系统中把该字段放到了/etc/shadow中。
而对/etc/shadow的读取是需要root权限的。查看一下它的文件属性就知道了
$ ls -al /etc/shadow
-r--------. 1 root root 1086 2010-09-07 14:38 /etc/shadow
第三个是UID。Linux中,有一个UID的分配规则。0表示的是系统管理员,只要是UID为0的用户,就是系统管理员,可以设置系统有多个管理员。1~499,保留给系统使用的UID。
500~65535,给一般的用户使用。
第四个是GID,和文件/etc/group相关。
第五个是用户信息说明栏。
第六个是家目录的位置。
第七个是该用户的登录shell。
登录消息显示数据:/etc/issue 和 /etc/motd
文件/etc/issue里面实现的内容就是我们从tty中登录(没有登录之前)的提示字符串。
提示:使用Ctrl+Alt+F1~F6进行不同的tty切换
$ cat /etc/issue
Fedora release 11 (Leonidas)
Kernel \r on an \m (\l)
上面的例子中使用了几个特殊的符号。\r相当于uname -r,然后\m相当于uname -m,\l指的是第几个终端接口。
如果我使用命令Ctrl+Alt+F2,然后屏幕上就会显示如下的信息,同时要你输入用户名和密码登录。
Fedora release 11 (Leonidas)
Kernel 2.6.29.4-167.fc11.i686.PAE on an i686 (tty2)
localhost login:
文件/etc/motd显示的是我们登录成功后,系统显示的信息。这个比较简单。里面有什么,就显示什么。
环境变量的系统设置:
下面列举相关文件
/etc/sysconfig/i18n
$ cat /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
我的是英文环境,所以整体语系是en_US.UTF-8,可以在修改相关的环境变量进行设定。
有人会纳闷?为什么会是i18n呢?internationalization,不过这个单词太长啦。所以把中间18个单词用18来代替了。
/etc/profile
这个文件比较有统一性。几乎所有版本的*NIX都会有。同时对所有的用户都有效。里面设置了一些比较重要的环境变量。PATH,HOSTNAME,UID之类的。PAT H定位包含可执行文件,库文件及一般文本文件的目录位置,便于用户快速访问。有了前面的十二篇的基础,相信/etc/profile里面的简单脚本难不倒你。同时/etc/profile.d目录和文件/etc/inputrc也是由/etc/profile规划出来的。
/etc/bashrc
这个文件里面有一个比较重要的就是PS1环境变量。决定命令提示符的显示方式。
/etc/profile.d/*.sh
这是一个目录。针对bash以及C-shell规范了一些数据。可以自行设计一些具有*.sh的文件名来书写系统的设置值。
环境变量的个人设置:
~/.bash_profile ~/.bash_login ~/.profile
这三个文件只需要一个即可。一般默认是~/.bahs_profile。之所有有那么多的文件,是因为其他shell用户转过来的习惯。
bash启动时(其他的shell不清楚),依次读取的顺序是~/.bash_profile,~/.bash_login,~/.profile
~/.bashrc
这个是最个性化的设置文件。shell登录时候,最后读取的。每次执行shell脚本的时候都会读取这个文件,所以是最全面,最新的。而刚刚那个文件~/.bash_profile只是在登录的时候才读取一次的。在我的文件中重新设置了一个更加好看的命令提示符。PS1
export PS1='\[\e[01;32m\][\u@\[\e[01;33m\]\h \[\e[01;34m\]\W] `[[ -d .git ]] && echo -n -e "\[\e[01;33m\](branch:$(git branch | sed -e "/^ /d" -e "s/* \(.*\)/\1/"))\[\e[01;34m\]"`\$ \[\e[00m\]'
环境变量的系统设置:
下面列举相关文件
/etc/sysconfig/i18n
- $ cat /etc/sysconfig/i18n
- LANG="en_US.UTF-8"
- SYSFONT="latarcyrheb-sun16"
复制代码
我的是英文环境,所以整体语系是en_US.UTF-8,可以在修改相关的环境变量进行设定。
有人会纳闷?为什么会是i18n呢?internationalization,不过这个单词太长啦。所以把中间18个单词用18来代替了。
/etc/profile
这个文件比较有统一性。几乎所有版本的*NIX都会有。同时对所有的用户都有效。里面设置了一些比较重要的环境变量。PATH,HOSTNAME,UID之类的。PAT H定位包含可执行文件,库文件及一般文本文件的目录位置,便于用户快速访问。有了前面的十二篇的基础,相信/etc/profile里面的简单脚本难不倒你。同时/etc/profile.d目录和文件/etc/inputrc也是由/etc/profile规划出来的。
/etc/bashrc
这个文件里面有一个比较重要的就是PS1环境变量。决定命令提示符的显示方式。
/etc/profile.d/*.sh
这是一个目录。针对bash以及C-shell规范了一些数据。可以自行设计一些具有*.sh的文件名来书写系统的设置值。
环境变量的个人设置:
~/.bash_profile ~/.bash_login ~/.profile
这三个文件只需要一个即可。一般默认是~/.bahs_profile。之所有有那么多的文件,是因为其他shell用户转过来的习惯。
bash启动时(其他的shell不清楚),依次读取的顺序是~/.bash_profile,~/.bash_login,~/.profile
~/.bashrc
这个是最个性化的设置文件。shell登录时候,最后读取的。每次执行shell脚本的时候都会读取这个文件,所以是最全面,最新的。而刚刚那个文件~/.bash_profile只是在登录的时候才读取一次的。在我的文件中重新设置了一个更加好看的命令提示符。PS1
- export PS1='\[\e[01;32m\][\u@\[\e[01;33m\]\h \[\e[01;34m\]\W] `[[ -d .git ]] && echo -n -e "\[\e[01;33m\](branch:$(git branch | sed -e "/^ /d" -e "s/* \(.*\)/\1/"))\[\e[01;34m\]"`\$ \[\e[00m\]'
复制代码
~/.bash_history
每次登录bash后,bash会先读取这个文件,将所有的历史命令读入内存。和HISTSIZE环境变量的设置值有关系。
~/.bash_logout
注销bash后,系统会给你干的事情。
对于刚才的几个文件我们通常在改变之后用source命令或者.重新读取一遍。
再谈谈登录shell和非登录shell
登录shell指的是当用户登录linux系统时,所取得的那个shell,当登录以后,再去执行其他的shell,其他的shell就是非登录shell了。
最常见的一种情况就是在X Window下,启动终端,那些shell都是非登录shell
还有一种情况是以一个用户登录有,使用命令bash切换到一个新的环境,这个也是非登录shell了。
把握好登录这两个字就可以了。
还有它们读取文件的区别。
登录shell会读取~/.bash_profile和~/.bashrc两个文件
非登录shell仅仅是读取~/.bashrc文件
stty用法
s t t y用于设置终端特性。要查询现在的s t t y选项,使用stty -a。
$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
上面中^C表示Ctrl+C的意思。其他的依次类推。下面列举几个参数代表的含义。更多的请参考man stty
eof:End Of File 文件结束的意思
erase: 向后删除字符
kill: 删除在当前命令行上的所有文字
quit: 给当前正在执行的进程发送一个quit信号
stop: 停止当前屏幕的输出
这些设置值,和我们日常用的Ctrl+D,ctrl+U等操作相关。一般情况下没有必要改动。
假如想要用ctrl+H进行字符从删除,可以这么设置
# stty erase ^H
除了stty,bash还有自己的终端设置set,可以用来设置整个命令的输入输出的环境。
# echo $-
# 显示set的所有设置
# set -x
# echo $HOME
# 要输出的命令都会屏幕上显示,前面会多出一个+符号来
关于set的更多设置,更多地是写入了/etc/inputrc文件当中
最后不建议修改tty的环境设置,因为bash的环境已经设置很好了,不需要附加一些修改,否则产生不必要的麻烦。这里只是给大家展示以下终端是如何进行设置的。