一、shell的发展历史。

第一个shell是由Steven Bourne 发展出来的,为了纪念他,所以简称为sh .

Bill joy 设计的依附于BSD的unix系统中的shell,这个shell的语法类似于C语言,故得名为C shell ,建成Csh .

一般Linux的发行版中会由以下的shell :

1./bin/sh      ---已经被/bin/bash 替代

2./bin/bash    ---linux下默认的shell

2./bin/ksh     ---有AT&T Bell lab 发展出来的,兼容于bash

3.bin/tcsh     ---整合C shell ,提供更多的功能

4./bin/csh   

5./bin/zsh    ---由ksh发展出来的,由更强大的功能。

 

Shell 接受来自用户的指令,与内核(核心进行沟通)。

Shell 是一个交互式的执行命令

二、Bash shell 的功能

1.命令记忆能力

.bash_history 记录的是前一次登录以前执行过的命令,这次登录所执行的命令会保存在临时内存中,当系统注销掉之后,才会保存到记录.bash_history

2.命令与文件补全的功能

3.命令别名设置功能

例如,alias命令的使用

例:#alias lm=’ls -al’

4.作业控制、前台、后台控制

5.程序脚本

6.通配符

例如,我们想知道/usr/bin 下面多少以X开头的文件吗?我们可以使用”ls –l /usr/bin/X ”

 

Type 命令:

相关命令:我们如何知道系统中的命令是否来自于外部命令(指的是其他非bash所提供的命令)或是内置在bash 中的命令

#type –[-tpa] name

     -t,type将显示name所显示的意义(1.file表示为外部命令2.alias 表示为别名设置的名称3.builtin 表示为bash内置的命令)  

     -p 显示文件完整名

     -a 讲显示完整路径

[root@localhost ~]# type man

man is hashed (/usr/bin/man)

[root@localhost ~]# type cd

cd is a shell builtin

 

shell的变量功能

 

什么是变量?

 变量是一组以文字或符号等,来替代一些设置或者是一串保留的数据。(暂时命名的命令内存空间)在内存中画出一段内存空间,暂时存储数据

 

变量的显示与设置:

#echo $variable 显示变量

#echo $PATH

#echo ${HOME}

#echo ${MAIL}

 

变量的设置规则:

1.       变量与变量的内容以一个等号“=”来连接。

2.       等号两边不能直接连接空格字符

3.       变量名称只能是英语字母或数字,但是不能以数字开通(只能以-和字母开头)

4.       变量内容若有空格可使用双引号,或单引号将变量内容结合起来。

5.       转义字符”\”将特殊符号例如空格键(Enter)变成一般字符。

6.       变量为了增加变量内容时,则可用$变量名称或${变量}累加内容。

7.       `命令`和$的使用;

8.       export 使变量变成环境变量;

9.       需要依照个人的爱好来设置,但是不能与系统变量重复;

10.   Unset来取消变量。

 

设置变量示例:

变量的命名:

[root@localhost ~]# name=dongqi

[root@localhost ~]# echo name

name

变量的累加:

[root@localhost ~]# version=$(uname -r)

[root@localhost ~]# echo $version

2.6.18-164.el5

 

反单引号的作用,在一串命令当中,反单引号``之内的命令会先执行,而其执行出来的结果将作为外部的输入信息。

[root@localhost ~]# ls -l `locate crontab`

-rw-r--r-- 1 root root    298 Dec 18  2006 /etc/anacrontab

-rw-r--r-- 1 root root    255 Jul 15  2006 /etc/crontab

-rwsr-sr-x 1 root root 315416 Jul 15  2008 /usr/bin/crontab

… … 往后省略

 

工作中可能会遇到,例如我需要经常进入一个工作文档,而工作文档的命令比较长,此时,我们该如何进行设置变量。

[root@localhost ~]# work="/etc/xml"

[root@localhost ~]# echo $work

/etc/xml

[root@localhost ~]# cd $work

[root@localhost xml]#

 

环境变量的功能:

1.       使用env 查看环境命令

[root@localhost xml]# clear

[root@localhost xml]# env

HOSTNAME=localhost.localdomain     --主机名称

TERM=xterm                       --这个终端使用的环境是什么类型

SHELL=/bin/bash                    --目前shell 环境

HISTSIZE=1000                      --记录命令的条数

SSH_CLIENT=172.16.0.1 64432 22       --s

SSH_TTY=/dev/pts/0                  P

USER=root                          --用户

LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=00;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;31:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00;35:*.xpm=00;35:*.png=00;35:*.tif=00;35:

MAIL=/var/spool/mail/root            --mail box 位置

PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/home/andy/bin:/tmp:/home/bin

INPUTRC=/etc/inputrc                --键盘功能相关,可设置特殊按键

PWD=/etc/xml                      --用户目前的工作目录,可使用pwd 命令查看

