您的位置:首页 > 运维架构 > Shell

Shell初学与用户管理

2012-02-27 07:56 441 查看
一、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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 用户 Shell 休闲