Linux 系统的管理和维护
谁在什么时候对资源做了什么样的操作
,这也是系统日志要记录的内容。不仅如此,系统还必须有能力禁止用户操作没有权限的资源。权限控制系统
中的专业术语: # 返回用户信息,检查用户是否存在:
id 用户名
# 创建用户组
groupadd 组名
# 创建用户
useradd -g 组名 用户名
# 给用户设置密码
passwd 用户名
# 删除用户 -r 表示将用户的家目录一起删除
userdel [-r] 用户名
命令名 | 作用 |
---|---|
chmod | 修改权限信息 |
chown | 修改文件或目录的所属主 |
chgrp | 修改文件或目录的所属组 |
# 创建 tom 用户
useradd tom
# 给 tom 设置密码
passwd tom
# 使用 tom 登录 Linux 系统
# 使用 root 账户新建文件,并修改权限
touch demo.txt
chmod 600 demo.txt
# 使用 root 账户 将 demo.txt 移动到 /tmp 目录下
mv demo.txt /tmp
# 使用 tom 账户查看 demo.txt
cat demo.txt
注意:对于可执行文件,即权限中带有 x 的文件,需要在前面加上
./
,方可执行。比如:现在 /tmp 目录下有 demo.sh 文件,其权限为 rwxr--r-- ,那么只要在 /tmp 目录中输入 ./demo.sh ,那么 demo.sh 就会执行,为什么?是因为需要 Linux 知道该文件的具体位置(其实是 $PATH 环境变量对应的解析器来执行的),当时输入 /tmp/demo.sh 也可以,或者使用对应的解析器 sh demo.sh。
# 使用 tom 账户在 /opt 目录下查看有没有 aaa 目录,如果没有此账户,请先自行创建:
cd /opt
# 使用 tom 账号新建 aaa 目录,提示权限不够
mkdir aaa
# 使用 sudo 命令临时提权被提示不在 sudoers 文件中
sudo mkdir aaa
# 通过 root 账户将需要提权的 tom 普通账户加入到 /etc/sudoers 文件中
vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(ALL) ALL
# 不需要重启系统,再次使用 tom 账户在 /opt 目录下创建目录 aaa,需要输入密码
sudo mkdir aaa
# 使用 root 账户修改 /etc/sudoers 文件:使用 sudo 命令就不需要再次输入密码了
vim /etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(ALL) NOPASSWD:ALL
注意: - 在同一次登录中,即使不加 NOPASSWD 也只需要输入一次密码,所以 NOPASSWD 是否生效需要退出登录后再重新登录来测试。 - 使用 sudo 提权后创建的目录仍然是 root root 权限,如果有需要那就还要使用 chown 或 chgrp 来修改。
# 启动服务
service 服务名 start
# 停止服务
service 服务名 stop
# 重启服务
service 服务名 restart
# 重新加载服务
service 服务名 reload
# 查看服务状态
service 服务名 status
# 查看服务列表
chkconfig --list
# 设置具体服务开机自动启动
chkconfig 服务名 on
# 取消具体服务开启自动启动
chkconfig 服务名 off
cat /etc/inittab
常用的运行级别是 3 或 5
。chkconfig 服务名 --level 运行级别数值
停止服务
,还需要 设置开机不自动启动
# 停止防火墙
service iptables stop
# 取消防火墙开机自动启动
chkconfig iptables off
systemctl start 服务名
systemctl restart 服务名
systemctl stop 服务名
systemctl reload 服务名
systemctl status 服务名
# 查看服务列表
systemctl list-unit-files
# 设置具体服务开机自动启动
systemctl enable 服务名
# 取消具体服务开启自动启动
systemctl disable 服务名
# 查看 CentOS 7 的运行级别
cat /etc/inittab
# 停止防火墙
systemctl stop firewalld
# 取消防火墙开机自动启动
systemctl disable firewalld
cat /etc/shells
/bin/sh
和 /bin/bash
。ll /usr/bin | grep bash$
echo $SHELL
.sh
作为扩展名#!/bin/bash # 第一行指定当前脚本的解析器
# 实现具体功能
echo "hello world"
其中,
.
是 source 的另一种写法,在当前进程中发布的全局变量可以在当前进程的其他脚本中继续沿用,也可以在子进程中使用;但是,子进程 export 发布的变量仅限于子进程内部使用
$USER
、$HOME
、$PWD
、$SHELL
等,可以使用 echo 命令输出它们的值。 echo $USER
echo $HOME
echo $PWD
echo $SHELL
set | less # less 可以分屏查看
自定义变量的 = 两边不能有空格
# 定义变量
USER_NAME=tom
# 使用变量
echo $USER_NAME
# 撤销变量
unset USER_NAME
# 声明静态变量(不能修改,不能撤销)
readonly SCHOOL=suzhoudaxue
$n
$0
表示当前脚本的名称,从 $1
开始代表对应的脚本参数,从 ${10}
开始数字需要使用 {}
括起来。 # vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
# 赋权
chmod 777 parameter.sh
# 执行
./parameter.sh cls xz
$#
vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo "$#"
chmod 777 parameter.sh
./parameter.sh cls xz
$*
和 $@
[root@fengge sh]# cat param2.sh
#!/bin/bash
# ------------------------------------------
echo '$* print'
for i in "$*"
do
echo "The parameters is: $i"
done
echo '$@ print'
for y in "$@"
do
echo "The parameter$x is: $y"
done
[root@fengge sh]# ./param2.sh a b c d
$* print //将所有参数作为一个整体进行打印,只循环一次
The parameters is: a b c d
$@ print //将所有参数单独处理,循环了4次
The parameter is: a
The parameter is: b
The parameter is: c
The parameter is: d
$?
# 1. 单引号括起来的字符都作为普通字符出现,特殊字符用单引号括起来后,也会失去原有的含义,作为普通字符
string='$PATH' # $PATH是系统变量,但是用单引号括起来,只是普通的字符
echo $string # 输出 $PATH
# 2. 双引号括起来的字符,除了 $ ` \ 三个仍然保留原有含义,其余字符均作为普通字符对待
# $ 变量替换
# ` 命令替换
# \ 转义字符
echo "My current dir is `pwd` and logname is $LOGNAME"
# 输出为:My current dir is /home/hadoop and logname is hadoop
# `pwd` 是shell命令,将输出结果返回
# $LOGNAME 是系统变量,将变量值输出
# ``括起来的内容被作为shell的命令执行,并将其标准输出的结果取代整个``部分
# 综合例子
a=1
echo "$a" # 1 $被bash解释到
$ echo "'$a'" # '1' 单引号失效
$ echo '$a' # $a
$ echo '"$a"' # "$a" 双引号失效
$((表达式))
或 $[表达式]
。echo $((1+2))
echo $[1+2]
# 写法一
test condition
写法二:condition 前后有空格,空字符串视为 false, 非空字符串视为 true
[ condition ]
数据类型 | 写法 | 单词 | 含义 |
---|---|---|---|
数值 | -lt | less than | 小于 |
数值 | -le | less equal | 小于等于 |
数值 | -eq | equal | 等于 |
数值 | -gt | greater than | 大于 |
数值 | -ge | greater equal | 大于等于 |
数值 | -ne | not equal | 不等于 |
文件 | -r | read | 判断当前用户是否可以读取该文件 |
文件 | -w | write | 判断当前用户是否可以修改该文件 |
文件 | -x | execute | 判断当前用户对该文件是否有执行权限 |
文件 | -f | file | 判断当前文件是否存在并且是一个常规的文件 |
文件 | -e | existence | 判断文件是否存在 |
文件 | -d | directory | 判断是否存在并且是一个目录 |
#!/bin/bash
# 条件判断表达式写法一:test
test 10 -gt 7
# 使用$?获取上一条语句的执行结果
echo $?
# 使用$?获取上一条语句的执行结果
test 10 -lt 7
echo $?
# 条件判断表达式写法二:[ condition ]
# 注意:condition两边要有空格
[ 10 -gt 7 ]
echo $?
[ 10 -lt 7 ]
echo $?
# 专门针对文件进行操作的运算符
[ -e aaa.txt ]
echo $?
[ -r aaa.txt ]
echo $?
[ -w aaa.txt ]
echo $?
# 条件 && 表达式1||表达式2
[ 10 -gt 5 ] && echo "10大于5" || echo "10小于5"
# 注意:if 后面有空格
if [ ... ]
then
...
fi
#!/bin/bash
if [ 10 -gt 5 ]
then
echo "10 大于 5"
fi
if [ ... ]
then
...
else
...
fi
#!/bin/bash
if [ 10 -gt 5 ]
then
echo "10 大于 5"
else
echo "10 小于 5"
fi
if [ ... ]
then
...
elif [ ... ]
then
...
else
...
fi
#!/bin/bash
if [ $1 -eq 5 ]
then
echo "$1 等于 5"
elif [ $1 -gt 5 ]
then
echo "$1 大于 5"
else
echo "$1 小于 5"
fi
for (( i =1;i<=10;i++ ))
do
echo $i
done;
#!/bin/bash
# 如果要使用外部数据,则需要将外部数据赋值给一个变量,不能在for语句中直接使用
len=$1
for (( i=1;i<=len;i++ ))
# 从do关键字开始是循环体开始
do
echo $1
# 到done关键字为止是循环体结束
done
for i in $*
do
echo $i
done
没有引号的
$*
和$@
一样,加了引号就有区别了。**“$*”**
不换行,**"$@"**
换行
while [ ... ]
do
...
done
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[Si+1]
done
echo $s
case expression in
pattern1)
statement1
;;
pattern2)
statement2
;;
pattern3)
statement3
;;
……
*)
statementn
;;
esac
- case、in 和 esac 都是 Shell 关键字,expression 表示表达式,pattern 表示匹配模式
- expression 既可以是一个变量、一个数字、一个字符串,还可以是一个数学计算表达式,或者是命令的执行结果,只要能够得到 expression 的值就可以
- pattern 可以是一个数字、一个字符串,甚至是一个简单的正则表达式
- case 会将 expression 的值与 pattern1、pattern2、pattern3 逐个进行匹配
- 如果 expression 和某个模式(比如 pattern2)匹配成功,就会执行这模式(比如 pattern2)后面对应的所有语句(该语句可以有一条,也可以有多条),直到遇见双分号;;才停止;然后整个 case 语句就执行完了,程序会跳出整个 case 语句,执行 esac 后面的其它语句。
- 如果 expression 没有匹配到任何一个模式,那么就执行)后面的语句(表示其它所有值),直到遇见双分号;;或者esac才结束。*)相当于多个 if 分支语句中最后的 else 部分
支持的正则语法:
$?
的方式获取,可以显式加:return 返回,return 后跟数值 n(0 - 255),如果超过则取255的余数#!/bin/bash
function sum() {
return $[$1+$2]
}
sum 10 20
echo "sum 10 20执行的结果是$?"
# 错误示范
#!/bin/bash
function sum() {
return $[$1+$2]
}
res=`sum 10 20`
echo "sum 10 20执行的结果是$res"
# 用变量接收,需要用echo输出
#!/bin/bash
function sum() {
echo $[$1+$2]
}
res=`sum 10 20` # 可以写成 res=$(sum 10 20)
echo "sum 10 20执行的结果是$res"
$1
和 $2
等方式获取,从 ${10}
开始需要使用大括号。 -t
用于指定输入等待时间,单位是秒。-p
用于指定提示文字。#!/bin/bash
read -t 10 -p "please enter:" NAME
echo $NAME
# rpm 查询命令:
rpm -qa | grep xxx
# rpm 卸载命令:
rpm -e xxx --nodeps
# rpm 安装命令
rpm -ivh xxx
# -y 对所有提问都回答“yes”
yum [-y] [参数]
yum 的参数说明: | 参数 | 功能 | | --- | --- | | install | 安装rpm软件包 | | update | 更新rpm软件包 | | check-update | 检查是否有可用的更新rpm软件包 | | remove | 删除指定的rpm软件包 | | list | 显示软件包信息 | | clean | 清理yum过期的缓存 | | deplist | 显示yum软件包的所有依赖关系 |
yum 镜像源修改:
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
# CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 清理缓存
yum clean all
# 生成缓存
yum makecache
rpm -qa | grep jdk
rpm -e java-1.8.0-openjdk-headless-1.8.0.312.b07-1.el7_9.x86_64 --nodeps
rpm -e copy-jdk-configs-3.3-10.el7_5.noarch --nodeps
rpm -e java-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64 --nodeps
rpm -e java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64 --nodeps
rpm -e java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64 --nodeps
rpm -qa | grep jdk | xargs rpm -e --nodeps
reboot
cd /opt
tar -zxvf jdk-8u152-linux-x64.tar.gz
cp /etc/profile /etc/profile.bak
vim /etc/profile
# 声明 JAVA_HOME 环境变量,等号两边不能有空格
JAVA_HOME=/opt/jdk1.8.0_152
# 给 PATH 环境变量附加 $JAVA_HOME/bin 部分
# $PATH 表示引用 PATH 环境变量以前的旧值
# 使用英文冒号连接
# $JAVA_HOME 表示对 JAVA_HOME 变量的引用
# $JAVA_HOME/bin 表示指向可执行文件
PATH=$JAVA_HOME/bin:$PATH
# 发布
# 发布是发布变量名,不是引用变量的值,所以前面不写 $ 符号
export JAVA_HOME PATH
source /etc/profile
rpm -qa | grep mariadb | xargs rpm -e --nodeps
注:MySQL 被 Oracle 收购,社区担心将来 MySQL 被 Oracle 关闭开源模式,和 Oracle 数据库一样变成商业化运作。所以社区开发了一个 MySQL 的社区版,内部和 MySQL 一样,只是名字不同,这就是 mariadb。但是我们当前在 Linux 系统中已经预装的 mariadb 只是一个残片,不能直接使用。所以还是要先卸载。
cd /opt/MySQL
rpm -ivh 01_mysql-community-common-5.7.29-1.el7.x86_64.rpm
rpm -ivh 02_mysql-community-libs-5.7.29-1.el7.x86_64.rpm
rpm -ivh 03_mysql-community-libs-compat-5.7.29-1.el7.x86_64.rpm
rpm -ivh 04_mysql-community-client-5.7.29-1.el7.x86_64.rpm
rpm -ivh 05_mysql-community-server-5.7.29-1.el7.x86_64.rpm
安装 MySQL Server的时候可能出现如下的异常: - 错误:依赖检测失败: libaio.so.1()(64bit) 被 mysql-community-server-5.7.29-1.el7.x86_64 需要。 - 通过 yum 安装缺少的依赖:yum install -y libaio 。
# 初始化
mysqld --initialize --user=mysql
# 查看 MySQL 的临时密码
cat /var/log/mysqld.log
# 启动 MySQL(MySQL 安装完默认是开机自动启动的,但是服务没有启动)
systemctl start mysqld
# 使用临时密码登录 MySQL ,之后修改密码
mysql -uroot -p'BcF,lAonl0F>'
set password=password('123456')
# 在 MySQL 服务器端设置允许任何主机地址访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION
# 重启 MySQL 服务
systemctl restart mysqld
# 解决字符乱码问题
# 查看字符相关变量
show variables like "%char%"
# 编辑 /etc/my.cnf 配置文件设置 MySQL 客户端和服务端的字符集为 utf8
[mysql]
default-character-set=utf8 # 新增
[mysqld]
character-set-server=utf8 # 新增
collation-server=utf8_general_ci # 新增
虚拟网络编辑器
。还原默认设置
(不保证和之前是同一个网段,所以大概率 IP 地址网段会变) 。虚拟网络编辑器
执行 还原默认设置
。还原默认设置
。让 VMWare 的虚拟网络编辑器重置网络连接。