LANG=en_US.UTF-8                  --系统语系

SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass

SHLVL=1

HOME=/root

LOGNAME=root

CVS_RSH=ssh

SSH_CONNECTION=172.16.0.1 64432 172.16.31.1 22

LESSOPEN=|/usr/bin/lesspipe.sh %s

DISPLAY=localhost:10.0

G_BROKEN_FILENAMES=1

_=/bin/env

OLDPWD=/root

2.       使用set查看所有变量(包括环境变量和自定义变量)

PS1提示符的设置。   --命令最好别用。

[root@localhost home]#  解析

[\u@\h\W]\$

3.       locale 显示结果的语系变量

 

4.       export 自定义变量转成环境变量

#export 可以将环境变量显示出来

 

5.       变量的有效范围

被export 后的变量,我们它为“环境变量”。黄静变量可以被子进程引用,但是其他的自定义变量就不会存在于子进程中。

环境变量=全局变量

自定义变量=局部变量

6.       命名别名与取消别名(简单用法)

#alias lm=`ls –l | more`

[root@localhost ~]# alias lm='ls -l | more'            注意这个是单引号

[root@localhost ~]# lm /etc

 

7.       history命令

history 命令可以用来查询我们曾经执行过的命令。

常见的参数:

-n  数字,要列出最近n 条命令的意思;

-c  将目前shell 中的所有的history 内容全部清除

-a  将目前新增的history 命令输入histfile 中,若没有加histfiles ,则默认写入~/.bash_history

-r   将目前的hisfiles 的内容读到目前的这个shell的history记忆中。

-w  将目前的history记忆内容写入histfiles 中。

 

#!number             执行第n 行的命令

#!command           执行上一个命令

#!al                  执行最近以al开头的命令

 

#cd 先按Esc,再按.用来表示上一个目录

#cd !$ 来引用上一行的最后一个参数

 

#export HISTCONTROL=ignorespace 忽略以空白开头的命令

                  =ignoredups  忽略重复的命令

                  =ignoreboth  忽略以空白开头和忽略重复的命令

                  =erasedups   删除重复的命令

bash 登录与欢迎信息

#cat /etc/issue 这个是登录的信息

#cat /etc/motd 这个是登录欢迎信息

 

Linux 下的通配符与特殊符号

 

*代表0到无穷多个任意字符

?代表一定有一个任意字符

[]同样代表一定有一个在括号中的字符。例如:[abcd]代表一定有一个字符,可能是a,b,c,d中的任何一个

[-]若有减号在括号内是,代表在编码顺序内的所有字符。例如[0-9]代表0到9之间的所有数字,因为数字的语系编码是连续的。

[^]若中括号内的第一个字符为指数字符(^),那表示原向选择。例如[^abc]代表一定有一个字符,只要是a,b,c 的其他字符就接受的意思。

 

例如:

#ll –d /etc/cron*

#ll –d /etc/?????

#ll –d /etc/*[0-9]*

#ll –d /etc/[^a-z]

 

Linux下的特殊符号。

 

 

 

 

数据流重定向:

 

1.       标准输入(stdin)         键盘      代码为0,使用<,或<<

2.       标准输出(stdout)        monitor   代码为1,使用>,或>> 

3.       标准错误输出(stderr)    monitor   代码为2,使用2>,或2>>

1>以覆盖的方法将正确的数据输出到指定文件或设备上

 1>>以累加的方法-----------------------------------------------------

 2>以覆盖的方法将错误的数据输出到指定的文件或设备上

 2>>以累加的方法将---------------------------------------------------

注:2,3虽然都通过monitor 输出,但是却是不同的数据流。

 

         /dev/null  垃圾黑洞设备与特殊写法

tee 双向重定向,将数据流的信息存下来和输出到屏幕上。

 

命令执行的判断依据:

;           ---表示命令需要连续的执行

&&          ---若cmd1执行正确,则开始×××cmd2($?=0);若cmd1执行完毕,且错误($?不等于0),则cmd2不执行;

||           --若cmd1执行正确,则cmd2不执行;若cmd1执行错误,则开始执行cmd2

[root@localhost ~]# ls /tmp/andy &&  echo “exist” || echo “not exist”

ls: /tmp/andy: No such file or directory

“not exist”

 

管道命令:

管道命令”|”处理经由前一个命令传来的正确的信息,也就是stdout的信息,对于stderr的信息则不能进行处理,且管道命令必须要能够接受前一个命令的数据成为stdin 继续处理才行。

#ls –al /etc | less

选取命令:

Cut选取信息通常是针对“行”来分析的,而不是整篇信息进行分析的。

#cut –d ‘分隔字符’ –f fields

cut –d d表示分隔符,默认分割符为空白符: -f 字段 –f1 表示以冒号分开的第一个字段,然后予以显示

