Linux 综合应用题及解析

1、编写脚本,接受二个位置参数,magedu和/www,判断系统是否有magedu,如果没有则自动创建magedu用户,并自动设置家目录为/www

#!/bin/bash 
#
############################################################

# @Author:	Flamenca
# @Date:	2020-04-26 12:38:20
# @File Name:	addUser_dir.sh
# @Last Modified time:	2020-04-26 13:01:05
# @Description:	接受二个位置参数,magedu和/www,判断系统是否有magedu,如果没有则自动创建magedu用户,并自动设置家目录为/www
# @mail:	[email protected]

############################################################

# 接受两个输入参数$name $dir
while read -p "please input your USERNAME and HOMEDIR:" name dir; do
	# 判断输入内容是否正确
	if [[ -z $name ]]; then
		# 当$name 为空
		echo "please input your USERNAME"
	elif [[ -z $dir ]]; then
		# 当$dir 为空
		echo "please input your DIR"
	elif `id $name &> /dev/null`; then
		# 查询 $name 发现已经存在
		echo "$name already exit!"
	elif `useradd $name -d $dir &> /dev/null` ; then
		# 为其创建账户,并制定家目录
		echo your count $name is created!
		echo 123456 |passwd --stdin $name &> /dev/null
		echo your passwd is : 123456  
	else 
		echo "another error,please check your input"
	fi
done

一些判断方法

[ -a FILE ] # 如果 FILE 存在则为真。
[ -b FILE ] # 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] # 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] # 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] # 如果 FILE 存在则为真。
[ -f FILE ] # 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] # 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] # 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] # 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] # 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] # 如果 FILE 存在且是可读的则为真。
[ -s FILE ] # 如果 FILE 存在且大小不为o则为真。
[ -t FD ] # 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] # 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] # 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] # 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] # 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] # 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] # 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] # 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] # 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] # 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] # 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] # 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] # 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] # “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] # “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] # 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] # 如果字符串不相等则为真。
[ STRING1 < STRING2 ] # 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] # 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。

2、使用expect实现自动登录系统。

expect

可以把人为操作转化为自动操作

expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ] 

启用选项:
-c:执行脚本前先执行的命令,可多次使用。
-d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
-D:启用交换调式器,可设一整数参数。
-f:从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
-i:交互式输入命令,使用"exit"或"EOF"退出输入状态。
–:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。
-v:显示expect版本信息。
expect的4个命令
Expect中最关键的四个命令是send,expect,spawn,interact。

命令 说明
send 用于向进程发送字符串
expect 从进程接收字符串
spawn 启动新的进程
interact 允许用户交互
#!/usr/bin/expect
#
############################################################

# @Author:	Flamenca
# @Date:	2020-04-26 13:12:26
# @File Name:	expect_test.sh
# @Last Modified time:	2020-04-26 13:16:34
# @Description:	使用expect实现自动登录系统
# @mail:	[email protected]

############################################################
set timeout 10
# 设置超时时间,单位为秒,默认情况下是10秒
set user root
set PASSWD root
set IP 192.168.1.13

spawn ssh $user@$IP
   expect {
     "yes/no" { send "yes\n";exp_continue }
     "password" { send "$PASSWD\n" }
          }
   interact
   # interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

3、简述linux操作系统启动流程

1)开机BIOS自检,加载硬盘。
2)读取MBR,进行MBR引导。
3)grub引导菜单(Boot Loader)。
4)加载内核kernel。
5)启动init进程,依据inittab文件设定运行级别
6)init进程,执行rc.sysinit文件。
7)启动内核模块,执行不同级别的脚本程序。
8)执行/etc/rc.d/rc.local
9)执行/bin/login程序,等待用户登录。
10) 登录之后开始以Shell控制主机

4、忘记centos7 密码的解决方案。

我记忆不好,很容易忘记东西的,如果有一天连root密码也忘记了,怎么办?

其实在Linux环境中root密码忘记时还是可以抢救回来的。只要能够进入挂载,然后重新设定一下root密码,就抢救回来了。

只是在新版的systemd的管理机制中,默认的rescue模式是无法直接获取root权限的,还是得要使用root的密码才能登陆rescure环境,那该怎么办呢?还是有办法的,我们需要通过一个名为re.break的内核参数来处理即可。

只是需要注意的是rd.break是RAM disk里面的操作系统状态,因此你不能获取原本的操作系统环境,所以还需要chroot的支持,更由于SELinux的问题,你可能还得要加上某些特殊的操作才能搞定。

  1. 重启系统,systemctl reboot

  2. 进入启动画面后按e进入编辑模式,然后就在Linux16的那个内核项目上面使用这个参数来处理,在最后加上rd.break

  3. 改完后按下Crtl+x开始启动,此时注意,你在RAM disk环境,并不是原来的环境,此时的根目录与你原本的系统无关,而且你的系统会被挂载到/sysroot目录下,所以,你应当这样做

    # 1. mount 查看一下挂载点 要发现/sysroot才是对的
    # 2. 找到后输入 mount -o remount,rw /sysroot 先让该挂载点变成可读可写
    # 3. chroot /sysroot 实际切换根目录为你的系统
    # 4. echo "passwd" | passwd --stdin root  修改密码
    # 5. touch /.autorelabel 很重要,使用SELinux的安全上下文
    # 6. exit
    # 7. reboot
    

以上的步骤中有一些可以讲一下:

  • chroot目录:代表你的根目录将暂时切换到chroot之后所接的目录,也就是那个/sysroot,所以你就能够暂时处理你的文件系统以及相关的账号管理

  • 为何要touch /.autorelabel? 在rd.break的RAM disk环境下 ,系统是没有SELinux的。而你刚刚修改的etc/shadow,所以这个文件的SELinux安全上下文的特性将会被取消,如果你没有让系统于启动时自动的恢复SELinux,你的系统将产生无法登录的问题,加上/.autorelabel就是要让系统在启动的时候自动使用默认的SELinux类型重新写入SELinux安全上下文到每个文件中。

  • rd.break模式下,修改完root密码后,将/etc/seLinux/config内的SELinux运行模式改为permissive

猜你喜欢

转载自blog.csdn.net/FlamencaH/article/details/105767101