一切皆文件。
两条权限原则:
su是切换用户,而sudo则是用root权限执行某操作( 普通用户+sudo=安全)
Linux目录
没有返回值就是成功:执行Linux命令,无返回值即成功,有反回值有可能成功也有可能失败。
关机前需要先同步数据
sync #同步数据
shutdown -h now #立即关机
shutdown -h 1 #1分钟之后关闭计算机
reboot #立即重启
在众多Shell中,Linux系统中的文件系统因为不同的类别,颜色都是不一样的。
r4、w2、x1:读写执行分别对应二进制111。
记住、用户目录 /etc/passwd
只有当要修改文件时才需要vim,其余时cat即可、或者head、less。
ping百度检查设备是否联网
ping baidu.com
tab提示很好用,单机或者双击的规则我已领悟。
-h在Linux中是非常重要的一个参数,其在绝大多数情况下都表示显示计量单位,即可以以人可以读懂的方式去显示。如:
ls -lh
df -h #查看磁盘使用情况
du -h #查看指定的目录(默认是当前目录)下的文件占用空间情况
清空或者截断文件
> a.txt
或者
echo "" > a.txt
日常使用which来查询指令出处。
第三方软件安装应所在位置:/opt
ls指令
ls -alh #隐藏文件、长列表、方便阅读
ls -R #递归子目录
ls -r #反序显示
ls -S #Size,以文件大小顺序输出
ls -t #按修改时间
'注意
-r:reverse
-R:Recursive,常用于连续递归子目录
mkdir递归创建目录
mkdir -p demo/{1..100}
rmdir:仅能删除非空的目录。
rm详解
'技巧'
rm -rf /tmp #删除这个目录
rm -rf /tmp/* #删除这个目录下的所有文件,但不包括这个文件本身
文件查看汇总
cat # 第一行开始查看文件
tac # 倒序
nl # 显示行号(相当cat -n)
more #
less #一页一页的显示,比more更好
head -5 #头
tail -10 #尾
cat、tac详解
cat -n txt '显示行号'
cat a1 a2 a3 ... '拼接文本'
cat > a.txt '等待输入,并且重定向至新文本'
tac #反序cat
head与tail
head -5 txt
tail -5 txt
tail -f txt '实时查看文件末尾'
less指令
'less中查找文本'
/abd "向下查找
?abc "向上查找
n 下一条 N 上一条
sort与uniq
ls -l | sort
ls -l | sort -r #倒序
sort a.txt | uniq -c '-c为--count,统计重复行数
uniq -d #只输出重复行
uniq -i #忽略大小写
cut详解
"参数:-f输出字段,-c输出范围字符"
ls -lh | cut -d " " -f 1 | cut -c 2-10
'awk分割:以空格为分隔符( 连续空格都能算作一个 ),然后写awk表达式(支持C语言)
ls -lh | awk -F ' ' '{print $5,$9}'
#或者
ls -lh | awk -F ' ' '{printf("%s\t%s\n",$5,$9)}'
df与du磁盘查看
df -h 'df查看整个系统'
df -hl '-l,将列表限制为本地文件系统
du -a -h 'du查看当前文件夹、局部'
du -h /home '指定目录'
free内存使用情况查看
free -h '-h人性化
tree文件树显示
yum -y istall tree
tree /tmp
==\==指令
ls -l \
-a
cp复制
cp 1.txt 2.txt
-i #交互,防止直接覆盖掉原有文件夹
-u #只更新,不复制重复的且同时间的项目--->加快大文件复制
-r #递归
ln软、硬链接
ln a b
ln -s a b
history
history #显示全部历史记录
history 10 #只显示10条
!2022 #执行第2022条记录
!! #执行上一条指令
date与cal
date #显示当前时间
date "+%Y-%m-%d-%H-%M%-%S" #显示指定时间
date -s "9999-10-20" #修改系统时间
cal #正常显示日历
cal 2022 #显示年日历
cal 10 2000 #月份在前
which指令
which ls
find与locate(获取路径)
区别:
find:基于硬盘查找,会从指定的目录向下递归遍历所有子目录,速度慢。
locate:基于数据库索引查找,需要事先执行数据库建立索引语句,速度较快。
简单使用:
find /home -name hello.txt #正常查找
find /home -name *.txt #递归查找
find /home -user thinkstu #查找用户
find /home -size +100M #小于100MB
find /home -size -100M #大于100MB
yum -y install mlocate
updatedb
locate xxx
范例:
find /etc -type d # 文件
find /etc -type f # 文件夹
find /etc -type l "但是其实grep确实也能实现这一点,方法多样"
find / -type f -name "*.jpg" -size +1M |wc -l
'find指令扩展:直接删除搜索出来的文件
find find / -type f -name "*.jpg" -delete
grep
前景说明:常用来和cat进行管道的组合使用
参数含义:
-n '结果显示行号
-i '忽略大小写
-R '递归的在目录中查找
-v '只匹配不相符合的行
范例:
cat /tmp/1.txt | grep -in "yes"
grep -in "yes" /tmp/1.txt
alias别名、unalias取消别名
alias #显示系统所有的别名
alias custom='ls -l'
立即关机
sudo shutdown -h now
wc统计
cat 1.txt | sort | uniq | wc -l
-l #行数
-w #单词数
-c #字节数
file确定文件类型
file 具体文件 #事实上怕记也可以使用ls -l查看
type显示指令类别
type ls
[t@VM-4-3-centos man-pages-zh-CN-1.5.2]$ type ls
ls is aliased to `ls --color=auto'
[t@VM-4-3-centos man-pages-zh-CN-1.5.2]$ type man
man is hashed (/bin/man)
[t@VM-4-3-centos man-pages-zh-CN-1.5.2]$ type type
type is a shell builtin
uname显示系统信息
uname -a # 显示所有信息
uname -r # 显示系统内核版本
[root@VM-4-3-centos]~# uname -r
3.10.0-1160.59.1.el7.x86_64
stat指令
[root@VM-4-3-centos ~]$ stat index.html
File: ‘index.html’
Size: 730 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 397149 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2022-03-29 11:58:49.895527049 +0800
Modify: 2022-03-29 11:58:49.062502555 +0800
Change: 2022-03-29 11:58:49.062502555 +0800
Birth: -
netstat指令在网络配置中详解
mount挂载、unmount卸载
mount #不加任何参数
'显示所有的挂载情况,包括硬盘、网卡、音箱等设备
'格式:device on mount_point type filesystem_type
[root@004 ~]$ lsblk 'lsblk即:list block
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 159.1M 0 rom
vda 253:0 0 80G 0 disk
└─vda1 253:1 0 80G 0 part /
fstab文件查看存储设备情况
cat /etc/fstab
top网络配置章节详细介绍。
iotop查看io读写情况
配置信息全部在/etc里
/boot与**/root**:注意区分这两个目录,它们不一样!
Bash说明
wildcard通配符
1. *:几乎全部,只不能匹配隐藏文件。
2. ?:单个字符
3. '匹配隐藏文件:.[!.]*
单引号、双引号规则:在单引号中,所有的转义字符会失效。
/dev/null垃圾桶
ls / &> /dev/null
Linux自带英文字典
"里面有47万个单词,一行一个。可用grep搜索"
[root@VM-4-3-centos dict]$ cat words | wc -l
479828
"填字游戏"
[root@VM-4-3-centos dict]$ cat words | grep '^..j.r$'
Major
major
系统字符集查看
"查看字符集的两种方法"
1. locale
2. echo $LANG
重定向标准错误
#仅标准输出,两种写法
ls /aaa > a.txt
ls /aaa 1> a.txt
#仅重定向错误
ls sasa 2> a.txt
#同时输出,两种写法
ls sasa > a.txt 2>&1
ls sasa &> a.txt
系统版本信息查看
[root@VM-4-3-centos]~# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
centOS:三种方式
前景说明:
rpm详解
全称:redhat package management,行业标准而不只是redhat的专用;
安装说明:不会帮你自动下载并配置默认环境。
参数说明:
rpm -qa "查询所有已安装软件
rpm -q gcc '查询本地是否安装gcc。不比grep好用、容易导致误解、出错'
#比 yum -info gcc 详细,更好
rpm -qi gcc '查询软件包的具体信息,包括安装时间等
rpm -ql gcc '查询软件包中的文件
rpm -qf 文件路径 '查询该份文件隶属于哪一个软件
#-e普通卸载,可能会被Linux阻止。卸载失败
#--nodeps强制卸载
rpm -e --nodeps gcc
#-i_install安装,-v_verbose显示信息,-h_hash进度条
rpm -ivh rpm包
范例:
#安装JDK1.8
1. '检查系统中是否存在jdk1.8,两种方式'
rpm -qa | grep jdk
1-1. '存在即强制卸载'
rpm -e --nodeps jdk名称 #强制卸载
2. '前提:已经拿到jdk的rpm包、并且存储在系统里'
rpm -ivh rpm包
yum详解
全称:Yellow dog Updater, Modified
安装说明:会帮你自动下载并配置好所有的默认环境,省心安装。
参数说明:
yum makecache fast '生成目录缓存,方便日后检索。每日系统自动更新一次'
yum -y install gcc '安装
yum list | grep jdk '列出所有可以安装的软件'
yum check-update '检查是否有'
yum remove gcc '卸载'
yum update '更新所有软件'
yum update gcc '更新gcc'
# 不如 rpm -qi gcc 详细,没有安装日期等等
yum info gcc '查看具体信息'
范例:
yum -y install java-1.8.0-openjdk.x86_64
常用tar,记住即可
tar -zxvf file #解压
tar -zcvf file #压缩
其他指令
gzip压缩、gunzip解压
gzip 1.txt
gunzip 1.txt.gz
zip与unzip
#安装unzip
yum install -y unzip
#压缩
zip -r a.zip /home/think
压缩 递归压缩目录 压缩后的文件名 将要压缩的目录
#解压
unzip -d ./usr a.zip
解压 指定解压到的文件目录 压缩包文件
tar详解
tape archive,原本功能:磁带存档。
前景说明:只提供打包、解包,没有解压缩功能。
通过调用gzip实现解压缩功能。
后缀:.tar.gz见名思意,先借助tar打包、然后利用gzip进行压缩。
打包和压缩区分:
与其他指令的区别:其他指令只能针对某一文件进行解压缩,而不能同时针对不同地方的多份文件进行压缩。
参数说明:
tar -zxvf a.tar.gz
-x '解压文件,extract
-c '压缩文件,compress
-z #支持gzip解压文件
-v #显示操作过程,verbose
-f #指定压缩文件(理解:指定要解压的压缩文件名)
查看用户信息
id
id 用户名
创建用户、删除用户
useradd -m -G 设置用户组 #-m自动创建用户的家目录
userdel -r #删除用户并且删除家文件
修改用户密码
passwd #回车设置密码(普通用户权限)
passwd 用户名 #回车设置用户密码(root权限)
passwd -l 用户名 #lock,冻结某用户、暂时无法登陆。应用:离职期间
用户切换
su 用户名
退出登录
'退出账号'
exit
'退出Shell端'
logout
创建、删除用户组(group的操作与useradd这系列的操作类似一样)
groupadd thinkstu
groupdel thinkstu
修改用户所在组
usermod -g 组 用户名 #修改用户所在组
直接修改文件或者目录属组
chgrp think组 1.txt
为用户赋予新的家目录
'只能用root用户设置,因为在设置的时候该用户不能登录
usermod -d 目录名 用户名
思想:
修改文件所有者
chown thinkstu 1.txt
权限排序:文件所有者、文件所在组、其他人。
作用在文件
r :可读取该文件
w :可修改该文件,但是并不能删除该文件。
删除该文件的前提是对该文件所在的目录拥有w写的权限。
x :可执行该程序
作用在目录
Summary
检查环境配置
set:显示Shell变量+环境变量
printenv:只显示环境变量
alias:别名( 以上两者均无法查看别名,只有它可以 )
set #全部
printenv #全部
alias #全部
常见变量
echo $PATH
echo $PS1
echo $LANG '输出服务器字符集'
前提说明:Shell程序在启动时会自动加载并读取一系列配置文件(用户登录操作并不会)。
配置文件读取规则
**登录Shell会话:**非图形界面登录。
"全局变量"
/etc/profile
as
"用户变量"
1、 2、 3 为只要前面一个存在,则后面的就不会被读取;
~/.bash_profile 1
~/.bash_login 2
~/.profile 3
**非登录Shell会话:**利用图形界面进行登录。
"全局变量"
/etc/bash.bashrc
"用户变量"
~/.bashrc
特例:~/.bashrc
文件,无论启动方式如何,总会被执行( 但其只是用户自定义变量 )。
export命令含义:告诉Shell,该环境变量的内容可用于Shell的子进程。
export PATH=$PATH:~/bin
二月指示:以前我总是修改/etc/profile文件,直到我进去该文件中注意到这句话:
System wide environment and startup programs, for login setup
Functions and aliases go in /etc/bashrc
It's NOT a good idea to change this file unless you know what you
are doing. It's much better to create a custom.sh shell script in
/etc/profile.d/ to make custom changes to your environment, as this
will prevent the need for merging in future updates.
---------------------------'代码部分'---------------------------------
i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
总结( 修改全局变量与用户变量 ):
全局变量:
优先:往/etc/profild.d目录下添加脚本文件.sh, 方便日后管理 。
其次:修改/etc/profile文件本身。
用户变量:
最后记得,都要刷新配置文件~
ip指令详解
"过时:已不再维护"
ifconfig
"现代"
1 ip a
2 ip addr
3 ip -c a
ip指令取代ifconfig。
ip指令的正确使用方式
"全部在《man ip》手册里,具体要配什么怎么配注意查看即可,真就还不如学会如何看手册,比这方便"
ip a #a是addr的缩写,所以可以直接用a
-------------------------------------
SYNOPSIS
ip [ OPTIONS ] OBJECT { COMMAND | help }
OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | mad‐dress | mroute | mrule | monitor | xfrm | netns | | tcp_metrics | token | macsec }
OPTIONS := { -V[ersion] | -h[uman-readable] | -s[tatistics] | -d[etails] | -r[esolve] | -iec |-f[amily] { inet | inet6 | ipx | dnet | link } | -4 | -6 | -I | -D | -B | -0 | -l[oops] {maximum-addr-flush-attempts } | -o[neline] | -rc[vbuf] [size] | -t[imestamp] | -ts[hort] |-n[etns] name | -a[ll] | -c[olor] }
ping指令详解
作用:
ping百度:检查网络连通性
检测双方网络的通畅性。
使用说明:
默认1秒发送一次包,Linux平台默认持续 ping,win平台一般 ping 4次即结束。
在按下ctrl+c快捷键中断继续发送的请求之后,命令行会返回本次网络请求的统计信息。
[root@VM-4-3-centos test]]$ping thinkstu.com
PING thinkstu.com (39.107.99.33) 56(84) bytes of data.
64 bytes from 39.107.99.33 : icmp_seq=3 ttl=51 time=37.6 ms
64 bytes from 39.107.99.33 : icmp_seq=4 ttl=51 time=37.7 ms
^C
--- thinkstu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 37.679/37.793/38.090/0.219 ms
ttl(Time To Live)
的含义:该字段指定IP包被路由器丢弃之前允许通过的最大网段数量。当 ttl = 0 时,该数据包就会被路由器丢弃,这样就防止了幽灵数据在网络中一直循环(浪费互联网资源)的情况。
ping localhost
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.082 ms
ping thinkstu.com
64 bytes from 39.107.99.33: icmp_seq=0 ttl=48 time=64.576 ms
# 此处表明经过了 64 - 48 =16 层网关。
traceroute与tracepath追逐网络请求链条( 抓包 )
#范例,两者差不多
traceroute baidu.com
tracepath baidu.com
netstat指令详解
全称:network statistic网络统计,检查网络设置和统计网络信息。用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
应用:
'输出有点长'
netstat | less
netstat -an #按照一定顺序输出
netstat -p #附加显示进程号
netstat -pan
案例
#查找80端口
netstat -pan | grep :80
#我之前使用过另外一种方法
lsof -i :80
额外说明:Linux以上两种方案均可,但是Mac中 isof 或许是最佳方案!
ftp指令
wget指令详解
可以从网页或者FTP下载文件,甚至是下载整个网站源码。
但是!但是!这货给我的感觉是慢的离谱、慢到无法理喻!
yum -y install wget
wget thinkstu.com
"会自动的把这个页面以它应有的方式保存到当前文件夹"
"更多的使用方式我应该使用 《 man wget 》"
SSH远程连接
DHCP
主机名:hostname变量
查看
hostname
修改
'方式1:重启生效、永久
"source刷新无效。因为其里面的内容又不是指令,只是一行普通字符串而已)
vim /etc/hostname
'方式2:本次生效、暂时'
hostname xxxx #修改主机名,重启生效。(这只能重启生效)
hosts映射文件
/etc/hosts
作用:通过ping主机名找到实际的ip地址,类似DNS域名映射。
启示:hosts文件其实就是一个定义了网络映射规则的文件,有则按照其定义来,无则自由发挥
**注意:**是检索后面的那个,从而导向前面的那个值。
'模板'
192.168.200.101 hostname名(或者域名,其实就是String类型的数据)
'实例'
192.168.200.101 thinkstu
#当我在Shell中ping thinkstu这个字符型的时候就会导向192.168.200.101。
更加高级的知识
Hosts是什么❓
一个文本文件,用来记录IP和Hostname(主机名)之间的映射关系
DNS是什么❓
Domain Name System的缩写,域名系统。
定义:互联网上作为域名和IP地址相互映射的一个分布式数据库。
DNS流程(四步)
一:首先浏览器会先检查自身的缓存中有无该域名的DNS缓存
域名劫持修改的就是DNS所对应的关系,所以~浏览器商是关口的第一步,完全可以任意的劫持访问操作。
自我启示:
效果:
进程分为两种类型:
Linux下查看进程:通过grep查找
ps -aux | grep 80
ps -ef | grep 80
ps指令详解( 具体请man )
ps #单纯输入ps能查看到的消息特别少,与我想的结果完全不一样
ps -aux #熟悉的参数指令,Mac中无-u参数。
ps aux #-aux也可以写成aux的形式,没有差别
ps -a # 显示当前终端的所有进程信息
ps -u # 附加显示进程的发起用户
ps -x # 附加显示后台进程运行的参数
ps -ef #熟悉的参数指令
ps -e #同A,显示所有进程
ps -f #全格式
System V展示风格
USER : 用户名称
PID: 进程号
%CPU, 进程占用CPU的百分比
%MEM: 进程占用物疆肉拿的首分比
VSz: 进程占用的虚极内存大小(单位:KB)
RSS: 进程占用的物理内存大小(单位:KB)
TTY: 终端名称,缩写。
STAT: 进程状态,其中S-睡眠,S-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低
的优先级,R-正在运行,D-短期等待,乙-僵死进程,丁-被跟踪或者被停止等等
STARTED: 进程的启动时间
TIME: CPU时间,即进程使用CPU的总时间
COMMAND: 启动进程所用的命令和参数,如果过长会被截断显示
pstree指令:树型结构显示进程
pstree -pu
#-p显示进程号,-u显示进程所属用户
kill与killall
top:动态监控
top
top -6 #指定top命令每隔几秒更新一次,默认3秒
top -i #ignore,忽略闲置或者僵死zombie进程
top -p #指定要监控的进程ID,独家定制监控
illustrate:
发现存在僵死进程:
僵死进程zombie:程序已经死亡,但还在持续的占用着系统内存。
找到并杀死zombie进程
ps -aux | grep "^[Zz]" #此处查找Zombie或者zombie
kill -9 xxx
top指令下的交互
P '默认选项,以CPU使用率排序
M #内存使用率排序
N #PID,process identity排序
q #离开
#加餐
1. '查看指定用户的程序:输入U回车,再输入用户名
2. 'top环境下杀死指定进程:输入k回车,再输入进程号PID
介绍:
Service指令
每一个服务的自启动是根据不同的运行级别进行设置的,比如只设置mysql在 init-3 级别(shell面板)时自启动,所以它在 init-5 级别(图形界面)就不会自启动。
chkconfig指令
systemctl
很多服务开始不再使用service,而是systemctl。
与service指令相近,不过更高级。
服务后面都有一个d,含义是daemon守护进程,也就是后台进程。
例如:mysqld,firewalld等等
centos8 之后运行级别简化为只有两个级别3和5( 原先有7个 ):命令行与图形化界面。
**要充分理解 systemctl 的结构与含义:**服务的启动与暂停、自启动管理。
基本使用:
#启动与暂停(单次有效、临时,重启系统失效)
systemctl start | stop | restart | status 服务名称
#查看管理的所有服务
1
systemctl list-unit-files | grep xxx服务
2
systemctl | grep xxx服务
3
ls /usr/lib/systemd/system
#设置自启动管理( 重启生效,永久 )
systemctl enable 服务名
systemctl disable 服务名
systemctl is-enabled 服务名 #查询某个服务是否自启动,方法多样
使用注意:所有的服务后面都带一个后缀 .service 或者其他的后缀。在正式使用的时候,我们可以只写前面的服务名而忽略后面的后缀名。
例如:firewalld.service 我们在使用时就可以只使用 firewalld 。
systemctl stop firewalld #暂停
systemctl start firewalld #启动
'设置自启动
systemctl enable firewalld
'关闭自启动
systemctl disable firewalld
'查看是否自启动
1. systemctl is-enabled firewalld
2. systemctl list-unit-files|grep firewall
前台
java -jar xxx包
后台( 两种方式 )
cmd & : 后台运行,关掉终端会停止运行
cmd & 实现让命令在后台运行。但不要将有用户交互的命令放到后台,这样命令会在后台等待用户输入。后台运行的命令也会将结果输出到控制台上,如果不需要的话,可以将其重定向到某个文件中。使用下面的命令可以将标准输出和错误输出都将被重定向到一个叫做cmd.out的文件中。
cmd > cmd.out 2>&1 &
nohup cmd & : 后台运行,关掉终端不会停止运行.
默认情况下,该命令的所有输出都被重定向到nohup.out文件中。
nohup java -jar Bilibili-0.0.1-SNAPSHOT.jar &
端口二月指示:80是http的端口;443是https的端口。
用法:查看服务器开启了哪一些端口。但是云服务器好像根本用不到,端口组规则直接在顶层拦截。
firewall-cmd --list-ports
采用rpm的方式而不是yum
原因:yum只有openjdk。
思路:先把jdk文件上传至==/opt==,然后tar -zxvf解压文件,将解压后的文件移动至==/usr/local/java==目录(Java目录需要自建),安装过程即结束。(解压即安装)
环境配置:
vim /etc/profile
#末尾添加这两句话
export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=$PATH:$JAVA_HOME/bin
先看完整指令
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
install_6.0.sh 文件一览( 完整版本:29KB )
当你忘记宝塔面板账号时
bt
使用前小技巧:输出花括号扩展之后的内容
echo {1..10}.txt
简单范例:
echo {001..100} '范围数字'
echo {A..Z} '范围字母'
echo {2,4,8} '截断式数字'
复杂范例:嵌套填充
echo {1..5}{a..e}
'1a 1b 1c 1d 1e 2a 2b 2c 2d 2e 3a 3b 3c 3d 3e 4a 4b 4c 4d 4e 5a 5b 5c 5d 5e
echo {1,2,3}{a{1..3},b{1..3}}
'1a1 1a2 1a3 1b1 1b2 1b3 2a1 2a2 2a3 2b1 2b2 2b3 3a1 3a2 3a3 3b1 3b2 3b3
实例:
'1. 创建列表空文件'
touch {2000..2022}---{01..12}
'2. 创建1个父文件夹和100个子文件夹,另外再创建26*100份文件'
mkdir -p demo/{1..100}
touch demo/{1..100}/{1..26}.txt
rm -rf demo
前提说明:yum存在着man的多语言包,但是版本有点老。
安装
yum list | grep man.*zh
yum -y install man-pages-zh-CN.noarch
vim /etc/profile #全局变量
或者
vim ~/.bashrc #用户变量
alias cman='man -M /usr/share/man/zh_CN'
```sh
source /etc/profile
```
初始状态
[root@VM-4-3-centos ~]$ echo $PS1
[\u@\h \W]\$
文本参数
字符 | 描述 |
---|---|
\a | 铃声字符 |
\d | 格式为“日 月 年”的日期 |
! | 该命令的 bash shell 历史数 |
\h | 本地主机名 |
\H | 完全合格的限定域主机名 |
\j | shell 当前管理的作业数 |
\1 | shell 终端设备名的基本名称 |
\n | ASCII 换行字符 |
\r | ASCII 回车 |
\s | shell 的名称 |
\t | 格式为“小时:分钟:秒”的24小时制的当前时间 |
\T | 格式为“小时:分钟:秒”的12小时制的当前时间 |
@ | 格式为 am/pm 的12小时制的当前时间 |
\u | 当前用户的用户名 |
\w | 当前工作目录 |
\W | 当前工作目录的基本名称 |
# | 该命令的命令数量 |
$ | 普通用户,美元符号$;超级用户,井号#。 |
颜色参数
原理:利用ANSI转义代码来控制。以八进制数033开头,后面接颜色代码。
注意:颜色代码前后要加 \[ 与 \] ,否则会出现命令行不换行的BUG
颜色代码
[\033[0;31m] 红 [\033[0;37m] 白 [\033[0;30m] 黑
[\033[0;32m] 绿 等等
范例:
"原先":[\u@\h \W]\$
"仅目录显示红色 ---> 思想:三段式,白红白":
[\u@\h \[\033[0;31m\]\W\[\033[0;37m]\]\\$
持久化PS1
思想:类似配置环境变量$PATH。
范例:/etc/profile
export PS1="[\u@\h \[\033[0;31m\]\W\[\033[0;37m]\]\\$ "
find -type f -name "*.txt" | axargs cat
"发生错误的情况"
[root@VM-4-3-centos ~]$find -name "oo*"
./oo asa .txt
[root@VM-4-3-centos ~]$find -name "oo*"|xargs cat
cat: ./oo: No such file or directory
cat: asa: No such file or directory
cat: .txt: No such file or directory
"解决方案,同时利用前后两参数(暂时见识即可)"
find -name "oo*" -print0|xargs --null rm
G #跳转到最后
g #跳转到开头
A #调到末尾并且进入编辑模式
0 #调到开头
u #撤回
---------
dd #删除当前行
---------
20 shift+g #跳转到第20行
:q! #强制退出
init 指定运行级别
init 0 #关机
init 1 #单用户【找回丢失密码】
init 2 #多用户,无网络
init 3 #多用户,有网络
init 4 #系统未使用保留给用户(无用)
init 5 #图形界面
init 6 #重启
常用的级别是3、5,新版在观念上去除了这笼统的7种区分,改而只区分常用的两种级别并采用英文单词表示。
查看并修改默认的运行级别
systemctl get-default
systemctl set-default graphical-target
阿里云图形界面入口
一般选择VNC登录桌面
find . -type f -empty
find -size 0
ls -l|awk '{print 9,"\t",9,"\t",5}'
统计目录下的文件或者子目录个数
正则表达式
文件:-==,目录:==d
ls -l | grep "^-" | wc -l
递归统计某目录下的所有文件个数
说明:在通常情况下,当我们使用ls时,显示的只是一层目录下的情况,如果需要统计该目录 下的所有文件个数(包括其子目录),则要用到一个我之前好像从来都没有用到过的参数: -R。
ls -lR
ls -lR | grep "^-"|wc -l
'附加,ls下-r与-R的区别
-r:reverse
-R:Recursive
系统默认登录时都是普通用户,整个系统中不存在root用户。
我们要手动创建root用户,并且赋予它密码
sudo passwd
---输入普通用户的密码
---输入root用户的新密码
---再次输入
su - #切换即可
制作属于自己的一个小型Linux——Minix
前提:利用grub2完成系统的制作。
效果:一个什么都没有的Linux系统,完全依靠你导入相应的命令去定制。
提示:思路简单,但是过程繁琐,故实操及具体说明跳过。
思路: 在一个正常的Linux上新建一块纯净硬盘( 设置新硬盘名字并且记住 ),在新硬盘上创建两个分区a和b(例:a为1GB,b为19GB),在新硬盘上新建目录/boot挂载到a上、新建目录/sysroot挂载到b上。
然后,将旧系统中的目录/boot复制到新系统的/boot中(启动引导程序),打开旧系统/boot目录中,对其grub2.cnf配置文件进行一些修改( 8处修改。主要是把旧硬盘标识的UUID修改成新硬盘的6处,还有2处是在两个地方写两句相同的话,表示再次开机时刷新一下,使用新的配置操作以免和旧系统本身的配置发送冲突 )。
打开新系统的/sysroot目录,在里面模仿新系统的 / 目录下的文件目录系统新建一大堆目录,例如:lib64、lib、etc、tmp、usr、var等。
将旧系统上的/lib64( 存放最基本的指令,没有则无法成功建立新系统 )复制到新系统的/sysroot/lib64目录中。另外复制/bin/bash指令也复制过去,不复制的话则会连开机shell都没有,那么怎么操作呢??哈哈。
新系统盘基本建立完成。
关闭旧系统,在VMWare中新建虚拟机—>删除现有硬盘,选择并查找、使用刚才建立的新硬盘—>开机—>简陋的bash界面,结束。
Linux 0.0.1 C语言编写,代码结构层次还是比较清晰;
在Linux系统中,内核可以升级。
内核升级
crontab指令
操作指南
#首先在命令行中输入
crontab -e
#然后会进入一个类似于vim的界面,在此输入两值
1. craond时间表,一共5个选项
2. 要执行的相应指令
#每隔1分钟执行一次
*/1 * * * * ls /tmp >> /tmp/a.txt
#crontab参数
-e # edit,编辑crontab定时任务
-l # list,查询当前所有的crontab任务
-r # removeAll,删除当前用户的所有crontab任务
==*==占位符的说明
项目 | 含义 | 范围 |
---|---|---|
***** * * * * | 一小时当中的第几分钟 | 0-59 |
* ***** * * * | 一天当中的第几小时 | 0-23 |
* * ***** * * | 一月当中的第几天 | 1-31 |
* * * ***** * | 一年当中的第几月 | 1-12 |
* * * * ***** | 一周当中的星期几 | 0-7 0和7均表示星期日 |
特殊符号的说明
符号 | 含义 |
---|---|
* | 代表任何时间 |
, | 代表不连续的时间片段,比如0 6,8,10 * * *表示每天6点整,8点整,10点整都会执行一次 |
- | 代表连续的时间,比如0 6-8 * * *表示每天6/7/8点整均会执行 |
*/n | 首先左边的字符代表0-59分钟均会执行,右边的数字代表每隔1分钟执行一次。比如:*/10每隔十分钟,*/20每隔20分钟。(*/1相当于*****,这点需要注意) |
一些案列
定时任务:利用可执行的sh文件
首先创建一shlle脚本,.sh后缀
然后赋予shell脚本可执行的权限x( 或者使用sh而无需赋权限 )
在crontab里执行任务的地方直接填入shell脚本的全路径。
因为正常的shell脚本也是如此调用执行的
如此一来,主要工作变成了编写Shell脚本;
番外话:
在命令行里同时执行两句不同的指令
cal && date
使用了==&&==
说明:
有时我们并不需要Crontab循环执行任务,我们只需要执行一次任务
at-deamon,at的守护进程atd会以后台模式运行,检测作业队列来运行。每隔60秒回检查一次作业队列,如果作业的运行时间与当前时间相匹配则会执行该作业。
在使用at命令的时候,一定要保证atd进程的启动,否则便无法启动;可以使用相关指令来查看
ps -ef|grep atd
指令是at: 参数。
简单使用
(理解:在 下午五点 + 两天后 执行任务)
chattr指令
chattr:change attribute 改变属性
作用:root用户用来 锁定 一些重要文件的操作。
小提示:chattr是/bin目录下的二进制文件。
常用:使用此操作锁住某些文件。如/etc/passwd,然后root( 包括拥有root权限的非root用户 )便无法再使用useradd添加用户,所有用户均不能再修改密码passwd,因为文件已加锁,权限特别高、无法操作。
参数:
chattr +i /etc/passwd #加锁
chattr -i /etc/passwd #减锁
chattr -V #显示操作过程
chattr -R #递归操作
然后可以在系统中通过修改chattr命名,移动到其他目录来防范其他人的恶意操作。
这个指令还有众多参数。
注意别把系统都给自己锁了。。。
—> 我还真的把**根目录/**给锁了,然后操作指令——例如ls、man都能正常使用。
因为==+i==只是加了吧只读锁,并没有能阻止指令的运行。当然所有的文件都已经不能增删改。
chkrootkit检测系统是否存在入侵的工具(需wget自行下载解压安装)
文件很小+C语言编写,wget够用
wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
解压、进入、执行命令
tar -zxvf chkrootkit.tar.gz
cd chkrootkit-0.55
./chkrootkit
nothing found、not infected则表示正常,出现红色则表示检测到入侵
查看系统中所有的用户最后的登录时间
**思想:**因为在日志文件中存在着一文件—lastlog。里面存放的就是系统中所有的用户最后的登录时间,但是因为文件本身为二进制文件不能直接打开,Linux为此还为我们定义了相应的命令,就是同名的lastlog,执行该命令则会去调用查看/var/log/lastlog文件。
如何优化Linux系统 ,说出你的方法
前景提要:
后缀:.sh
单行注释:#
Shell脚本不只一种,常用的为bash。( 井号开头 )
'含义:前缀 + 可执行目录下程序/bin/bash
#!/bin/bash
两种启动方式
'1. 赋予可执行权限
chmod 777 xxx
./xxx
'2.不赋予权限,sh执行
sh xxx
'特例:后台运行脚本
./1.sh &
全局变量
#临时
export d='lalala'
#持久化:写进profile文件里
vim /etc/profile
export d='lalala'
'Shell中预留的三个变量'
$$ #代表当前进程的进程号,即当前整个脚本的进程号
$! #后台运行的最后一个进程的进程号
$? #返回上一个命令执行结果。为0成功,其他值失败。
echo "当前脚本进程号: $$"
./1.sh &
echo "后台运行的最后一个进程的进程号: $!"
echo "上条语句的执行结果(0位成功): $?"
局部变量
#用户自定义变量
a='sssss' '等号两边不能有空格!
echo $a '习惯变量名全部大写!
-----------------------------------
echo $PATH #系统变量
unset a #取消设置
readonly b=1 #静态变量,无法修改和删除
将命令的返回值赋给变量(两种方式)
1. "反引号"
c=`date`
2. "美元符号$、小括号"
c=$(date)
位置参数
./2.sh 100 200 300
$n #n为数字,表示位置参数具体编号
$0 #表示命令本身
$1/${23} #10及以上参数需要用大括号{}括起来。
$* #通配符,表示所有变量
$@ #通配符,也表示所有变量,不过$@把每个参数区分对待
$# #表示命令行中的参数个数
sh 2.sh 100 200 300 400
#!/bin/bash
echo "$0 $1 $2 $3"
echo "* -- $*"
echo "@ -- $@"
echo "个数---$#"
简单运算符
1. '$(( )) ----推荐
echo $(($1+$2))
2. '$[ ] ----推荐
echo $[$1-$2]
3. 'expr m - n ----超级不推荐,但要会看(语法转义麻烦)
echo `expr $1 \* $2`
暂时跳过后续内容。
暂定
说明:主要谈其在Linux操作系统中与各指令之中的联合调用
grep:global regular expression print
"以下两种式子是等价的"
ls -l | grep -c ^d #-c即--count统计
ls -l | grep ^d | wc -l
ls 中可以使用
ls -R / *.txt
**^和&**符正确叫法:锚点anchor。
ls | grep '^zip&'
"特例 ^& 表示中间什么都没有,可匹配空行"
cat a.txt | grep ^&
脱字符作用:排除
[^ab]cd
"以上并不会匹配cd两位数,脱字符必须存在一个字符、但不能是a和b"
"Discover:^符号在 [ ] 外表锚点、在内表脱字符"
连续范围
[a-z0-9A-Z] "直接这样写即可"
有时会因为语言环境( 即字符编码集 )的不同而产生一些奇怪的匹配结果。
1."一般字符集"
abcdefg......ABCDEFG...
2."个别字符集"
aAbBcCdDeEfF
"所以此时[a-z]就会处于:大小写均会被匹配到的状态、但是大写少个Z"
扩展正则表达式 与 基本正则表达式
"基本正则表达式:"
^ & . [ ] *
"扩展正则表达式在此基础上,又添加了几种规则"
( ) { } ? + |
传统上,扩展的正则表达式要借助egrep。但是现在不用了。
新办法:grep -E。
"传统" egrep xxx
"正解" grep -E xxx
扩展正则表达式详解
"多选扩展"
grep -E "*.jpg | *.png"
grep -E "(*.jpg | *.png).taz" #多选与其它的组合使用需用小括号( ) 把它括起来
"?:匹配前面的模式,0次或1次"
"\([0-9][0-9]\) ? [0-9][0-9]" #匹配两位数或者四位数
次数匹配
{3} #匹配3次
{0,3} #匹配0-3次
{,3} #最多三次
{2,} #最少两次
==+==匹配1次或者多次
重磅操作
.*
".*中 . 表示的是任意字符,* 表示的是0次到任意多次"
#所以他两其实是表达的含义不同罢了,本质上表达的意思也不是同一个东西的嘛!
"所以我们会经常的看到如下表达形式"
.*1[0-9]{10}.*
结语:正则表达式充满了奥妙。
前提:系统管理员权限拥有者或者mysql数据库软件的安装者。
思路:
说明:实际上有两种方法,这里只展示一种方法;具体自行百度或者查看mysql手册。
步骤( 版本不同会有些许差别 ):
skip-grant-tables
简介
我们需要检查系统日志,获知系统运行状态。
系统日志文件存放的位置:/var/log。( 首要记住存放日志的目录 )
该目录下的文件
系统常用日志( 标红的重点掌握 )
日志管理 服务
CentOS7.0——rsyslogd;centos6.0——syslogd
单词理解:Redhat System Log Daemon 红帽系统日志守护进程
用途指明:用来管理Linux系统上的所有日志,比如生成等,全靠它来管理。
重要的rsyslogd配置文件:/etc/rsyslog.conf
通过修改此配置文件,我们也可以自定义系统内存储的日志系统。
存在日志轮替 :每隔一段时间自动删除老旧日志文件。
底层基于crontab定时轮换任务
内存日志journalctl
基于内存,重启即消失。——tomcat、mysql等的日志文件可能会“隐藏”于此。
journalctl -n 10
journalctl -p err
journalctl | grep error
journalctl -o verbose
ifconifg:network interfaces configuring
tty:teletype 电报交换机
su :Switch User
sudo:super user do
GUI:Graphical User Interface
CLI:Command Line Interface 命令行界面( cli原来是这个意思,redis里面启动命令就是此! )
bash:Bourne Again Shell
sbin:带s开头的目录范式,system binary
wildcard:通配符
PS1:prompt string 1( 提示字符1 )
fstab:( file system table )文件系统表,/etc/fatab存储了该系统存储设备的挂载情况
ext4:( Fourth Extended File System )第四代扩展文件系统
synopsis:“ 简要、概述 ”