#cut –d : f1 /etc/passwd

#cut –d : f1-7 /etc/passwd

 

指定空格为分隔符

 

#cut –d ‘ ’ –f1 /etc/passwd

 

[root@localhost ~]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@localhost ~]# echo $PATH |cut -d ':' -f 5

/sbin

 

#cut –c 字符范围      --用于排列整齐的信息

 

例如:

[root@localhost ~]# export | cut -c 12-(数字是范围,如果12-则表示12个字符之后的数据)

 

排序命令:

一、 sort 依据数据不同的类型对文本进行排序,以字符串(ASICC码在字符串中的数据进行排序);  --默认是从字母的升序进行排序

-f,忽略大小写

-b,忽略前面空格部分

-M,以月份来排序

-n,使用纯数字进行排序

-r,反响排序

-u,   该命令等于uniq 及相同的数据中,仅出现一行代表

-t,默认是通过(Tab)建来进行排序

-k,以那个区间(field)来进行排序

二、uniq (唯一的) 将重复的数据仅列出一个显示   两行是否连续的,如果是连续的则进行比较,如果不是连续的则不能被识别为相同的行。

 

-u  只显示不重复的行,唯一出现过一次的行

-d  只显示重复的行,只显示一次,重复两次或两次以上。

-c  做统计,每一行进行一个编号,表示每一行重复出现过几次 

三、wc 统计输出的信息整体数据

#wc –l         仅列出行;

-w        仅列出多少字;

-m        仅列出多少字符;

四 tr translate (转化)

#tr SET1 SET2 把文件中包含SET1中的字符统统替换为SET2中的字符

#tr  ‘abc’  ‘ABC’  /etc/passwd

# cat /etc/passwd | tr 'a-z' 'A-Z'

#tr 'a-z' 'A-Z' < /etc/passwd

#tr –d ‘abc’ 将出现过abc的字符删除掉

tr -d 'xX' < /etc/passwd

 

Unix 操作系统是一个多用户,多任务

用户是获取计算机各种资源权限的集合,一种权限集合的映射。

用户:权限的集合

UID:用户的标识

用户名:用户的名称

密码:验证用户身份的凭证 

Linux 单向加密(MD5,SHA1安全的哈希算法,SHA256)输入数据可以不一样,但是输出数据一定是定长的。   加密促生新的解密手段,解密又促进加密的手法 

MD5:Message Degist  数码特征码  MD5只要有一位不一样,那么MD5的差距就很多。

MD5:128bit

SHA1:160bit

SHA256:256 bit 长度越长,安全想越好,所需运算的时间也就越长。

 

MD5的两个特征:1.雪崩效应2.数据定长输出

 

Linux 在进行用户验证的时候,需要密码字符串,加上一个字符串,比如“redhatabc”,然后进行加密,然后比较MD5的字符串。

 

所以,我们在使用密码的时候要注意:

1.       密码定期修改

2.       此前使用过的密码20次以内的密码不能使用

 

组:group 方便权限的分配,我们可以认为组是权限的的容器,将权限映射到每个用户上。

 

用户:

管理员,root

系统用户,系统用户不属于任何一个用户的进程,为了保证系统后台进程的顺利进行,所需要附属的身份

普通用户

 

安全上下文:系统的运行本身是N个协调者相互运行的进程来实现的。

 

系统根据ID号来判断不同的用户:

root :0

系统用户:1-499

普通用户:>=500

 

用户在建立的时候都有所属的组,组也有三类:

1.       私有组

2.       系统组

3.       公共组

站在用户的角度来讲:

1.       基本组(私有组)2.额外组(附加组)

 

文件权限:

r :读

w:写

x:执行

 

目录权限:

r: 可以使用查看命令列出名称

w: 可以在目录中建立或删除文件

x: 可以使用cd 切换此目录,或者使用ls –l 来列出文件的名称

 

添加一个用户:

# useradd USERNAME

         -u UID

         -g GID

         -c "string"

         -d PATH

         -s SHELL

         -G grp1,grp2,...

 

# passwd USERNAME

 

建立一个用户:

1、/etc/passwd

2、/etc/shadow

3、/etc/group

4、/home/USERNAME

 

如果在我们的系统中没useradd 这个命令,那么我们可以进行编辑这几个文件进行。

/etc/passwd

username:x:UID:GID:comment:HOMEDIR:SHELL

 

useradd USERNAME

         -u UID

         -g GID

         -G grp1,grp2,...

         -c

         -d PATH

         -s SHELL

         -M

 

[root@localhost default]# tail -2 /etc/shadow

fedora:$1$OKTr0aEB$.AJTytNMTpbbGY9B8wUVm.:15354:0:99999:7:::

Gaga:$1$jqRoaDI8$uDBcBhqQ4bghd2T1vemnw1:15354:0:99999:7:::

