Linux之Shell脚本自动化编程三(login和nologin shell和关于shell特性的复习和补充)

Login shell和Nologin shell

之前我们切换用户的时候都是直接用的su lcl这种的命令,但是其实还有另外一种命令是加-的.

 

加-的称为login shell,不加-的称之为nologin shell,这两种shell启动的时候加载的配置文件是不一样的,加-的会加载/etc/profile,/etc/bashrc这两个系统级别的配置文件,所谓系统级别是针对所有用户的。加-的还会加载用户级别的配置文件,~/.bashrc_profile和~/.bashrc,用户级别也就是针对某一个特定的用户。不加-启动shell的时候,只会加载/etc/bashrc和~/.bashrc,~是当前用户的家。还有两个文件是退出shell的时候才更新或者执行的,分别是~/.bash_history和~/.bash_logout,~/bash_history里面的内容是历史命令,而是没有系统级别的命令配置文件的,命令历史只针对特定用户存在特定用户的家里面,一般按照默认的文件权限,其他用户是不能访问这个.bash_history的,当然root除外。当shell退出的时候才会把在shell缓存里面存放的历史命令存到.bash_history里面,也就是说才会更新,.bash_logout里面默认没有内容,如果你在里面写命令,命令就会在shell退出的时候执行。另外呢,不加-的命令执行完以后,当前路径还是原来的路径,而没有回来自己家里面去。

 

 

看到su lcl的时候,确实是先执行/etc/bashrc,然后执行~lcl/.bashrc,~lcl/.bashrc里面的a=0覆盖了/etc/bashrc里面的a=1,所以a的值最后是0。exit退回到root用户时,这个a是没有值的,

扫描二维码关注公众号,回复: 2731683 查看本文章

 

因为我们su lcl的时候,su lcl进程会fork一个子shell进程,在子shell里面执行了/etc/bashrc和~lcl/.bashrc,当子shell进程被当前shell进程处理以后,子shell里面的环境配置不会保留,我们可以用. /etc/bashrc或者source /etc/bashrc来在当前shell里执行这个配置脚本文件。我们下面来试一试加-的。

 

 

看到执行的顺序是/etc/profile,/etc/bashrc,然后是~lcl/.bashrc,最后是~lcl/.bash_profile。

 

和不加-的对比一下结果:

 

还有两个在退出shell时执行的.bash_history和.bash_logout。.bash_logout本来是空的,我们人为加一条命令。

 

history命令调出来的是在缓存里面的历史命令,只有当退出的时候,这些在缓存里面的命令才会写入.bash_history里面,才会更新。

 

我们在.bash_logout里面写的date命令只有在加-的时候退出shell才被执行了,不加-的时候退出时没有执行。

 

综上所述,su lcl这种nologin shell会在进入shell时只先后执行/etc/bashrc和~lcl/.bashrc,退出shell的时候更新~lcl/.bash_history,进入su - lcl这种login shell里面的时候先后执行/etc/profile,/etc/bashrc,~lcl/.bashrc最后是~lcl/.bash_profile,退出的时候更新一下.bash_history,执行一下.bash_logout。判断shell是否是交互的还有一个命令shopt login_shell,on表示是login shell,off是no login shell。

 

除了上面图中说的6个文件,还有一个文件夹里面的脚本也会被执行,这个文件夹就是/etc/profile.d,并且这个文件夹里面的脚本先于/etc/bashrc,/etc/profile,~lcl/.bashrc和~lcl/.bash_profile执行的。

 

最上面的图片上面还有一行黄色标注

 

是什么意思呢?下面就来看看。

/bin/bash,/bin/sh和/sbin/nologin

参考了https://www.cnblogs.com/jonnyan/p/8798364.html

https://www.cnblogs.com/onlyrinoa/p/7676314.html

和https://www.cnblogs.com/1130136248wlxk/articles/5308863.html

cat /etc/shells可以查看系统支持的shell格式,/bin是/usr/bin的一个软链接,其实也就只有三个shell,bash,sh,nologin三种。

 

