环境变量是指
当我们配置了环境变量后, 执行相应的命令,告诉系统命令搜索的文件夹,当我们执行一个命令的时候,默认从当前路径开始查找,如果当前路径找不到对应的命令文件,从环境变量$PATH查找
$PATH
的配置文件在 /etc/profile
下source /etc/profile
RedHat Package Manager,它属于红帽的一种包管理方式
通过RPM命令安装软件
rpm -ivh jdk-8u231-linux-x64.rpm
查询软件
rpm -qa | grep jdk
rpm -q jdk
卸载
rpm -e jdk-1.8.0_231-fcs.x86_64
需要手动配置Java的环境变量
进入到文件中:vim /etc/profile
在最后添加相应的信息
export JAVA_HOME=/usr/java/1.8.0_231
export PATH=$JAVA_HOME/bin:$PATH
重新加载配置文件
source /etc/profile
查看java的PATH配置信息
echo -$PATH
-/usr/java/1.8.0_231/bin:/usr/local/sbin:/usr/local/bin:/usr/sb
in:/usr/bin:/root/bin
即配置成功
配置JAVA_HOME
打开配置文件
文件最后添加
export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64
export PATH =$JAVA_HOME/bin:$PATH
让配置文件生效
解压文件
拷贝到/opt/bdp目录下
mkdir -p /opt/lucky
cp -r apache-tomcat-7.0.61 /opt/bdp
启动tomcat
cd /opt/bdp/apache-tomcat-7.0.61/bin/
./startup.sh
#----------安装Mysql依赖【perl net-tools】
yum install perl net-tools -y
#----------卸载mariadb
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
#----------安装mysql
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
#----------启动mysql
systemctl start mysqld
#----------查找密码并登陆Mysql
cat /var/log/mysqld.log | grep password
mysql -u root -p
#----------修改Mysql密码 5.0版本输入命令:
set global validate_password.policy=LOW;
set global validate_password.length=6;
#更改加密方式
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
#更新用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
#刷新权限
FLUSH PRIVILEGES;
#----------修改Mysql密码 5.7版本输入命令:
set global validate_password_policy=LOW;
set global validate_password_length=6;
alter user root@localhost identified by '123456';
#----------修改Mysql链接地址
use mysql;
update user set host='%' where user = 'root';
commit;
exit;
systemctl restart mysqld;
#----------使用Navicat连接Mysql
对于三剑客的理解:
awk、grep、sed是linux操作文本的三大利器,合称文本三剑客,也是必须掌握的linux命令之一。三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂。grep更适合单纯的查找或匹配文本,sed更适合编辑匹配到的文本,awk更适合格式化文本,对文本进行较复杂格式处理。
总结:
cut
sort
wc
可以对文本进行搜索
同时搜索多个文件
显示匹配的行号
显示不匹配的忽略大小写
使用正则表达式匹配
对sed的使用理解:
sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i。
功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作
Sed 是Stream Editor(字符流编辑器)的缩写,简称流编辑器
Sed软件从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一
行…
一次一行的设计使得sed软件性能很高
vi命令打开文件是一次性将文件加载到内存
了解即可
https://www.cnblogs.com/chensiqiqi/p/6382080.html
行的选择模式
增
删
改
它不是一个剑客,它是一门语言
了解即可
https://www.cnblogs.com/chensiqiqi/p/6481647.html
模式与动作
awk -F ":" 'NR>=2&&NR<=6' /etc/passwd
awk -F ":" '{print NR,$1}' /etc/passwd
awk -F ":" 'NR>=2&&NR<=6 {print NR,$1}' /etc/passwd
awk -F ":" 'NR==1{print NR,$1}NR==2{print NR,$NF}' /etc/passwd
对于Shell的理解:
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至编写一些程序。
Shell是命令解释器(command interpreter),是Linux操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户,下图所示用户、shell和操作系统的关系:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aboZAqei-1655131018137)(大数据开发.assets/20201102213118.png)]
Kernel
Linux内核主要是为了和硬件打交道
Shell
命令解释器(command interpreter)
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的
# cat /etc/shells
Shell种类
常见的Shell两大主流
#! 声明Shell文件
#!/bin/bash
echo "Hello World !"
直接打开脚本文件(绝对或者相对路径)
./hello.sh
要求文件必须是可执行文件
使用sh命令执行文件
sh hi.sh
即使文件不具有执行权限,也可以被调用
使用source命令执行文件
source byte.sh
三种方式的区别与联系
前面两种方式其实都是一样的:都是在当前父进程下的子进程中执行,子进程完成后,子进程中的各项变量或操作将会结束而不会传回到父进程中,具体的效果就是执行后再看脚本中的两个变量,在父进程中不起作用!
测试代码如下
vi var.sh
#!/bin/bash
echo "hello var1"
echo $hello
echo "hello var2"
设置变量
hello=admin
执行命令
[root@basenode ~]# ./var.sh
hello var1
hello var2
[root@basenode ~]# sh var.sh
hello var1
hello var2
[root@basenode ~]# source var.sh
hello var1
admin
hello var2
第三种是不会出现这种问题是因为是在一个进程(shell)中进行的,只有source在当前进程执行脚本时,所有可以继续使用当前进程的变量
前两种方式时开启了一个新进程执行脚本,原来进程的变量就访问不到了
解决方案:
export
可以让子进程继续使用父进程的变量
将来配置profile的时候 所有的变量前必须加export
注意:因此:如要想不注销系统,并让全局配置文件生效,则必须用source命令:
比如说: 在全局配置文件中/etc/profile添加了JAVA_HOME,要让他对整个环境生效
export JAVA_HOME=/usr/java/jdk1.7.0_75,就必须执行source /etc/profile
代码测试
[root@basenode ~]# export password=123456
[root@basenode ~]# echo $password
123456
[root@basenode ~]# vi var.sh
[root@basenode ~]# ./var.sh
hello var1
123456
hello var2
[root@basenode ~]# sh var.sh
hello var1
123456
hello var2
[root@basenode ~]# source var.sh
hello var1
123456
admin
hello var2
# 变量的声明
name="zhangsan"
for file in `ls /etc`
或
for file in $(ls /etc)
# 变量的调用
echo $name
echo ${name}
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
# 只读变量 /bin/sh: NAME: This variable is read only. 也不能删除
url="https://www.google.com"
readonly url
url="https://www.runoob.com"
# 删除变量
unset name
# 声明字符串
str1="hello world 1"
str2='hello world 2'
# 字符串拼接--双引号
name='sunwukong'
name1="hello, "$name" !"
name2="hello, ${name} !"
# 字符串拼接--单引号
passwd='123456'
passwd1='hello, '$passwd' !'
passwd2='hello, ${passwd} !'
echo $passwd2 # hello, ${passwd} !
# 字符串的长度
email="[email protected]"
echo ${#email}
echo ${email:1:4}
# 定义数组 括号来表示数组,数组元素用"空格"符号分割开
数组名=(值1 值2 ... 值n)
favs=("足球" "蓝球" "乒乓球球" "保龄球")
# 读取数组 ${数组名[下标]}
fav=${favs[1]}
# 使用 @ 符号可以获取数组中的所有元素
echo ${favs[@]}
# 获取数组的长度
length1=${#favs[@]}
length2=${#favs[*]}
#--------------------------------------------
# 这是一个注释
# author:
# site:
#--------------------------------------------
##### 服务器配置-start #####
#
#
#
#
#
##### 服务器配置-end #####
# 特殊的多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
:<<!
注释内容...
注释内容...
注释内容...
!
参数处理 | 参数说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$0 | 执行的文件名 |
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
# ./hello.sh 11 22 33 44
运算符的分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EeeAv1MI-1655131018139)(大数据开发.assets/1655119980556.png)]
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KDtigNcA-1655131018140)(大数据开发.assets/1655120004102.png)]
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6w8rASru-1655131018140)(大数据开发.assets/1655120061668.png)]
#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IiNwrKVN-1655131018141)(大数据开发.assets/1655120080169.png)]
#!/bin/bash
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctceIFuA-1655131018142)(大数据开发.assets/1655120096278.png)]
#!/bin/bash
file="/var/node/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
#!/bin/bash
## 第一个函数------------------------------
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
## 函数返回值------------------------------
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
# 函数返回值在调用该函数后通过 $? 来获得。
echo "输入的两个数字之和为 $? !"
## 函数参数------------------------------
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9
0 | halt (关机) |
---|---|
1 | Single user mode(单用户模式) |
2 | Multiuser, without NFS(多用户模式,但是无网络状态) FS–>FileSystem |
3 | Full multiuser mode(多用户完整版模式) |
4 | unused (保留模式) |
5 | X11(用户界面模式) |
6 | reboot(重启模式) |
id:3:initdefault:
默认runlevel为3,以runlevel=3开始启动对应的服务和组件rc.local
chkconfig
#!/bin/bash
#chkconfig: 2345 88 99
#description:auto_run
# 开机自启动同步时间
yum info ntp && ntpdate cn.ntp.org.cn
在系统服务中心,crond负责周期任务
systemctl status crond.service
添加任务,编辑当前用户的任务列表
crontab -e
编辑任务
**** command
举例
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */2 * * * /usr/local/etc/rc.d/lighttpd restart
每两小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache
--(功能描述:显示年月日时分秒
重启crontab,使配置生效
通过crontab -l
查看任务的历史
清除任务
#!/bin/bash
## -bash: ./bdp.sh: /bin/bash^M: bad interpreter: No such file or directory
## vim或者vi的命令模式下,输入命令 set fileformat=unix 即可解决换行问题
## sed -i "s/\r//" init.sh
echo -e "\e[1;31m【----------------------------------------在opt和var创建bdp文件夹\e[0m"
sleep 1
mkdir -p /opt/bdp
mkdir -p /var/bdp
mkdir -p /usr/local/script
echo -e "\e[1;31m【----------------------------------------禁用防火墙】\e[0m"
sleep 1
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
echo -e "\e[1;32m【----------------------------------------修改selinux】\e[0m"
sleep 1
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
echo -e "\e[1;32m【----------------------------------------安装wget】\e[0m"
sleep 1
yum install wget -y
echo -e "\e[1;33m【----------------------------------------修改yum源】\e[0m"
sleep 1
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
echo -e "\e[1;33m【----------------------------------------安装常用软件】\e[0m"
yum install man man-pages ntp vim lrzsz zip unzip net-tools telnet perl -y
echo -e "\e[1;34m【----------------------------------------同步系统时间】\e[0m"
yum info ntp && ntpdate cn.ntp.org.cn
echo -e "\e[1;34m【----------------------------------------DNS域名配置】\e[0m"
sleep 1
echo "192.168.88.100 basenode" >> /etc/hosts
echo "192.168.88.101 node01" >> /etc/hosts
echo "192.168.88.102 node02" >> /etc/hosts
echo "192.168.88.103 node03" >> /etc/hosts
echo -e "\e[1;34m【----------------------------------------安装JDK】\e[0m"
sleep 1
rpm -ivh jdk-8u231-linux-x64.rpm
echo 'export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
echo -e "\e[1;35m【----------------------------------------安装Tomcat】\e[0m"
sleep 1
tar -zxf apache-tomcat-8.5.47.tar.gz
mv apache-tomcat-8.5.47 /opt/bdp/
echo -e "\e[1;35m【----------------------------------------安装Mysql】\e[0m"
sleep 1
rpm -e --nodeps `rpm -qa | grep mariadb`
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
systemctl start mysqld
systemctl enable mysqld
temppasswd=`grep "A temporary password" /var/log/mysqld.log | awk '{ print$NF}'`
mysql -uroot -p$temppasswd --connect-expired-password << EOF
set global validate_password_policy=low;
set global validate_password_length=6;
alter user root@localhost identified by '123456';
use mysql;
update user set host='%' where user = 'root';
commit;
quit
EOF
systemctl restart mysqld
echo -e "\e[1;35m【----------------------------------------安装Nginx】\e[0m"
sleep 1
echo -e "\e[1;36m【----------------------------------------设置开机启动项】\e[0m"
sleep 1
touch /usr/local/script/auto_ntpdate.sh
echo '#!/bin/bash' >> /usr/local/script/auto_ntpdate.sh
echo 'yum info ntp && ntpdate cn.ntp.org.cn' >>/usr/local/script/auto_ntpdate.sh
chmod u+x /usr/local/script/auto_ntpdate.sh
echo '/usr/local/script/auto_ntpdate.sh' >> /etc/rc.local
chmod u+x /etc/rc.local
echo -e "\e[1;36m【----------------------------------------设置定时任务,更新时间】\e[0m"
echo -e "\e[1;36m【----------------------------------------删除文件】\e[0m"
sleep 1
rm -rf apache-tomcat-8.5.47.tar.gz
rm -rf jdk-8u231-linux-x64.rpm
rm -rf mysql*
rm -rf *.sh
echo -e "\e[1;36m【----------------------------------------关闭计算器,拍快照】\e[0m"
sleep 1
shutdown -h now
##三台主机分别生成秘钥
【123】ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
##host验证
【123】vim /etc/ssh/ssh_config 在最后添加
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
##将秘钥分别拷贝给自己和别人
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03
123456
##关闭主机拍摄快照
power off