Shadow 有9个字符段,这9个字符段用:隔开

Fedora 用户名       -----帐号名称

$1$ MD5加密方式    

$........$ 8位表示加的盐的加密

-------------密码通过MD5加密之后的字符串      -----密码

15354 自1970年7月1日到现在改变的时间    -----最近更动密码的时间

0默认值为0                                -----密码不可被更动的天数

99999                                      -----密码需要重新更动的天数

7                                          -----密码需要更改期限的警告天数

                                           -----密码过期后宽限时间

                                           -----帐号是小日期

                                           -----保留

 

passwd  -l 锁定用户

        -u

        --stdin

#echo redhat | passwd --stdin redhat 给用户指定一个初始密码

pwck 检查passwd文件的一致性,验证每个用户的密码,帐号是否出去有效期内。

 

/etc/login.defs 指定用户的默认定义值

 

chfn

id/finger/

finger :user information lookup program  检索用户的信息

[root@localhost ~]# finger xudongqi

Login: xudongqi                           Name: (null)

Directory: /home/xudongqi                  Shell: /bin/bash

Never logged in.

No mail.

No Plan.

 

su 转换到另外一个用户时,是不登录的。

[xudongqi@localhost ~]$ finger xudongqi

Login: xudongqi                           Name: (null)

Directory: /home/xudongqi                  Shell: /bin/bash

On since Sun Jan 15 14:10 (CST) on pts/1 from server117.example.com  正在线的用户状态

No mail.  没有邮件

No Plan.  没有定期任务

 

chfn - change your finger information  更改finer 信息

[root@localhost ~]# chfn xudongqi

Changing finger information for xudongqi.

Name []: King Xudongqi

Office []: Shanghai  

Office Phone []: 212121

Home Phone []: 1213123

 

Finger information changed.

[root@localhost ~]# finger xudongqi

Login: xudongqi                           Name: King Xudongqi

Directory: /home/xudongqi                  Shell: /bin/bash

Office: Shanghai, 212121                   Home Phone: 121-3123

On since Sun Jan 15 14:10 (CST) on pts/1 from server117.example.com

   1 minute 21 seconds idle

No mail.

No Plan.

chsh 更改用户的shell

[root@localhost ~]# chsh xudongqi

Changing shell for xudongqi.

New shell [/bin/bash]: /bin/ksh

Shell changed.

 

usermod

   -u

   -g

   -G  (-a –G 追加的附加组)

   -c    修改注释

   -d    修改家目录   +  -m 将之前家目录的文件移到新的家目录里

   -s    修改shell 修改家目录的时候,之前家目录的文件是无法直接移过去的。

   -l    NEWLOGNAME 修改登录名

   -L    锁定用户的帐号

   -U   解锁用户帐号

   -u   两个用户可以使用相同的id 号

groupadd

         -g GID   指定GID

         -r       指定添加为系统组

 

groupmod

         -g GID   更改ID号

         -n NEWGRPNAME   更改组名

        

Groupdel

 

gpasswd 给组添加密码,指定组名

#gpasswd GRPNAME

 

newgrp 将某组作为某个用户的基本组

 

/etc/group  保存组的相关信息

/etc/shadow 保存组的密码

 

Linux的安全模型:

1、  每一个文件都有属主和属组;

2、  每个进程都以某个用户和组的身份运行;

3、  读、写、执行

4、  用户是否这个用户的属主,则属主权限得以应用;    先用户、组、最后是其他

 

chown/chgrp

chmod

 

chmod 改变三类用户的权限

1.       以数字类型改变文件权限   #chmod 766 file

2.       符号类型改变文件权限    

 u

 g

 o

 a

+,-,=  rwx

例如u=rw,g=rwx,a=r

 

-R  递归修改,更改目录时需要用到

#chmod –R 700 gentoo/

#chmod –R –reference=/etc  gentoo/  将gentoo 的目录、子目录以及里面的文件全部转换成/etc目录下的权限。

 

#chown USERNAME FILE1,FILE2,..

#chown 属主:属组  指定目录/

#chown  :属组 指定目录/

 

通过一个手工的办法给系统添加一个帐号:

添加一个用户名叫做slackware,slackware (用户名和组名)

UID=5000,GID=5000

# openssl passwd -1 -salt 12345678 加密和解密相关的工具

 

做法:

1、/etc/group

slackware:x:5000:

 

2、/etc/passwd

slaceware:x:5000:5000:Test User:/home/slackware:/bin/bash

 

3、/etc/shadow

slaceware:$1$12345678$0ME5N6oDyoEAwUp7b5UDM/:15355:0:99999:7:::

 

4、

# cp -r /etc/skel /home/slackware

# chown -R slackware:slackware /home/slackware

# chmod -R go= /home/slackware