1、找回root密码
-
开机按enter
-
按e进入
-
选第二个,按e
-
在后面添加 single, 按回车,注意single前有空格
-
按b键重启
-
输入 passwd 设置密码
1. 开机按e 2. 定位到 制定位置 追加 init=/bin/sh,按ctrl+x lang=zh_CN>UTF-8 3. mount -o remount,rw / 4. passwd root 然后输入两个密码 5. touch /.autorelabel 6. exec /sbin/init
2、vi/vim编辑器
1、一般模式
- dd 删除一行
- d5d 删除5行
- yy 复制一行
- y5y 复制5行
- p 粘贴
- u 撤销
- ctrl r 撤销撤销
- ^ 当前行开头
- $ 当前行结束
- gg 文件开头
- G 文件结尾
2、编辑模式
- i 当前位置插入(进入编辑模式)
- a 当前位置后插入(进入编辑模式)
- o 向下一行插入(进入编辑模式)
- ESC键 退出编辑模式
3、指令模式
-
:set nu 显示行号
-
?xxx 查找指定关键字 n/N 上下一个
-
:wq 保存件并退出
-
:!wq 强制保存并退出
-
ZZ 保存并退出
3、文件目录类
-
创建文件夹 mkdir dirName
-
创建多层文件夹 mkdir -p dirName
-
查看文件列表 ls -a (包隐藏文件)
-
查看文件列表详情 ll
-
创建文件 touch fileName
-
删除文件 rm -rf source
-
切换路径到bin下 cd bin/
-
回到上一级 cd ..
-
切换到绝对路径 cd /d/soft/
-
查看当前路径真实目录 pwd
-
查看文件 cat fileName
-
倒叙输出 tac fileName
-
查看文件后10行 tail -n 10 a.txt
- -f 实时监控变化
-
查看文件前10行 head -n 10
-
more
-
less
-
追加 echo aaa >> a.txt
-
重定向 echo a > a.txt
-
echo
- -e 转义“”号里面的字符,例如 echo -e "abc\tdef"
-
软链接 ln -s source dest
-
历史 history
-
复制 cp source dest
-
强制复制 \cp source dest
-
移动或改名 mv source dest
4、时间日期类
- 查看当前时间 date
- 查看当前日历 cal
- 指定格式时间 date "+%Y-%m-%d %H:%M:%S"
- 设置时间 date -s "20121111 20:20:20"
5、用户、组管理类
-
添加用户 useradd username
-
设置用户密码 passwd username
-
判断是否存在 id username
-
切换 su username
-
删除用户 userdel username
-
查看登录用户的信息 who/who am i /whoami
-
设置普通用户有root权限
-
修改 /etc/sudoers ,在root后添加一行
root ALL=(ALL) ALL user ALL=(ALL) ALL
-
-
查看所有用户 cat /etc/passwd
-
修改用户 usermod -g 用户组 用户名
-
新增组 groupadd 组名
-
删除组 groupdel 组名
-
修改组 groupmod -n newName oldName
-
查看所有组 cat /etc/group
6、权限
- 改变权限
- chmod u+rwx g+rwx o+rwx a.txt
- chmod a+rwx a.txt
- chmod 777 a.txt
- 改变所有者 chown userName fileName
- 改变所属组 chgrp groupName userName
7、fdisk
-
有两种磁盘结构
- IDE: 标识为: hdxn
- SCSI: 标识为 sdxn x代表第几块硬盘[a开始],n代表第几个分区[1开始]
-
查看分区详情 fdisk -l
-
查看所有挂载情况 lsblk
-
查看硬盘使用情况 df -TH
-
目录磁盘使用情况 du -h /目录 例如 du -ach --max-depth= 1 /usr
-
-s 指定目录占用大小汇总
-
-h 带计量单位
-
-a 含文件
-
-max-depth=1 子目录深度
-
-c 列出明细的同时,增加汇总值
-
-
增加一块新硬盘
-
分区 fdisk /dev/sdb
- m 显示命令列表
- n 新增分区
- d 删除分区
- w 写入并退出
- p 显示磁盘分区
-
格式化 sdb1 mkfs -t ext4 /dev/sdb1
-
挂载 mount /dev/sdb1 /home
-
卸载 umont 挂载路径或者挂载硬盘
-
永久挂载 vim /etc/fstab 添加一行
/dev/sdb1 /home ext4 defaults 0 0
-
8、crontab
-
开启服务 service crontab start
-
操作 crontab
-
-e 编辑
-
-l 查看
-
举例
crontab -e * * * * * date >> /home/date.log 分 时 天 月 周几 第几分钟 那个小时 每月中的那一天 每年的那一个月 没有的星期几 */3 10-15 1,15 * * date >> /home/date # 每3分钟 # 每天的10到15点 # 每月1和15号
-
9、搜索查询
-
find /home -name "java.jar" -user user -size +2048
-
which ls
-
whereis start-dfs.sh
-
locate: 快速查询,不扫描整个文件系统,需要定期更新locate数据库 updatedb
-
grep
-c:只输出匹配行的计数。
-I:不区分大小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
10、进程、网络状态
- 查看进程 ps -ef | grep ''"
- 查看进程 ps -aux
- 动态进程【查看内存】 top
- 杀死进程【强制】 kill -9 pid
- 进程树 pstree
- io进程 iotop
- io进程树 iotree
- 网络状态【端口占用】 netstat -antp
- 那些端口在监听 netstat -tlnp
11、ssh免密
步骤:
1. 进入目录 cd /root/.ssh
2. 生成私钥和公钥 ssh-keygen -t rsa
3. 创建授权文件 touch authorized_keys
4. 将公钥写入授权文件 并发送到其他虚拟机
5. 保证在其他虚拟机的/root/.ssh/authorized_keys中有本虚拟机的公钥即可,
这样就能在本虚拟机对另一台虚拟机进行免密ssh访问
6. /root/.ssh/下的文件有
1. authorized_keys
2. id_rsa
3. id_rsa.pub
4. known_hosts
普通用户ssh访问
1. 切换到普通用户家目录 /home/xing/.ssh/
2. 生成公钥,私钥,写入授权文件并发送
ssh-keygen -t rsa
cat id_rsa.pub > authorized_keys
ssh-copy-id node002
3. 注意.ssh 和 里面文件的权限
chmod 700 .ssh
chmod 600 .ssh/*
4. 如果还是因为权限问题登录不上
sudo ssh node002
12、虚拟机网络配置
配置虚拟机网络 三大步
- windows 网络适配器 -- VMnet8 -- IPv4
ip 地址 192.168.10.1
子网掩码 255.255.255.0
默认网关 192.168.10.2
DNS 8.8.8.8 - 虚拟机虚拟网络设置
VMnet8 -- NAT模式--更改设置
子网IP 192.168.10.0
子网掩码 255.255.255.0
NAT设置
网关IP: 192.168.10.2 - ifcfg-eth0
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.10.201
GATEWAY=192.168.10.2
PREFIX=24
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
DNS1=192.168.10.2 # 这个和网关一致
13、系统配置
-
修改主机ip vi /etc/sysconfig/network-scripts/ifcfg-eth0
-
修改主机名 vi /etc/sysconfig/network
-
修改mac地址 vi /etc/udev/rules.d/70-persistent-net.rules
-
重启网络服务 service network restart
-
关闭防火墙 service iptables stop(start)
-
查看防火墙状态 service iptables status
-
关闭防火墙开机自启 chkconfig iptables off(on)
-
查看防火墙开机自启状态 chkconfig iptables --list
-
开机自启级别设置 chkconfig iptables --level 3,6 on
-
查看ip ifconfig
-
查看主机名 hostname
-
修改主机名 vi /etc/sysconfig/network
-
配java环境变量 vi /etc/profile
|export JAVA_HOME=/home/soft/jdk/jdk-1.8 |export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:$PATH |export CLASSPATH=${JAVA_HOME}/lib:${JAVA_HOME}/jre/bin:$CLASSPATH
-
刷新 source /etc/profile source是关键字,不是命令
-
修改hosts vim /etc/hosts
-
别名 alias
-
查看所有java进程 jps
-
执行上次以find开头的命令 !find
-
防止小键盘中文乱码 export TERM=ansi
14、yum/rpm
- yum安装程序 yum -y install git
- yum搜索程序 yum list | grep 'firefox'
- rpm查看程序 rpm -qa | grep "jdk"
- rpm卸载程序 rpm -e --nodeps
rpm -qa | grep "jdk"
- rpm程程序安装 rpm -ivh .....
- -i 安装 install
- -v 日志 verbose
- -h 刷新 hash
15、压缩
-
zip压缩 gzip source
1. 只压缩文件,不压缩目录,不保留原文件,压缩为.gz文件 -
zip解压 gunzip source.gz
1. 解压.gz文件,不保留原文件 -
zip压缩 zip -r test.zip file1 file2 file3
1. 将这三个文件压缩到test.zip,压缩目录,保留原文件 -
zip解压 unzip -d dest source.zip
1. 解压.zip文件到指定目录 -
tar压缩 tar -zcvf source 打包成 *.tar.gz
-
tar解压 tar -zxvf source 解压 *.tar.gz
<-C dest> 解压到指定目录
16、mysql安装卸载
- Q/A 重装mysql
- 查mysql
rpm -qa | grep -i mysql
- 卸载mysql
rpm -e --nodeps mysql名字
- 手动卸载
whereis mysql
查出mysql所有目录,并删除 - 查找mysql
find / -name mysql
- 安装
rpm -ivh Mysql-server
- 查mysql
17、 上传下载
-
安装、上传、下载
yum install -y lrzsz rz sz a.txt
18、 grep
alisa grep='grep --color=auto' 添加颜色 关键字 颜色
grep "a\|b" 多个条件 同时匹配ab
grep -v "#" 反向过滤
grep -n 显示行号
grep -l 只显示文件名
19、sed
- 流编辑器,一次处理一行
- 替换,删除
# 1. 修改所有的79 变为 80
sed -i "s/79/80/" a.txt
# 2. 删除
sed -i "/^$/d" a.txt
sed --help
-
标准输出 sed 'p' a.txt 默认缓存,打印两边
-
取消标准输出 sed -n 'p' a.txt 打印一边
-
向下添加 sed '1a hello' a.txt 再所有包含c的行的下方添加hello
-
向上添加 sed '/c/i hello' a.txt 在包含c的行的上方添加一行 hello
-
删除 sed '/c/d' a.txt 删除所有包含c的行
-
替换 sed 's/c/C/' a.txt 将所有行的首单词的c-->C
-
直接写入文件 sed -i 's/[tT]/S/' a.txt 替换所有行首单词的t或者T -->S 并保存文件
-
执行多条命令 sed -e 'expr1' -e 'expr2' a.txt
-
匹配全部 加g sed 's/c/C/g' a.txt 将a.txt里的所有c-->C
-
保留字替换(换中间) sed 's/(lo)cal(host)/\1ve\2/g' hosts 将所有 localhost --> lovehost
sed 's/localhost/lovehost/' hosts
sed 's/ (lo) cal (host) / \1 ve \2 /' hosts -
替换(换两边) sed 's/local/--&--/g' hosts 将所有 local--> --local--
-
几次到几次 x{m,n} m, ,n
-
取反 : 删除不包含local的行 sed '/local/!d' a.txt
20、cut
-
每次读一行
-
cut -d : -f 2 分隔符 , 取第几列, 默认制表符分割
21、awk
- 文本分析工具,把文件逐行读入,默认分隔符是空格或制表符
- awk -F :
-
格式: awk
-
awk '{print}' 默认分隔符是空格或tab,默认打印全部,等同于$0
-
awk -F":" '{print $1}' /etc/passwd
-
内置变量 NR NF FS
awk -F":" '/^root/{print "分隔符:"FS "\t行号: "NR "\t\t用户名: "$1 "\t\t家目录"$(NF-1)}' /etc/passwd -
awk 'BEGIN[count=0]{print count}END{print "结束"}' /etc/passwd
-
正则+ BEGIN END
awk '/root/{count++}END{print count}' /etc/passwd 默认count是0,但是最好要给它初始化 -
if
awk '{if($1>$2){print}}' c.txt -
if else if else
awk '{if($1>$2){print $1" > "$2}else if($1<$2){print $1" < "$2}else{print $1" = "$2}}' c.txt -
while
awk '{n=1;while(n<=NF){print $n}}' b.txt -
for
awk '{for(i=1;i<NF;i++){print $i}}' b.txt -
for+if
awk '{for(i=1;i<=NF;i++){print $i;if(i==1){continue}else{break}}}' b.txt
10 for
awk '{name[x++]=$2}END{for(i in name){print name[i]}}' b.txt
awk '{name[x++]=$2}END{for(i=0;i<NR;i++){print name[i]}}' b.txt
awk '{name[$1]=$2}' ............................................
awk '{name[$2]++}END{for(i in name){print i,name[i]}}' b.txt === workcount [这就是以字符作为下标]
-
awk内建函数 sub : 只会找第一个
awk '{sub(/hello/,"hi");print}' y.txt -
内建函数 gsub : 全文替换
-
index(String,"testString") 第一次出现的下标的偏移量
awk '{print index($1,"e")}' z.txt -
字符串的长度 length(Str)
字符串的长度 awk '{print length($2),$2}' y.txt
每条记录的长度 awk '{print length}' y.txt -
截取 substr(Str,index,len) 偏移量从0开始,截取几个,不够的就空着
awk '{print $2,substr($2,2,6)}' z.txt 从2开始截取,截取6个
22、正则表达式
-
[^a-f] 取反 除了a-f之外的字符
-
[a-z0-9]
-
[0-9]{,10} 0-9,不能超过10位
-
<the> 匹配单词the <>代表单词边界 the thee three reethe 只能匹配到the
-
^word : 开头 ,脱字符加work: 搜索以work开头的内容
work$ 结尾
^$ 空行
"" 空格
. 任意一个字符,可代替空格,不能代替空行
\ 转义符* 0次或多次
.* 包含所有,除了空行
^.* 0个或多个开头{} 次数 {2} {2,} {,5}
bre 基本正则 ere 扩展正则
区别: 元字符的不同
基本正则:$^.[]*
扩展正则:(){}?+|
23、 ntp时间同步
- 必须是root用户
- 原理: 把时间服务器配好就行了,其他的服务器只需要执行同步命令就ok
- 注意: 只有服务器节点开ntpd服务,其他不开
-
时间服务器
-
rpm -qa|grep ntp
-
yun -y install ntp
-
vi /etc/ntp.conf
# 第一处 #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap为 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # 第二处 server 0.centos.pool.ntp.org iburst server 1.centos.pool.ntp.org iburst server 2.centos.pool.ntp.org iburst server 3.centos.pool.ntp.org iburst为 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst # 第三处 server 127.127.1.0 fudge 127.127.1.0 stratum 10
-
vim /etc/sysconfig/ntpd
# 让硬件与系统时间一起同步 SYNC_HWCLOCK=yes
-
重新启动ntpd服务 service ntpd restart
-
-
其他节点
crontab -e */1 * * * * /usr/sbin/ntpdate node1
24、rsync/xsync 集群同步
- 创建脚本 xsync
- 修改权限 chmod 777 xsync
- 发送到 /bin/
- rsync 参数 user@ndode:dir
- -r 递归 recursion
- -v 显示过程 view
- -l 拷贝链接符号 ln
#!/bin/bash
if(( $# == 0 ));
then
echo no args;
exit;
fi
fdir=`cd -P $(dirname $1);pwd`;
fname=`basename $1`;
user=`whoami`
echo $user;
echo $fdir;
echo $fname;
for((i=1;i<4;i++));
do
echo ---------------node00$i----------------
rsync -rvl $fdir/$fname $user@node00$i:$fdir;
done
25、yum ss代理
-
前提
- 宿主机ip 192.168.10.1
- 虚拟机ip 192.168.10.103
-
宿主机启动ss,并配置
-
虚拟机配置 /etc/yum.conf
26、shell编程
#!/bin/bash
arr=()
arr[0]=1
arr[1]=2
arr[2]=3
name=curryhelloy
# 数组长度
echo ${#arr[*]} # 3
# 字符串长度
echo ${#name} # 11
# 截取str
echo ${name:0:3} # cur
# 查找str
echo `expr index $name y` # 5
# 输出arr
echo ${arr[*]} # 1 2 3
echo ${arr[@]} # 1 2 3
# echo
echo -e "hello\c"
echo "hi\t\n"
一、变量
-
定义 变量名=值 变量名用字母数字下划线,数字不能开头,建议大写变量名
-
赋值
a. 普通赋值 NAME='张三'
b. 使用$()或反引号`` NAME=$(ls) NAME=ls
c. 伪赋值 let NAME='李四' 只是这一行是李四,其它还是张三
d. 单引号和双引号的区别:
单引号: 对所有特殊字符脱义,所有特殊字符只代表字符,没有了含义,so,'$NAME' 只是代表字符串
双引号: 只对空格脱义 -
修饰
a. unset 变量名 -- 撤销变量
b. readonly 变量名 -- 只读变量,无法unset
c. export 变量名 -- 提升为全局变量,在文件里定义后,要source将该文件立即生效 -
位置参数变量
a. $n
$0: 代表命令本身
$1~$n 代表第1~n个参数 大于10时,用{}包括如:$b. $#/$* 代表所有参数,*作为一个整体 ,#所有参数是独立的
c. $# 代表所有参数的个数
-
预定义变量
a. $? 上一次运行是否正确 0 is true,1 is false ,其他为语法错误 数字有系统决定b. $$ 当前进程(脚本)的PID
c. $! 后台最后一个进程的PID
-
运算符
由于 `` 和 $() 是执行命令的
a. expr
a. 1+1 expr 1 + 1 -- 2
b. 3-(3*4)expr 3 - $(expr 3 \* 4 )
b. $(())
a. 3-(34) $((3-(34)))c. $[]
a.3-(34) $[3-(34)] -
条件判断 数字比较 用 -lt -gt -eq -ne 字符用 = !=
a. [ condition ] echo $?b. 三元运算符 : [ condition ] && true || false
c. 判断运算: -lt小于 -le小于等于 -gt大于 -ge大于等于 -eq等于 -ne不等于 [1 -ne 2]
-rwx 读 写 执行 [ -rwx a.txt ]
-fde 文件 文件夹 存在 [ -ef a.txt ]
d. 或与非 -o -a !
[ ! expr ] [ expr1 -a expr2 ] [ expr1 -o expr2 ]
[[ ! expr ]] [[ expr1 && expr2 ]] [[ expr1 || expr2 ]]
[[ 1 -eq 2 || "xing" = xin? ]] echo $? --> 0if (( 1 == 1 )) #[ 1 -eq 1 ]
-
if
if [ condition ]
then ...
elif [ conditon ]
then ...
else ...
fi -
case
case $1 in- ... ;; 值可以不用双引号,如果是简单值的话
a) ... ;;
*) ... ;;
esac
- ... ;; 值可以不用双引号,如果是简单值的话
-
for
for var in list do ...donefor(( i=1;i<10;i++ )) do ... done
for i in $* do ... donefor n in 1 2 3 4 5 6 7
do
echo $n
done
类似于java
for(Integer n : n[1,2,3,4,5,6] )
String[] str = new String[]; -
while [ condition ] do ... done
-
read -p 'placeholder' -t 5 var
-
函数 必须先定义后使用,因为shell是解释语言,从上往下,逐行运行
a. 系统函数
1. basename [String | PathName][suffix] 截取文件名
2. dirname [String | PathName] 截取最后一层目录
b. 自定义函数 function funName(){} -
变量的区域 像输出1906A
A=1906
echo "${A}A" -
上传下载
yum -y install lrzsz
rz / sz name -
多行注释
:>>E
...
E