3天搞定Linux,1天搞定Shell笔记
Linux概述
- Linux是一个操作系统OS
- 开源
- MacOS基于Darwin,Darwin基于FreeBSD开发。
- Linux基于Minix(开发重写),Minix基于Unix开发。
- Linux一切皆文件
分层示意图
开源协议
- BSD。伯克利开源协议,免费自由可随意修改,基于此协议开发的软件可以不开源,便于用于商业使用。苹果
- GPL。免费自由可随意修改,基于此协议开发的软件可以也必须开源。(GNU 自由软件计划,GNU is Not Unix )
Linux发行版本
- suse俄国人发明,欧洲使用比较广泛,因为界面比ubuntu还好看。
- CentOS和Ubuntu都是开源免费版。
- debian更遵循GPL协议。
- Android内核也是基于Linux,加上了JAVA运行环境的移动端操作系统。
Linux安装
- CentOS包管理工具:rpm,yum(更高级)
- ubuntu包管理工具:apt
- CentOS比ubuntu稳定,性能更好,而界面没有ubuntu好看。ubuntu更适合做个人电脑的操作系统。
- 2024.6后CentOS7redhat不再维护和开源新的后续版本,目前的可能分支是Rocky.(因为CentOS Stream算是跟fedora差不多的激进版本,不属于稳定版本)
主机名:hadoop100
静态IP:
root : 123456
log:12345
模拟linux服务器
- VMWare (workstation pro)
- Docker
- Virtual Box
创建虚拟机
- 处理器数量。表示有几个cpu,有几个插槽。
- 每个处理器的内核数量。一个cpu有几个核心。
- 如果有超频技术的话,一个内核又可以超频为2个或者n个逻辑内核。(虚拟机不考虑该逻辑)
- 虚拟磁盘表示用文件、文件夹来模拟磁盘。
- 作为服务器语音选择英文,学习可以选择中文。
- GNOME桌面。(KDE桌面更华丽,但更损耗性能)
- 分盘(将一块硬盘逻辑上隔离开,物理上还是一块硬盘)
- window从C盘开始分区是因为A\B盘都是软盘。
- 创建分区——挂载点
- 使用标准分区
- /boot ,引导分区,注意挂载引导程序,1G.
- /swap ,交换分区。作为虚拟的扩展内存。当内存满的时候用于扩展内存交换。一般设置为虚拟内存的1-2倍大小。4G
- / , 默认分区,剩下的磁盘都分配到该分区。
- 文件系统选择
- ext4 ,第四代扩展文件系统。
- xfs ,比ext4更高性能的文件系统。
- swap, 交换分区专用的文件系统。
- KDUMP 系统崩溃后的处理功能,虚拟机没必要开启,真实服务器才需要。
- 创建用户设置密码。生产上不能直接使用root用户,权限太大,创建合适的用户和对应的用户权限去操作才行。
网络类型
- 桥接网络——R。虚拟机与实际物理机对于局域网(如路由器构造的局域网)来说是平等的。
- 网络地址转换——NAT。虚拟机完全依托于物理主机跟外界访问。相当于把物理主机当成虚拟的路由器。对外是同一个IP。(安全性更高,外部不知道我们的虚拟机的IP,相当于保护起来了。)
Linux文件系统
- Linux终端就是命令解释层:shell(包装后的命令解释层,真实的命令解释层是开机启动后的黑屏命令解析层)
- 打开多个终端,切换不同的用户就可以使用不同的用户去执行命令。
- root用户提示符:# ,其他用户提示符$
- ~:表示当前主文件夹位置,可以设置。
- / :表示根目录
- bin [binary]:二进制目录,存放可直接执行的常用命令,实际目录位置是 的usr/bin
- sbin[system binary]:系统级的二进制目录,存放的是系统管理员root这个超级用户能够使用的命令,实际目录位置是 的usr/sbin
- lib[library]: 库目录,存放系统和应用程序所需要的共享库文件,类似于window的system32(动态链接库dll)里装的文件。 实际目录位置是 的usr/lib
- lib64:存放64位相关的库目录,实际目录位置是 的usr/lib64
- boot :引导启动所需要的文件存放的目录
- dev[device] :设备目录,硬件设备对应的文件映射,把硬件设备当成文件来管理。
- etc :存放配置文件的目录
- home : 用户主目录文件夹。系统创建的每个用户在home文件夹下都有一个对应用户名称的目录文件夹。
- root :root用户的主文件夹。
- opt[option] :可选目录,一般第三方软件都放这个目录下面。
- media :可移动媒体设备的挂载点目录,u盘或者光驱插入后就挂载在这个目录下。
- mnt[mount] :另外一个可移动设备的挂载点。
- proc[process] : 进程的映射目录。系统用来对当前进程的映射,不要去动它。
- run :存放系统当前运行时的文件信息。系统重启后会清理该目录,也不要动它。
- srv[service] :存放服务相关的目录
- sys[system]: 存放硬件相关的系统信息
- tmp[temporary] :存放临时性文件目录。
- usr[user] :存放应用程序和用户相关的文件信息,很重要。
- var[variable]:存放可变的文件,一般放日志之类经常修改的文件。
经常使用存放的目录:
- home
- opt
- tmp
- root
- var
- etc
有个小箭头表示是个快捷键,真实目录位置要看详情。
VIM文本编辑器
emacs:神之编辑器,可扩展性好。
vim打开的文件是带颜色区分的,vi没有。
- : wq ,write quit ,写入并保存(原来只是写到缓冲区)。
- u[undo] ,撤回,可以一直撤回。不想保存刚刚i进入后的更改,可以在按esc进入一般模式后按u表示回退更改的操作。
- yy ,复制一行, 8yy就是复制8行
- p ,粘贴,6p 粘贴6次。注意三粘贴在光标所在的行
- dd,删除一行, 5d,删除当前行即下面的5行。
- 结合^ $两个正则匹配进行复制。y^表示复制当前行到光标所在位置的文本,
y$
表示复制光标到当前行介绍的文本。^:正则开始,$
正则结束。 - yw ,复制当前单词。
- dw, 删除光标所在单词,需要移动到词的第一个字母。
- r ,替换
- gg ,移动到文档头,G/L,移动到最后一行
- 3G,跳转到第三行。指定行跳转位置。
- :set nu 设置文本的行号。结合指定行跳转。
- :set nonu 取消行号。
- o ,换一行插入
- :q! ,强制不保存退出
- / ,查找 n,查找下一个,N(shift + n),查找上一个
- :%s/old/new/g ,全文替换(g表示global全局替换,没有加g则只替换第一个)
vim三种不同的模式
常见语法
编辑模式输入
网络配置
-
B类局域网的IP地址是172开头的,C类局域网的IP地址是192开头的。
-
本机显示的IPv4地址就是本机在该局域网的IP地址,要看自己在公网的IP地址可以直接百度
-
ifconfig [interface config],linux查看ip地址的命令,window是ipconfig
- mac查看bridge100列
- linux查看ens33列
-
同一个局域网里面,前三位一样,最后一位不一样的两台机器可以互相通信、且不冲突。
-
NAT [network address transfer] ,网络地址转换,本质就相当于通过虚拟一个路由器和虚拟网卡来虚拟一个局域网出来。因此会看到虚拟机的IP网段和物理机的IP网段不一致的情况,可能一个192开头一个172开头。
-
设置静态IP,避免重启后DHCP动态分配IP地址导致的变化,影响我们通过IP进行测试使用。通过修改配置文件实现。
- 找到网络脚本配置文件进行修改。
-
设置主机名,通过修改配置文件实现。
- vim /etc/hostname ,重启生效。
-
hosts文件,域名或者主机名与IP的映射通讯录文件。方便通信或者做本地测试访问。
- vim /etc/hosts
修改静态IP步骤
1、找到配置文件路径
2、修改网络脚本配置文件,BOOTPROTO修改为static,增加IP地址,网关,DNS1,子关掩码(没有也行)
三种虚拟机连接模式
桥接模式:
NAT模式:
NAT虚拟了一个网卡,一个路由器,因此网卡分配.1,路由器分配.2 作为网关。
系统管理
进程和服务的区别:
一个正在执行的程序或命令,都被叫做进程(process);启动后一直存在,常驻内存的进程,一般叫做服务(service)。
centOS7保留NetworkManager,不建议使用network 服务。
服务使用语法:
systemctl start|stop|restart|status|enable|disable 服务名
enable/disable 开启/关闭 开机自启动
查看服务的方法:
/usr/lib/systemd/system
.target 表示一组服务的集合
进入设置服务是否开机时自启动:
在终端窗口敲: setup 回车,就会进入设置,选择系统服务回车
空格键可以打* ,表示自启动,tab键往下移动到退出键退出。
查看当前linux系统的运行级别:
systemctl get-default
如果是图形化界面会返回:graphical.target
设置运行级别:
systemctl set-default graphical.target
init 3 切换到3,多用户的命令行模式
init 5 切换到5,图形化界面模式
centOS 6的防火墙服务叫 iptables
centOS 7的防火墙服务叫 firewalld ,后缀d表示这是个守护进程
防火墙本质就是一张ip:port表集合,用于校验ip是否放行的表。
防火墙的开启关闭语法与上面相同:
systemctl start|stop|restart|status|enable|disable firewalld
linux关机前需要进行数据同步sync,从内存同步到硬盘中。因为linux的预读迟写的优化操作。
关机命令
linux启动加载过程
Shell常用命令
- bash[Bourre Again Shell],是在Bourre Shell的基础上发展来的面向用户的交互命令窗口,所以叫bash.
- sh 就是bash命令终端的打开命令。打开bash终端,其实是执行了sh,我们所有的命令就是在bash这个终端上解释执行的。
帮助命令
- man[manual],帮助手册的意思,用于获取帮助信息。
- help ,help命令只能用于内置命令的获取帮助信息,外部命令不行,外部命令一般可以使用: --help 来查看帮助信息。
#type 命令可以用于判断一个命令是内置命令还是外部命令
type cd
type exit
type useradd
#如果是内置命令要查看帮忙文档,则要多加一个 -f 选项
man -f cd
#其他查看帮助命令,man命令是最全的。
man ls
#help命令只能用于内置命令的获取帮助信息,外部命令不行
help cd
#外部命令一般可以使用: --help 来查看帮助信息。
ls --help
文件目录类
- 以点开头的文件和文件夹都是隐藏文件,如: .loacl .bash_profile,可以使用ls -a 来查看所有包括隐藏的文件
- \表示执行原生命令,不带选项参数。因为部分命令是带有别名的。
- 注意tail -f 监控文件更新时,通过vim修改文件去追加数据,tail是无法监控到的,因为vim编辑保存后的文件其对应的索引文件会更新成新的值,本质上表示这是个新的文件。tail就跟踪不到更新了,tail是根据索引文件的值来跟踪文件的更新的。
- 硬链接与软连接的区分:硬连接指向的是相同的文件的inode,软连接有自己的inode,软连接存放的是指向文件的地址,而这个文件再指向其自己的文件inode.
#显示当前工作目录的绝对路径 [print working directory]
pwd
#列出文件内容 [list] -a: 表示all,查看所有包括隐藏的所有文件
ls -a
# -l :表示long,长数据串列出,包含文件的属性和权限等。
ls -l / ll
#第一个是-表示文件,d表示这是个文件夹
-rw-r--r--. 1 root root 1671 5月 21 23:27 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 6 5月 21 23:27 公共
#切换路径, ..表示上一级目录 .表示当前目录
cd ../dev
# 返回上一次路径所在位置,可用于在两个路径下不同地切换。
cd -
#cd 后面不加路径表示切换到主文件夹
cd
#创建文件夹 make directory,下面是在当前路径下创建文件夹
mkdir test
#创建绝对路径下名字叫dev的文件夹
mkdir /dev
#创建指定路径下的嵌套文件夹,没有则创建对应文件夹 -p:parents
mkdir -p /d/e/f
#移除文件夹
rmdir /dev
#多嵌套路径下移除文件夹,不好用,还是使用rm -rf
rmdir -p /d/e/f
#创建空的新文件
touch hello.text
vim hello.text
#创建指定路径下的文件
touch /data/hi.text
#复制文件或目录 cp:copy
cp [选项] source dest
cp hello.text /data/
#如果复制的目标文件是已有的文件,那会提示是否覆盖该文件,y表示yes,n表示no。
cp hello.text hi.text
#加反斜杠\ 表示强制复制并覆盖, \表示执行原生命令,不带选项参数
\cp hello.text hi.text
#复制文件夹及其文件夹下的所有文件和文件夹
cp -r /data/log /backup/data/log
#删除 -f 强制删除 -r 递归删除
rm [选项] deleteFile
rm -rf /backup
#删库到跑路
rm -rf /*
#移动文件
mv hello.text /data
#移动文件并重命名为hi.text
mv hello.text /data/hi.text
#对文件做重命名
mv hello.text hi.text
#查看文件内容 catch ,适用于查看内容小的文件
cat hello.text
#查看文件内容并显示行号
cat -n hello.text
#分屏查看文件内容
more hello.text
#分屏查看文件内容 less ,跳到开头shift + G,跳到最后G
less hello.text
#查看带有别名的命令
alias
#出参
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
#输出到控制台,-e 表示支持反斜线控制的字符转换
echo "hello world"
#换行输出
echo -e "hello \n world"
#使用echo 配合 >> 追加文本或者配置到文件下
echo "hello world" >> config.yml
# > 表示覆盖 , >>表示追加到文件末尾
#查看系统环境变量
#显示所有环境变量
echo $
#显示path环境变量
echo $PATH
#查看文件头部内容
head hi.text
#查看文件头部内容前200行
head -n 200 hi.text
#输出文件尾部内容
tail hi.text
tail -n 200 hi.text
# -f 实时追踪文件的更新,跟踪最后200行
tail -200f hi.text
#查看文件的索引号
ls -i hi.text
#创建软连接ln,也就是快捷方式 -s:soft
ln -s [文件或目录] [软连接名]
#在想要生成软连接的位置去执行
# 属性值首字l表示这个是软连接
ln -s /data/logs mylog
#想要查看软连接对应的物理路径,使用-P
pwd -P
#删除软连接
rm mylog
#rm -rf mylog/ 注意:带后面的斜杠会把软连接对应的真实目录下的内容删掉
#创建硬连接 不加 -s,当前文件的链接数不包含软连接的数量,是指硬连接的数量。
ln /data/logs hardlog
#查看已执行过的历史命令
history
#显示10条历史命令
history 10
#清空历史命令记录
history -c
more语法
less语法
时间日期类
#获取当前日期
date
#获取当前年份
date +%Y
#获取格式化的日期
date "+%Y-%m-%d %H:%M:%S"
2024-06-05 20:05:55
#获取当前时间戳
date +%s
#获取计算的时间,1天前
date -d "1 days ago"
#获取日历
cal
#获取当前月的前后3个月日历
cal -3
cal 2024
用户权限类
- 新建用户默认在自己同名的组里面,一个用户可以属于多个组。
#添加新用户
useradd 用户名
#添加新用户到某个组
useradd -g 组名 用户名
#设置用户的密码
passwd 用户名
#判断当前是否有这个用户
id 用户名
id zhangsan
#查看所有系统用户
less /etc/passwd
#切换用户 su: switch user
su 用户名
su zhangsan
#切换到用户主目录
cd ~
#返回当前使用的是哪个用户
who am i (最外层会话是哪个用户)
whoami (当前会话是哪个用户)
#设置普通用户具有root权限,需要先给该用户添加到sudoers文件名单中
sudo ls
#修改sudoers文件
vim /etc/sudoers
#删除用户 ,用户会被删除,用户主文件夹还在
userdel zhangsan
#删除用户且删除其主文件夹
userdel -r zhangsan
#新建一个组
groupadd 组名
groupadd dev
#修改组名
groupmod -n new old
#删除组
groupdel 组名
#修改用户所属组
usermod -g 组名 用户名
usermod -g dev zhangsan
sudoers增加权限名单
文件权限类
- UGO:user group other权限。
- vim 强制保存 :wq! 时,如果执行保存的用户没有sudo权限是不能强制保存的。
#改变权限 chmod ,ugoa表示希望对哪个权限部分做更改,a表示全部
# +表示增加权限,-表示删除权限,=赋予权限。不能有空格
chmod a=rwx hi.text
#给用户加执行权限
chmod u+x hi.text
#4=r 2=w 1=x
#对文件修改最大权限
chmod 777 hi.text
#对文件夹及其子文件夹下所有文件设置权限用 -R
chmod -R 777 /data/logs
#用户可读写,所属组和其他可读
chmod 644 hi.text
#改变文件或文件夹所有者 u -R表示递归操作 recursive
chown 用户 文件/文件夹
chown log hi.text
#改变文件或文件夹所在组
chgrp 用户组 文件/文件夹
chgrp happy hi.text
一个文件UGO三种不同的权限
修改权限
搜索查找类
#人类可读话展示详情,文件大小会按M K 去展示而不是默认的kb单位
# -h human 人类可读
ls -lh
#查询命令所在的位置
which ls
which which
#或者用这个查询命令所在的位置
whereis locate
#查找文件或者目录,会从指定目录向下递归遍历查找
find [搜索文件夹] [选项]
#查找当前文件夹
find -name "log"
#根据文件名称查找
find /usr -name "log"
#模糊查找
find /usr -name "*log"
#根据文件所属用户名查找文件,即属主
find /usr -user devlop
#根据文件大小来查找文件,查找size 超过10M的文件
find /usr -size +10M
#快速定位文件路径,在所有文件中查找
locate hello.text
#因为locate是根据索引数据库建立的搜索机制,所以新创建的数据要执行刷新操作把更新刷到locate上
updatedb
#grep过滤查找及|管道符 -n 显示匹配的行号
grep -n [查找关键词] [查找的文件]
grep -n boot develop.log
#管道就是把前面的处理结果通过| 管道传递给下一个命令处理
#将ls的文件名通过管道进行过滤出带有log的数据出来
ls|grep "log*"
#grep wc :word count 统计关键词出现次数 ,空格表示分词
grep "boot" develog.log| wc
压缩和解压类
- gzip /gunzip只能对文件进行压缩解压
- gzip 压缩后的文件后缀就是原文件名.gz
- zip /unzip对文件和文件夹都能进行压缩解压
- zip 压缩后的文件后缀就是原文件名.zip
- zip兼具打包和压缩的功能
- tar是打包命令,结合gzip进行压缩得到.gz后缀的文件 ,tar的压缩效率更高,一般用tar进行打包压缩
#压缩文件
gzip hi.text
#解压文件
gunzip hi.text.gz
#压缩文件目录及其子文件夹,递归 -r
# [myroot.zip压缩后的文件名,可以放路径,则表示要把文件压缩在指定路径下 的文件] [/root 表示要压缩的目录文件夹]
zip -r myroot.zip /root
#解压缩 -d:指定解压后的文件夹存放位置
unzip -d /backup myroot.zip
#打包并压缩文件目录
#[mytar.tar.gz 指定打包后的名称] [/root 打包的文件夹,可以用空格隔开打包多个文件]
tar -zcvf mytar.tar.gz /root
tar -zcvf mytar.tar.gz hello.text hi.text
#解压解包 -C 表示指定解压到哪个文件夹下
tar -zxvf mytar.tar.gz -C /tmp
gzip压缩文件
zip
tar
磁盘管理类
- 个人电脑硬盘一般用SATA ,服务器追求性能用SCSI
- 设置自动挂载光盘则需要修改配置文件/etc/fstab
- 硬盘挂载需要三步骤,虚拟机添加硬盘需要reboot重启
- 分区
- 对分区按照指定的不同的文件系统类型进行格式化
- 设置挂载点
#以树形结构展示产品文件夹目录,需要安装tree命令
yum install tree
#展示指定目录树形结构
tree /
tree ./
tree /root
#查看文件和目录占用磁盘的空间大小 du: disk usage
du /root
# -h :human -s :sum -a :all
#查看总数
du -sh
#查看所有文件夹统计
du -ah
#只查看到第几层级的统计 ,1表示就只看第一层目录结构
du --max-depth=1 -ah
#查看磁盘剩余空间情况 df: disk free -h:human readable 加/表示查看指定分区
df -h /
#查看所有分区的磁盘剩余空间情况
df -h
#下面这些都是基于内存的文件系统
tmpfs
devtmpfs
#查看内存的使用情况
free -h
#查看设备挂载情况 lsblk :list block MOUNTPOINT:挂载点
# -f 查看详细信息,可以查看UUID,用于配置开启自动挂载光盘
lsblk -f
#IDE 硬盘对应 hda,hdb...
#SATA 、SCSI sda,sdb ...
#虚拟化媒体设备 vda,vdb...
#查看待挂载的光盘
ll /dev/|grep sr0
#创建挂载点文件夹作为挂载位置
mkdir /mnt/cdrom
#光盘挂载/卸载 mount /umount 一般挂载到/mnt文件夹上
mount [-t vfstype] [-o options] device dir
#手动挂载光盘 要挂载的光盘位置 挂载到的位置/mnt/cdrom
#注意如果是图形化界面会自动挂载上,不需要执行mount挂载
mount /dev/cdrom /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
#卸载光盘挂载,后面是设备的位置/dev开头
umount /dev/cdrom
#查看当前的分区和挂载点来确认移动硬盘的位置
lsblk
#查看硬盘分区详情
fdisk -l
#查看到硬盘分区名称
#1硬盘挂载/卸载 fdisk 硬盘设备名
fdisk /dev/nvme0n2
#输入m查看帮助
n
w
#2指定硬盘的文件格式 make file system
mkfs -t xfs /dev/nvme0n2
#如果指定不了硬盘文件格式要求-f 强行格式化的语句
mkfs.xfs -f /dev/nvme0n2
#3挂载到挂载点上,挂载到/home/log下,表示该目录文件夹下存的内容实际是存储在/dev/nvme0n2 这块硬盘上
mount /dev/nvme0n2 /home/log
#卸载可以给设备名称,也可以直接给挂载点位置,因为是一一对应的。
umount /home/log
umount /dev/nvme0n2
磁盘使用情况查看
外接光盘挂载
设置自动挂载光盘
硬盘分区最多16个分区
根据英文注释知道对应命令意思
进程管理类
-
一个正则执行的程序或命令,就叫做进程(PID)-process
-
启动之后一直存在,常驻内存的进程,叫做服务-service
-
服务名称后面带d,是守护进程。
-
注意,命令的参数带-的是UNIX风格,不带-的是BSD风格。
- 如不带-:ps aux|grep 'java'
- 带-:ps -ef|grep 'java'
-
系统级别的进程的父进程大部分都是2号进程:PID=2
-
用户级别的进程的父进程大部分都是1号进程:PID=1
-
watchdog:看门狗,主要用来监控进程状态的。
-
ps命令像个快照,top是直播,实时监控。
#查看进程状态 process status
#ps只显示当前用户调用的线程和终端的线程
ps
# 也可以不加管道过滤,就是查看所有进程
#ps -ef 还多展示PPID,也就是当前进程的父进程 :process parent id
ps -ef
ps aux|grep 'java'
ps -ef|grep 'java'
#使用分页查看列表
ps -ef| less
#查看远程登录的进程
ps -ef|grep sshd
#终止进程 可以通过pid或进程名称处理, -9表示强制终止
kill -9 1233
#表示进程名称是firefox的都终止,也就是关掉所有浏览器
killall firefox
#谨慎使用killall
#终止远程连接进行,注意执行这个后就无法进行远程登录连接,因为sshd这个服务进程也被终止了,只能从物理机上进行登录,打开sshd远程服务,才能再被远程连接上。
killall sshd
systemctl start sshd
#-9是一个信号值,可以通过-l命令查看
kill -l
#查看进程数
pstree
#分页查看,按q退出
pstree |less
#-p 显示pid -u 显示进程所属用户
pstree -p
pstree -u
#没有该命令则执行安装
yum install pstree
#实时监控系统进程状态,默认3s刷新一次,按q退出
top
#按 shift m 表示按内存大小排序
#按 shift p 表示按cpu占用大小排序
#按 shift n 表示按进程号大小排序
#按 u 可以输入过滤用户
#按 k 可以输入要终止的进程PID,再输入终止信号 9 终止进程
#设置每个多少秒刷新,10s刷新
top -d 10
#监控某个进程,指定pid -p
top -p 2393
# -i idle 表示每次刷新间隔期间一直是S,睡眠状态的就不展示,用于监控目前的活跃进程
top -i
显示网络状态和端口占用信息
- socket :ip + port
- socket相当于一个门
- 端口号范围:0到65535
- 0.0.0.0 表示本地的所有地址
- 0.0.0.0:123 表示所有地址的123端口
- 127.0.0.1 本机地址。
- ssh远程 连接的端口号是22
# netstat 查看进程网络信息,加grep是用于查找
netstat -anp
netstat -anp|grep 进程号
#查看网络端口号占用情况
netstat -nlp
netstat -nlp| grep 端口号
进程状态
ps aux
ps -ef
终止进程
pstree
实时监控系统进程状态
ni:nice 表示进程谦让的优先级,nice值越高,执行优先级越低,表示老实谦让度高,容易被插队。
系统定时任务
- 定时做备份、清理等任务
#crontab 打开定时任务服务,查看状态
systemctl status crond
#查看定时任务列表 l:list
crontab -l
#新增标记定时任务 e:edit
crontab -e
#编辑定时任务,每个1分钟追加hello world 到 hello.text文件中
*/1 * * * * echo "hello world" >> /root/hello.txt
#通过tail 查看追加的日志
tail -20f hello.txt
crontab
软件包管理
- rpm,redhat package manager,红帽软件包管理工具 ,centOS用
- apt是ubantu的。
- .rpm就是安装包,安装包的路径一般在/packages路径下
- rpm 安装时如果有其他的依赖而本机没有时会按照失败,提示先安装依赖**
- 一键智能化安装软件,包含安装安装包依赖的依赖包,使用YUM
- YUM:yellow dog updater,motified
- 是Shell软件包管理器,基于RPM包管理
- 类似于maven
#查询所有安装包文件列表 qa:query all
rpm -qa
# -qi query infomation表示查询详细信息
rpm -qi|grep firefox
#卸载软件
rpm -e firefox
#不检查依赖关系直接删除,不推荐
rpm -e nodeps firefox
#安装软件 rpm -ivh 包全名
#install:安装 verbose:详细信息 hash:进度条
rpm -ivh firefox-68.1.1.x86_64.rpm
#yum 安装firefox ,-y表示交互时都直接回答yes
yum -y install firefox
#查看已经安装的软件
yum list
#查找是否有firefox安装软件
yum list|grep firefox
#移除软件
yum remove firefox
#修改yum源为国内镜像方便加载
先备份本地的
再wget下载
再替换本地的
#安装wget,wget可以通过url拉取文件
yum install wget
#wget htttp://mirro.aliyun.com/repo/ddd
wget htttp://mirro.aliyun.com/repo/ddd
yum
克隆虚拟机
- 右击虚拟机-管理-克隆-创建完整克隆
- 网络ip地址、主机名不能一样
Shell编程
- shell是一个命令行解释器,相当于一个翻译器,把用户命令解释成linux内核可以理解的语言,linux内核再解释成硬件语言去操作执行。
- sh -> bash
- sh脚本默认格式后缀是.sh。这个主要是约定俗成,并不是强制,只要是可执行文件就可以是shell脚本。
- 使用bash, sh ,./hello.sh执行可执行文件实际是打开一个子shell来执行。
- 全局变量对子shell和子shell的子shell都是可见的,而局部变量只对当前shell可见。
- 自定义变量用小写
- 把脚本文件拷贝到bin或sbin目录下,就可以直接执行hello.sh文件。会被当成一个可执行命令。
- 想要脚本可直接执行还有方法就是直接把脚本文件路径添加到$PATH上。
shell脚本的格式
#第一行表示该脚本指定的默认的shell的解析器
#!/bin/sh
#!/bin/bash
#号表示注解
shell
#shell执行脚本 不需要文件有执行权限
bash hello.sh
sh hello.sh
#带绝对路径,相对路径也行,不带默认是指当前路径下的可执行文件
sh /data/logs/hello.sh
#增加文件的可执行权限,可执行文件的颜色是绿色或不一样的颜色。
chmod +x hello.sh
#当前路径下执行脚本,需要文件有执行权限
./hello.shv
#使用source . 执行文件,一般在刷新环境变量文件时使用
source .profile
. .profile
#变量
#环境变量建议大写
#主目录
$HOME
#当前的工作目录
$PWD
#当前使用的shell解析器
$SHELL
#当前的系统用户
$USER
#查看环境变量的值,打印到控制台上
echo $HOME
#查看全部环境变量
env
printenv |less
#查看变量
set
#自定义变量,可以用引号进行语句赋值变量
a=3
a='hello world'
a="holy shit"
#查看变量
echo $a
#打开一个子shell,执行bash命令即可
bash
#通过ps -f 查看当前活动的进程
ps -f
#退出该子shell
exit
#定义全局变量,需要对目前的局部变量执行EXPROT,不要加$
export a
#如果子shell对父shell定义的全局变量做更改,可以更改,但是只对当前shell有效,就算再执行一次exprot a也没用
#默认变量定义是字符串,无法进行数字运算,要运算要用$(())或者$[]
c=$((5=6))
d=$[7+8]
#只读变量,常量
readonly b=6
#删除变量,不带$
unset b
unset a
#脚本的入参处理,用空格隔开表示
#$0表示脚本名称,全路径的脚步名称
$0
#$1-$9表示第一个到第九个参数
$1
#第10个及以上参数要加{}
${15}
#获取所有输入参数个数,用于做参数判断和循环处理
$#
#打印入参,$*是个整体
$*
#入参遍历处理,是个数组
$@
#脚本的返回值,正常执行返回0,其他情况非0
$?
#运算符 expr,要带空格
expr 1 + 2
#乘法,需要对*进行转译
expr 5 \* 2
#expr要进行赋值运算要用$()或反引号``,进行命令替换
a=$(5 + 2)
a= `5 + 2`
#计算表达式
$(())
$[]
#条件判断,用test 或[]
$a= 1
test $a= hello
#[ ] 条件判断,前后要有空格空开,变量比较的等号之间也要空格开
[ $a = hello ]
#通过$?获取最后执行的结果 0表示成功,其他非0表示不等于
$?
#不等于 !=
[ $a != hello ]
#数值比较 - eq ne lt le gt ge
[ $a -gt 3 ]
[ 8 -gt 3 ]
#文件权限判断
[ -r hello.sh ]
[ -w hello.sh ]
#文件类型判断
#文件是否存在
[ -e hello.sh ]
#是否文件类型
[ -f hello.sh ]
#是否是目录
[ -d hello.sh ]
#多条件判断 && ||
[ -e hello.sh && -d hello.sh ]
#三元运算符
[ 8 -ge 3 ] && echo OK || echo notOK
#分支流程判断 if [ true ];then fi:fi是if反过来,类似于我们代码if条件的{}
#用;分割的是两个命令
;then 相当于
换行
then
# -a 就是逻辑与 all -o 就是逻辑或 or
if [ $a -gt 18 -a $a -lt 35 ]; then echo ok;fi
单if脚本语句
#! /bin/bash
if [ "$1"x = "hello"x ]
then
echo "hello world"
fi
#避免空指针的健壮性写法
[ "$1"x = "hello"x ]
#下面这个写法会因为没有入参而执行失败
[ $1 = hello ]
多if脚本语句
#! /bin/bash
if [ "$1"x = "hello"x ]
then
echo "hello world"
else
then
echo "hi world"
fi
#! /bin/bash
if [ "$1"x = "hello"x ]
then
echo "hello world"
elif[ "$1"x = "hey"x ]
then
echo "hey world"
else
then
echo "hi world"
fi
case 脚本语句
#! /bin/bash
case $1 in
1)
echo "one"
;;
2)
echo "two"
;;
3)
echo "three"
;;
*)
echo "other"
;;
esac
#esac是case的颠倒
for循环语句
#! /bin/bash
sum=0
for(( i=1; i<=$1; i++ ))
do
sum=$[ $sum + $i ]
done
echo $sum
#使用变量要加$符号 sum=$sum+$i, +是连接符,要用$[]表示运算括号起来
#(())双小括号里面可以直接用数据的运算符号,不需要用-ge这种转译
#! /bin/bash
for i in {1..100} do sum=$[ $sum + $i ]; done; echo $sum
# {1..100} 表示1到100的序列
#! /bin/bash
for i in "$@" do echo $i; done;
# $@是参数数组
while循环语句
#! /bin/bash
sum = 0
i = 1
while[ $i -le $1]
do
sum = $[ $sum + $i ]
$i = $[ $i + 1 ]
done
echo $sum
#! /bin/bash
sum = 0
while[ $i -le $1]
do
let sum+=i
let i++
done
echo $sum
#let 写法不能有空格,否则会解析报错
read读取控制台输入:IO设备输入
#! /bin/bash
read -t 60 -p "请输入昵称:" name
echo "create success, $name"
函数
- 函数就是一个灵活的脚步,并且可以有返回值
- 调用函数用$(函数名 函数参数)
#时间函数 +%s输出为时间戳格式
date
date +%s
#调用函数
$(date +%s)
#路径剪切 输出:hello.sh
#截取最后一个/之后的路径字符串
basename /root/hello.sh
#路径剪切并去除后缀suffix 输出:hello
basename /root/hello.sh .sh
#获取文件名
#! /bin/bash
echo name: $(basename $0 .sh)
#截取最后一个/之前的路径字符串,输出:/root
#用于获取路径,在该路径创建文件,创建文件夹
dirname /root/hello.sh
#获取当前路径的绝对路径,避免创建文件等在相对路径下会有问题
#思路就是先cd到当前路径,再执行pwd
cd $(dirname $0)
pwd
#写成一行
echo name: $(cd $(dirname $0);pwd)
函数脚本
#! /bin/bash
function add(){
s=$[ $1 + $2]
#如果直接return会受限于最大返回值256的限制
#return $?
echo $s
}
read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
sum=$(add $a $b)
echo "sum="$sum
文件归档,日志归档
通过该脚本实现文件的按日期归档
#! /bin/bash
#参数判断
if [$# -ne 1]
then
echo "参数个数有误,请输入一个参数作为归档目录名"
exit
fi
#从参数中获取命令名称
if [ -d $1]
then
#打印空,表达空一行
echo
else
echo "目录不存在"
echo
fi
#获取文件名
DIR_NAME=$(basename $1)
#获取绝对路径
DIR_PATH=$(cd $(dirname $1); pwd)
#获取当前日期
DATE=$(date +%y%m%d)
#定义生成的归档文件名
FILE=home_log${DIR_NAME}_$DATE.tar.gz
#定义归档的文件路径及文件名称
DEST=/data/logs/$FILE
#开始归档
echo "开始归档"
tar -czf $DEST $DIR_PATH/$DIR_NAME
#判断压缩结果
if [ $? -eq 0]
then
echo
echo "success"
echo "file path: $DEST"
else
echo
echo "fail"
fi
exit
添加到定时任务中
#查看定时任务列表
crontab -l
#编辑定时任务
crontab -e
#每天凌晨2点
0 2 * * * /data/logs/ge_log.sh /data/logs/home_log
正则表达式
#匹配出所有以a开头的字符串
cat home.log|grep ^a
#匹配出所有以log结束的字符串
cat home.log|grep log$
#匹配空行字并显示行号
cat home.log|grep -n ^$
#匹配指定字符r..t的字符串 .表示匹配1个字符
cat home.log|grep r..t
#匹配指定字符r*t的字符串, *表示0到n个字符
cat home.log|grep r*t
cat home.log|grep ^r*t$
#匹配指定区间的字符串
cat home.log|grep r[a-z]*t
cat home.log|grep r[a,b]*t
#用echo测试字符串匹配
echo "ddrrot"|grep r[a-z]*t
#匹配指定字符r$t的字符串, \表示对特殊字符转译
echo "r$t"|grep r\$t
#匹配手机号 -E 表示支持扩展的正则表达符号,比如{}
echo "18939998830"|grep -E ^1[345678][0-9]{9}$
文本处理工具
#截取文本第一列 -d表示要分割的符号 -f 表示要截取的列数
cut -d " " -f 1 cut.txt
#截取文本第1,2列 -d表示要分割的符号 -f 表示要截取的列数
cut -d " " -f 1,2 cut.txt
#通过管道匹配正则后再截取1,6,7列数据
cat /etc/passwd |grep bash$|cut -d ":" -f 1,6,7
# -表示第6列只有的值
cat /etc/passwd |grep bash$|cut -d ":" -f 1,6-
# 1-5列
cat /etc/passwd |grep bash$|cut -d ":" -f 1-5
#提取本机ip地址,先用grep过滤出该行,注意该行前面有空格的话1个字符位置就表示一个分割,要提取第10列
ifconfig ens33|grep netmask|cut -d " " -f 10
awk
#搜索文件以root开头的所有行,并输出该行的第7列
#$7表示匹配到的行,把该行对应的列以参数模式传入到action中,用$去取参数值处理
cat /etc/passwd |awk -F ":" '/^root/{print $7}'
#搜索文件以root开头的所有行,并输出该行的第1和第7列,中间用逗号,分割
cat /etc/passwd |awk -F ":" '/^root/{print $1","$7}'
#如果不搜索直接输出第1和第7列
cat /etc/passwd |awk -F ":" '{print $1","$7}'
#读取数据前和后执行动作,{是代码块} BEGIN END
cat /etc/passwd |awk -F ":" 'BEGIN{print "begin search"} /^root/{print $1","$7} END{print "end search"}'
#提取值并做加法运算,用户id加1
cat /etc/passwd |awk -F ":" '{print $3+1}'
#通过参数形式来进行运算
cat /etc/passwd |awk -v i=1 -F ":" '{print $3+i}'
#awd 内置变量 FILENAME 表示当前的文件名,如果是管道操作FILENAME是-
# NR 行号 NF 列的个数
#查看文件名及打印每一行和列数
awk -F ":" '{print "文件名:"FILENAME "行号:"NR "列数"NF}' hello.txt
#找出ifconfig中的空行的行号
ifconfig |awk '/^$/{print NR}'
ifconfig |awk '/^$/{print "找到的行号:"NR}'
#提取本机ip地址,注意awk自动过滤每行前面的空格符,所以变量是在第二列
ifconfig | awk '/netmask/{print $2}'
应用:发生消息
#查看当前在线用户列表 who
who
#查看当前用户
who am i
#查看当前用户消息功能是否打开 mesg ,is y 表示打开
mesg
#查看在线用户列表的消息功能是否打开 ,+表示打开
who -T
#开启关闭消息功能 n表示关闭
mesg y
mesg n
#EOF 结束发送 ctrl +c 退出
#发送消息 用户,控制台
write log pts/1
发生消息脚本
#! /bin/bash
#查看用户是否登录 -i 忽略大小写 -m 1 表示只拿第一行的数据(用于匹配到多行时)
login_user=$(who|grep -i -m 1 $1|awk '{print $1}')
# -z表示判断是否为空
if [ -z login_user ]
then
echo "$1 用户不存在"
echo
exit
fi
#用户是否开启接受消息功能
mesg_flag=$(who -T|grep -i -m 1 $1|awk '{print $2}')
if [ $mesg_flag != "+"]
then
echo "$1 用户没有开启消息功能"
echo
exit
fi
#确认消息体是否存在
if [ -z $2]
then
echo "没有消息体入参"
echo
exit
fi
#提取消息体
message=$(echo $* |cut -d " " -f 2-)
#message=$($* |awk '{print $2-}')
#获取用户登录的终端
login_teminal=$(who|grep -i -m 1 $1|awk '{print $2}')
#写入消息 ,通过管道传输
echo $message | write $login_user $login_teminal
if [ $? !=0 ]
then
echo "fail"
else
echo "success"
fi
exit
shell
变量
运算符
条件判断
if
case
for
while
IO控制台交互
cut
awk
Shell命令大全拾补
- exit / bye ,退出终端。
- cd(change dirctory),切换目录
- ifconfig [interface config],linux查看ip地址的命令
- hostname ,查看主机名
- ls /data/logs/ | grep 'home' ,根据关键词查找文件夹里的文件或文件夹。(先列出列表再通过管道进行筛选)
- shutdown ,一分钟后倒计时关机
- shutdown now ,马上关机。
- shutdown 3 ,表示3分钟后倒计时关机,单位是分钟。
- shutdown -c ,取消关机。
- shutdown 15:15 ,表示在这个时间进行关机。
- poweroff ,马上关机。
参考
Linux快捷键
- ctrl + alt(option) 唤起鼠标光标。
- ctrl + alt(option) + f2 ,创建一个真实的命令解释层终端。
- ctrl + alt(option) +f1 ,关闭真实的命令解释层终端,退回桌面的图形化界面。
- ctrl + shift + + (因为+在上面,所以要加个shift),放大终端界面和字体大小
- Ctrl + - ,缩小终端界面和字体大小
- Ctrl + 0 (数字0) ,回归默认大小
- Ctrl + command ,释放鼠标展示。
疑问
- mac的类似xshell的远程登录工具推荐?
- 远程文件传输工具xftp也是,有什么mac版