tongyi007 发表于 2018-8-22 09:21:18

Shell初学与用户管理

  一、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 讲显示完整路径
  # type man
  man is hashed (/usr/bin/man)
  # 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来取消变量。
  设置变量示例:
  变量的命名:
  # name=dongqi
  # echo name
  name
  变量的累加:
  # version=$(uname -r)
  # echo $version
  2.6.18-164.el5
  反单引号的作用,在一串命令当中,反单引号``之内的命令会先执行,而其执行出来的结果将作为外部的输入信息。
  # ls -l `locate crontab`
  -rw-r--r-- 1 root root    298 Dec 182006 /etc/anacrontab
  -rw-r--r-- 1 root root    255 Jul 152006 /etc/crontab
  -rwsr-sr-x 1 root root 315416 Jul 152008 /usr/bin/crontab
  … … 往后省略
  工作中可能会遇到,例如我需要经常进入一个工作文档,而工作文档的命令比较长,此时,我们该如何进行设置变量。
  # work="/etc/xml"
  # echo $work
  /etc/xml
  # cd $work
  #
  环境变量的功能:
  1.       使用env 查看环境命令
  # clear
  # 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提示符的设置。   --命令最好别用。
  #解析
  [\u@\h\W]\$
  3.       locale 显示结果的语系变量
  4.       export 自定义变量转成环境变量
  #export 可以将环境变量显示出来
  5.       变量的有效范围
  被export 后的变量,我们它为“环境变量”。黄静变量可以被子进程引用,但是其他的自定义变量就不会存在于子进程中。
  环境变量=全局变量
  自定义变量=局部变量
  6.       命名别名与取消别名(简单用法)
  #alias lm=`ls –l | more`
  # alias lm='ls -l | more'            注意这个是单引号
  # 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到无穷多个任意字符
  ?代表一定有一个任意字符
  []同样代表一定有一个在括号中的字符。例如:代表一定有一个字符,可能是a,b,c,d中的任何一个
  [-]若有减号在括号内是,代表在编码顺序内的所有字符。例如代表0到9之间的所有数字,因为数字的语系编码是连续的。
  [^]若中括号内的第一个字符为指数字符(^),那表示原向选择。例如[^abc]代表一定有一个字符,只要是a,b,c 的其他字符就接受的意思。
  例如:
  #ll –d /etc/cron*
  #ll –d /etc/?????
  #ll –d /etc/**
  #ll –d /etc/[^a-z]
  Linux下的特殊符号。
  数据流重定向:
  1.       标准输入(stdin)         键盘      代码为0,使用>
  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
  # 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
  # echo $PATH
  /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
  # echo $PATH |cut -d ':' -f 5
  /sbin
  #cut –c 字符范围      --用于排列整齐的信息
  例如:
  # 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 &quot;string&quot;
  -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
  # 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检索用户的信息
  # finger xudongqi
  Login: xudongqi                           Name: (null)
  Directory: /home/xudongqi                  Shell: /bin/bash
  Never logged in.
  No mail.
  No Plan.
  su 转换到另外一个用户时,是不登录的。
  $ 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 信息
  # chfn xudongqi
  Changing finger information for xudongqi.
  Name []: King Xudongqi
  Office []: Shanghai
  Office Phone []: 212121
  Home Phone []: 1213123
  Finger information changed.
  # 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>
  No mail.
  No Plan.
  chsh 更改用户的shell
  # chsh xudongqi
  Changing shell for xudongqi.
  New shell : /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=/etcgentoo/将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

页: [1]
查看完整版本: Shell初学与用户管理