10.1 Shell概述
1、 Shell是什么
(通俗的讲,就是把命令转换为内核可以识别的机器语言,同时返回结果)
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
2、Shell的分类
Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。 这是主流的
C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。
Bourne家族主要包括sh、ksh、Bash、psh、zsh;
C家族主要包括:csh、tcsh
Bash: Bash与sh兼容,现在使用的Linux 就是使用Bash作为用户的基本Shell。
3、Linux支持的Shell
通过查看文件 /etc/shells
[root@localhost ~]# more /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
4.切换shell,直接打shell标识
[root@localhost ~]# sh
sh-4.1# exit
exit
[root@localhost ~]# csh
[root@localhost ~]# exit
exit
[root@localhost ~]# bash
[root@localhost ~]# exit
exit
[root@localhost ~]#
10.2 Shell脚本的执行方式
1、echo输出命令
[root@localhost ~]# echo [选项] [输出内容]
选项: -e: 支持反斜线控制的字符转换
[root@localhost ~]# echo -e "ab\bc"
#删除左侧字符
[root@localhost ~]# echo -e "a\tb\tc\nd\te\tf"
#制表符与换行符
[root@localhost ~]# echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"
#按照十六进制ASCII码也同样可以输出
[root@localhost ~]# echo -e "\e[1;31m abcd \e[0m"
#输出颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
注意:其中 \e[1;标识开始颜色输出 ,\e[0m 表示结束颜色输出,abcd表示输出的字符,31m表示颜色
2、第一个脚本
[root@localhost sh]# vi hello.sh
#!/bin/Bash
#The first program
# Author: shenchao (E-mail: [email protected])
echo -e "Mr. Shen Chao is the most honest man in LampBrother"
注意: #!/bin/Bash 这是标称我以下的脚本是shell脚本,一定要有
另外在echo中 “!”感叹号有特殊含义,如果想用感叹号,就用''单引号
3、脚本执行
1)赋予执行权限,直接运行
chmod 755 hello.sh
然后用相对路径或者绝对路径执行
/root/tmp/shFile/hello.sh #绝对路径
./hello.sh #相对路径
2)通过Bash调用执行脚本
bash hello.sh
sh hello.sh
tips:俄罗斯方块游戏代码点击下载
密码:du55
注意:在Windows中的换行是 M$,而在Linux中是$,因此要用命令 dos2unix [文件名] 将Windows的脚本进行转换
如:dos2unix hello.sh
10.3 Bash的基本功能
10.3.1 历史命令与命令补全
1、历史命令
[root@localhost ~]# history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件
~/.bash_history (默认保存的位置)
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
真正保存在 /root/.bash_history
历史命令的调用
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
2、 命令与文件补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全
10.3.2 命令别名与常用快捷键
1、 命令别名
[root@localhost ~]# alias 别名='原命令'
#设定命令别名
[root@localhost ~]# alias
#查询命令别名
命令执行时顺序
1 第一顺位执行用绝对路径或相对路径执行的命令。
2 第二顺位执行别名。
3 第三顺位执行Bash的内部命令。
4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
让别名永久生效
[root@localhost ~]# vi /root/.bashrc
删除别名
[root@localhost ~]# unalias 别名
2、 Bash常用快捷键
10.3.3 输入输出重定向
1、 标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
2、 输出重定向(图302 + 303)
文件本来是输出到显示器,这时候改变其输出方向,让其输出到指定文件或者设备中,就是输出重定向。
如: 命令 > 文件 (以覆盖的方式)
命令 >> 文件 (以追加的方式)
表示把命令的结果保存在[文件]中
eg:
[root@localhost ~]# ll -a > /tmp/shFile/shuchuChongdingxiang
[root@localhost ~]# cat /tmp/shFile//shuchuChongdingxiang
标准错误输出重定向
错误命令 2> 文件 (以覆盖的方式)
错误命令 2>> 文件 (以追加的方式)
注意:2和> 之间没有空格
如:把无用的输出丢到垃圾箱 /dev/null
eg: ls &>> /dev/null
正确输出和错误输出同时保存
1)命令 &> 文件 (以覆盖的方式)
2)命令 &>> 文件 (以追加的方式)
3) 命令>>文件1 2>>文件2 (把正确的输出追加到文件1,错误的输出追加到文件2)
如:
[root@localhost shFile]# date &>> todayDate
[root@localhost shFile]# gate &>> todayDate
[root@localhost shFile]# cat todayDate
2020年 05月 10日 星期日 06:44:53 CST
-bash: gate: command not found
3、 输入重定向
把本来键盘输入,重定向到 从文件输入
[root@localhost ~]# 命令 [选项] [文件名]
如 : wc [选项] [文件名]
选项:
- c 统计字节数
- w 统计单词数
- l 统计行数
命令<文件 把文件作为命令的输入
命令<< 标识符
…
标识符 把标识符之间内容作为命令的输入
如:
[root@localhost dev]# wc
dfdsag
adsag
qw
1342
4 4 21
表示一共输入了4行,4个单词,21的字符(包含空格)
[root@localhost shFile]# wc < hello.sh
3 12 84
表示hello.sh这个文件有3行,12个单词,84个字符
[root@localhost shFile]# wc << start-end
> dsa
> agda
> start-end
2 2 9
表示:把 start-end 之间的内容作为输入
10.3.4 多命令顺序执行与管道符
1、 多命令顺序执行
1)“;”分号,命令之间没有逻辑联系,每个命令都执行,即使中间的命令是错误的也不会影响后面命令的执行
“&&” 逻辑与,只有命令1正确执行了,才能执行命名2。若命令1没有正确执行,则不会执行命令2
“||”逻辑或;若命令1正确执行,则命令2不会执行。若命令1执行不正确,此时才会执行命令2
例子:
[root@localhost shFile]# ls ; cd /tmp; ls ; pwd
hello.sh shuchuChongdingxiang todayDate
chattrDire dtest project stickyTestDir wangwuDir
chattrFile hello.sh shFile testDir yum.log
/tmp
[root@localhost ~]# dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项: dd 命令是特殊的复制命令,如磁盘,系统文件等的复制
if=输入文件 指定源文件或源设备
of=输出文件 指定目标文件或目标设备
bs=字节数 指定一次输入/输出多少字节,即把这些字节看做一个数据块 (即每次复制多少)
count=个数 指定输入/输出多少个数据块
例子:
[root@localhost tmp]# date;dd if=/dev/zero of=/tmp/shFile/testfile bs=1k count=100000;date
2020年 05月 10日 星期日 07:11:24 CST
记录了100000+0 的读入
记录了100000+0 的写出
102400000字节(102 MB)已复制,1.02615 秒,99.8 MB/秒
2020年 05月 10日 星期日 07:11:25 CST
表示:创建一个大约100M的文件需要多长时间
[root@localhost ~]# ls anaconda-ks.cfg && echo yes
[root@localhost ~]# ls /root/test || echo "no
[root@localhost ~]# 命令 && echo yes || echo no (判断这条命令是否正确执行)
如:
[root@localhost shFile]# ls && echo yes || echo no
hello.sh shuchuChongdingxiang testfile todayDate
yes
[root@localhost shFile]# lss && echo yes || echo no
-bash: lss: command not found
no
2、 管道符 :连接各命令,命令1的输出作为命令2的操作对象
命令格式:
[root@localhost ~]# 命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
颜色显示
例子:
[root@localhost ~]# ll -a /etc/ | more
[root@localhost ~]# netstat -an | grep "ESTABLISHED"
搜索正在建立的连接
[root@localhost ~]# grep [选项] "搜索内容" 文件名
选项:
-i: 忽略大小写
-n: 输出行号
-v: 反向查找 (除了关键字以外的内容)
--color=auto 搜索出的关键字用颜色显示
如:
[root@localhost ~]# grep --color=auto -n "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
表示搜索 /etc/passwd文件中和“root”相关的行,同时显示行号,并且关键字用颜色表示
如:
[root@localhost shFile]# netstat -an | grep --color=auto "ESTABLISHED"
tcp 0 96 192.168.1.16:22 192.168.1.4:63276 ESTABLISHED
udp 0 0 127.0.0.1:50382 127.0.0.1:514 ESTABLISHED
(其中ESTABLISHED 会标红)
如:
root@localhost ~]# ll -a /etc | more
这样就可以通过more查看该目录有哪些文件。(本来more命令只能查看文件,通过管道符就可以以翻页的形式查看目录)
如:
[root@localhost ~]# netstat -an | grep -niv --color=always "ESTABLISHED" | more
反向查找:也就是排除 “ESTABLISHED”的所有内容
10.3.5 通配符与其他特殊符号
1、通配符:用来匹配文件名
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# rm -rf *
[root@localhost tmp]# touch abc
[root@localhost tmp]# touch abcd
[root@localhost tmp]# touch 012
[root@localhost tmp]# touch 0abc
[root@localhost tmp]# ls ?abc
[root@localhost tmp]# ls [0-9]*
[root@localhost tmp]# ls [^0-9]*
3、Bash中其他特殊符号
如
[root@localhost tongPeiFUFile]# name=lisi
[root@localhost tongPeiFUFile]# echo $name
lisi
[root@localhost tongPeiFUFile]# echo '$name'
$name
[root@localhost tongPeiFUFile]# echo "$name"
lisi
如:
单引号就是单纯输出引号内的内容
反引号是括起来的是系统命令,Bash中会先执行它
双引号,除了特别的“$ , . ,\”是例外,代表特殊含义
$(命令) 和反引号一样,用来引用系统命令
$表示用于调用变量的值
\ 转义符,在\之后的特殊符号将失去意义,变为普通字符
[root@localhost tongPeiFUFile]# echo '$date'
$date
[root@localhost tongPeiFUFile]# echo `date`
2020年 05月 10日 星期日 08:53:54 CST
[root@localhost tongPeiFUFile]# echo $(date)
2020年 05月 10日 星期日 08:54:19 CST
[root@localhost tongPeiFUFile]# echo "date"
date
[root@localhost tongPeiFUFile]# echo "$date"
反引号与$()
[root@localhost ~]# echo `ls`
[root@localhost ~]# echo $(date)
单引号与双引号
[root@localhost ~]# name=sc
[root@localhost ~]# echo '$name'
[root@localhost ~]# echo "$name"
[root@localhost ~]# echo ‘$(date)'
[root@localhost ~]# echo “$(date)"
10.4 Bash的变量
10.4.1 用户自定义变量
1、 什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
2、 变量设置规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
变量用等号连接值,等号左右两侧不能有空格。
变量的值如果有空格,需要使用单引号或双引号包括。 如:name = 'shen chao'
在变量的值中,可以使用“\”转义符。
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。 如 name = $(date)
环境变量名建议大写,便于区分。
3、变量分类
用户自定义变量
环境变量:这种变量中主要保存的是和系统操作环境相关的数据。 (有一部分和系统相关的变量,名字不能修改,但是值可以修改。且可以新建新的环境变量)
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。(能改变值,但是不能新建)
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。(只能改值,也是不能新建)
4、本地变量
变量定义
[root@localhost ~]# name="shen chao"
变量叠加
[root@localhost ~]# aa=123
[root@localhost ~]# aa="$aa"456
[root@localhost ~]# aa=${aa}789
变量调用
[root@localhost ~]# echo $name
变量查看
[root@localhost ~]# set
查看当前系统全部变量
变量删除
[root@localhost ~]# unset name
如:
[root@localhost tongPeiFUFile]# aa=123
[root@localhost tongPeiFUFile]# echo $aa
123
[root@localhost tongPeiFUFile]# aa=${aa}456
[root@localhost tongPeiFUFile]# echo $aa
123456
[root@localhost tongPeiFUFile]# aa="$aa"789
[root@localhost tongPeiFUFile]# echo $aa
123456789
10.4.2 环境变量
1、环境变量是什么
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效
tips:pstree是以树结构显示进程(–display a tree of processes),也就是确定进程数量,显示是父shell还是子shell
提示:-bash: pstree: 未找到命令,那么root身份执行 yum install psmisc
2、设置环境变量
export 变量名=变量值
#申明变量
[root@localhost ~]# export aa=11
[root@localhost ~]# declare -p aa
declare -x aa="11"
表示:把aa生命为环境变量,并且赋值为11
env
#专门用于查询环境变量的(set是查询所有变量)
unset 变量名
#删除变量
echo $age
#调用变量
3、系统常见环境变量
PATH:系统查找命令的路径
如:
[root@localhost shFile]# bash hello2.sh
shuhongwang is the root
[root@localhost shFile]# ./hello2.sh
-bash: ./hello2.sh: 权限不够
[root@localhost shFile]# chmod 755 hello2.sh
[root@localhost shFile]# ./hello2.sh
shuhongwang is the root
[root@localhost shFile]# cd /root
[root@localhost ~]# /tmp/shFile/hello2.sh
shuhongwang is the root
[root@localhost ~]# cp /tmp/shFile/hello2.sh /bin/
表示把hello2.sh所在的环境加入PATH这个环境变量,这样就可以在任何位置直接运行hello2.sh
[root@localhost ~]# hello2.sh
shuhongwang is the root
如:
[root@localhost ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin: /sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PATH="$PATH":/root/sh
#PATH变量叠加
PS1:定义系统提示符的变量 (只能set才能看到,env看不到)
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
举例:
[root@localhost ~]# PS1='[\u@\t:\w ]'
[root@10:31:47:/tmp ]cd /tmp/shFile/
[root@10:31:53:/tmp/shFile ]cd /root
[root@10:32:18:~ ]PS1='[\u@\#:\t:\w ]\$ '
[root@localhost ~]# PS1='[\u@\t \w]\$ '
[root@04:50:08 /usr/local/src]#PS1='[\u@\@ \h \# \W]\$‘
[root@04:53 上午 localhost 31 src]#PS1='[\u@\h \W]\$ '
[显示当前用户名 显示当前用户名 显示当前所在目录的最后一个目录] 提示符
10.4.3 位置参数变量
1、 位置参数变量
例子1:
#!/bin/bash
num1=$1
num2=$2
sum=$(( $num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值
例子2:
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数
例子3:$*与$@的区别
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
x=$(( $x +1 ))
done
10.4.4 预定义变量
1、预定义变量
$? 返回最后一次执行命令的状态,0表示上一个命令正确执行,非0表示未正确执行,具体是哪个数,是有命令自己来决定的
$$ 当前进程的进程号 PID
$! 后台运行的最后一个进程的进程号PID
例子:
#/bin/bash
# Author: shenchao (E-mail: [email protected])
echo "The current process is $$"
#输出当前进程的PID。
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行,工作管理我们在系统管理章节会详细介绍
echo "The last one Daemon process is $!"
2、接收键盘输入
[root@localhost ~]# read [选项] [变量名]
选项:
-p(小写) “提示信息”:在等待read输入时,输出提示信息
-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会直接执行,不必等到回车才执行
-s: 隐藏输入的数据,适用于机密信息的输入
#!/bin/bash
#Author: shenchao (E-mail: [email protected])
read -t 30 -p "Please input your name: " name
#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is $name "
read -s -t 30 -p "Please enter your age: " age
#年龄是隐私,所以我们用“-s”选项隐藏输入
echo -e "\n"
echo "Age is $age "
echo -e "\n"
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用“-n 1”选项只接收一个输入字符就会执行(不用输入回车)
echo -e "\n"
echo " $name is $age olds, gender is $gender "
10.5 Bash的运算符
10.5.1 数值运算与运算符
1、 declare声明变量类型
[root@localhost ~]# declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
2、 数值运算
方法1 :
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22 #给变量aa和bb赋值
[root@localhost ~]# declare -i cc=$aa+$bb
方法2:expr或let数值运算工具
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr $aa + $bb)
#dd的值是aa和bb的和。注意“+”号左右两侧必须有空格
方法3:“$((运算式))”或“$[运算式]” (推荐)
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(( $aa+$bb ))
[root@localhost ~]# gg=$[ $aa+$bb ]
3、运算符
[root@localhost ~]$ aa=$(( (11+3)*3/2 ))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
[root@localhost ~]$ bb=$(( 14%3 ))
#14不能被3整除,余数是2
[root@localhost ~]$ cc=$(( 1 && 0 ))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0
10.5.2 变量测试与内容替换
例子1:测试x = $ { y - 新值}
[root@localhost ~]# unset y
#删除变量y
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x new
#因为变量y不存在,所以x=new
[root@localhost ~]# y=""
#给变量y赋值为空
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
[root@localhost ~]# y=old
#给变量y赋值
[root@localhost ~]# x=${y-new}
#进行测试 [root@localhost ~]# echo $x
old
10.6 环境变量配置文件
10.6.1 环境变量配置文件简介
1、source命令
[root@localhost ~]# source 配置文件
或
[root@localhost ~]# . 配置文件 (点和配置文件之间有空格)
其作用就是让修改的配置文件直接生效,配置文件不用关机重启才生效
2、环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
/etc/profile (对所有用户均生效)
/etc/profile.d/*.sh (对所有用户均生效)
~/.bash_profile (只对当前用户有效,~这个符号代表用户家目录)
~/.bashrc (只对当前用户有效,~这个符号代表用户的家目录)
/etc/bashrc(对所有用户均生效)
10.6.2 环境变量配置文件作用
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
tips:/etc 目录下的对所有用户都生效
~/.bash_profile 和 ~/.bashrc -> 每个用户自己的配置文件,只对用户生效。
下图为配置文件读取顺序:
上图从左到右如果没有叠加。后面的命令会覆盖前面的命令。
/etc/profile的作用:
USER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量: (最大能记录的历史命令的行数)
umask:
调用/etc/profile.d/*.sh文件
~/.bash_profile的作用 (如: /root/.bash_profile)
用了~/.bashrc文件。 定义系统别名
在PATH变量后面加入了“:$HOME/bin”这个目录
/etc/bashrc(只对登录时不需要输入密码的用户生效)
最主要是定义了:登录提示符
PS1变量(对所有用户有效)
umask(no login)
PATH变量(no login)
调用/etc/profile.d/*.sh 文件(no login)
10.6.3 其他配置文件和登录信息
1、 注销时生效的环境变量配置文件
~/.bash_logout
也就是用户注销时,进行的一些清空等处理,可以写到这个文件中
2、 其他配置文件
~/bash_history
所有敲过的命令(不包括此次登录时用的命令,要重启才生效)
3、 Shell登录信息
本地终端欢迎信息: /etc/issue
注意:登录之前显示的信息
远程终端欢迎信息: /etc/issue.net
1)转义符在/etc/ issue. net文件中不能使用
2)是否显示此欢迎信息,由ssh的配置文件etc/ssh/sshd_config决定,加入“ Banner etc/issue. net”行才能显示(记得重启SSH服务)
service sshd restart
注意:登录之前显示的信息
登陆后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息
注意:登录之后显示的信息