前面说过bash是指向bash的,但是有没有区别呢?我们来试一试。

 

 

 

对于posix模式的理解。

 

还有一个/sbin/nologin我们还没有见过。

 

 

我们看到mail的shell是/sbin/nologin,我们在shell里面切换不到a0用户。下面我们试着在/etc/passwd配置文件里面修改一下a0的shell。

 

原来a0还是可以正常登陆的,但是现在就不可以了。/etc/nologin.txt里面的内容也打印出来了。

 

一开始登入ssh的时候也登不进去a0。

 

这个nologin.txt还必须在/etc下才可以。

 

shell特性的复习和补充

 

!number是调出命令历史编号为number的命令,还会把命令打印一遍。!string是调出以string字符串为开头的命令,!$是调出上一条命令的最后一个参数,!!是调出上一条命令,这个我们在人机交互的时候可以直接按上键,但是脚本里面就得用!!了,ctrl+r也是搜索命令,不同的是搜索的字符串不一定要开头。

 

alias取别名,alias命令是一次性的,在/etc/bashrc或者~lcl/.bashrc或者/etc/profile.d文件夹里面的脚本里写别名的命令,登入shell就会自动加载了。这里不演示了。在命令前加一个\就可以跳过别名了,因为linux是别名优先的。举个例子:

 

关于快捷键,Ctrl+d 删除光标所在处字符,但是如果命令行里面没有字符,ctrl+d就会退出当前shell,Ctrl+a 移动到当前行的开头,Ctrl+e 移动到当前行的结尾,Ctrl+l 清屏,Ctrl+u 剪切命令行中光标所在处之前的所有字符(不包括自身),Ctrl+k 剪切命令行中光标所在处之后的所有字符(包括自身),ctrl+y是粘贴,Ctrl+s 与Ctrl+r类似,只是正向检索,Ctrl+s 挂起当前shell,Ctrl+q 重新启用挂起的shell。ctrl+s这个我们前面还专门说过这个东西有点坑爹,会把屏幕锁定。前台后台作业控制呢,前面有专门的一讲有讲过,ctrl+c是终止前台进程的,ctrl+z是把前台进程暂停并放到后台,为什么需要把进程放在后台呢?因为shell前台一次只能执行一个进程,有的时候就是有这样的需求。一般我们可以这样做,如果我正在vim一个文件,突然想干别的事,可以在命令模式下ctrl+z,然后再fg回来。

 

kill一个作业的时候一定要记得加%,不然linux还以为kill的是pid,不是作业号。上面还有一个nohup和screen我们没有用过。先来看nohup:

参考了https://www.cnblogs.com/Alight/p/5313306.html

 

根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统,crond也是一样。守护进程和后台进程的区别,参考了https://blog.csdn.net/al86866365/article/details/65935987

 

还有http://www.ruanyifeng.com/blog/2016/02/linux-daemon.html

 

但是下面会看到即使huponexit是关闭的,后台进程依然会随着会话的结束而概被杀死,至少对于centos7来说是的。我们先来学习一下shopt这个内置命令。参考了http://man.linuxde.net/shopt

shopt命令用于显示和设置shell中的行为选项,通过这些选项以增强shell易用性。shopt命令若不带任何参数选项,则可以显示所有可以设置的shell操作选项。

 

我们来试一下后台和使用nohup的不同。

 

看到把会话关闭以后,即huponexit是off,sleep进程还是不存在了。如果加了一个nohup就相当于创建一个守护进程。

 

看到关掉会话,这个进程也还是存在,nohup.out文件也是存在的。守护进程也可以给它停掉。

 

再来看一下screen。参考了http://man.linuxde.net/screen

 

 

 

我已经安装了screen,我们来看看效果:

 

​看到screen其实是新进了一个shell,因为配置文件都重新加载了一遍。

最后再复习一下tee,这个东西实现了屏幕上既有输出,文件里也还可以有输出。

 

这一讲先到这里,下一讲我们将开始讲解shell里面的一些关键字等。

猜你喜欢

转载自blog.csdn.net/qq_41740705/article/details/81536614
今日推荐