Linux-Shell命令整理
(遇到不会的就往这里整理呗)
现在想做一个shell的一键启动脚本,装环境不好做脚本,因为执行到一半可能失败。
绝对目录和相对目录
(1) 绝对目录
绝对目录以/
开头,上来直接就是/user 、 /root之类的这些,都是根目录下的
(2) 相对路径
一种写法是 yang/log,最开头没加/,直接就是文件名,这是以当前目录开头的相对路径。
同上,./
,点杠开头也是当前目录开头。
../
是上一级目录开头的。
创建目录
mkdir -p xxx/xxx/xxx/xxx/xxx
加了-p之后,同时创建这一大堆的目录。
不加-p的话,只能创建最后一个。
分号;等同于回车
如果你回车了,就不用写分号,写了分号就不用回车
if条件判断
if[空格-n "$AUTH_pid"空格]
shell编写if,报command not found,原因在于那两个空格,真的恶心
然后-n,-n 的意思是not null
变量定义
A=1
export B=1
这个定义变量变态就变态在中间不能加空格,加一个空格判定你错啊。
上面的是局部变量,下面是环境变量。
shell脚本
写一个脚本是真的没什么难度,顶上一行写一句
#!/bin/sh
没了,后面全是shell语句,真没了。
case
语法:
case 值 in
模式1)
command1
command2
...
;;
模式2)
command1
command2
...
;;
esac
(1) 这里面注意的几点,首先是in后面跟的这个范围,是用
case1)
case2)
这样的形式来写的,顶格写,只有一半的有括号
(2) 每一个分支写完之后,要跟两个;;
,这东西相当于其他语法里面的break了吧
(3) 最后就是case对应了esac
ps查进程
ps -aux|grep hospital
用这个指令查进程是最好的!
netstat
netstat -plt
(原来是alt的,现在改成了plt,p是progress,进程,l是监听,t是tcp连接。这么写可以查到启动的所有的mysql、redis之类的,注意,这个查不到java)
find和locate
find / -name “docker.service”
locate docker.service
目前对于find只会一个-name也差不多了,locate直接就相当于find / -name,后面直接跟文件名的部分字段就可以了,都是自带模糊查询。
grep
grep "docker" docker.txt
(重要) find / -name "docker.service" | grep log
grep跟管道工作符结合在一起可能是最厉害的地方,本来应该在最后加使用文件,然后使用管道工作符变成了在最前面操作一遍,然后把操作结果直接给后面的grep当输入。
(这里差一个|和xargs的区别)
awk
lsof -i:7050 | awk '$2>0 { print $2 }'
awk主要是筛选出某一列出来,用种种条件筛除某些符合条件的行,然后再取其中的某几列。$2>0
筛选行,print $2
筛选列。
awk这个不准备深入学习,真的需要切片分析做日志的时候就会去用python吧。
sed
sed其实是为了替换用的,不过到现在还没遇上啥替换的工作,先不看。
用sed筛选出某几行来
sed -n '5p' file
sed -n '2,5 p' file
sed -n '1~2 p' file
sed -n '2~2 p' file
估计会这些就够了吧。-n用来只显示符合条件的。p用于输出。
管道和xargs -n
管道后面除了接xargs和grep之外还不知道能接别的,就是把上一个命令的输出变成下一个命令的标准输入,但是接收标准输入的命令好像也不多。
xargs是把标准输入变成跟用户手输差不多的形式,xargs还有好几个参数 - n 和 - p,这两个应该最有用。
lsof -ti : 7050 | xargs -pn 1 kill -9
这个-n是切割,由于输出了很多列,每一列都执行一个命令,-n 1 就是每次取一个传给后面的命令表达式。 -n这个应该是非用不可的。
-p是每次执行之前都要输出一下给你看看,然后你敲y才会运行的,这个可用可不用,debug用吧。
history
history | grep firewalld
history可以查看当前账号之前的命令历史,甩锅用。
who
who只能查看不同账户的登录历史,也是甩锅用。
telnet和ping
有用的命令估计也就telnet IP地址 端口
ping IP地址
firewall和iptable
在RHEL 7系统中,firewalld防火墙取代了iptables防火墙。其实,iptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已,或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。
换句话说,当前在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。虽然这些工具各有优劣,但它们在防火墙策略的配置思路上是保持一致的。大家甚至可以不用完全掌握本章介绍的内容,只要在这多个防火墙管理工具中任选一款并将其学透,就足以满足日常的工作需求了。
既然这两个都是管理防火墙的管理工具,那就学firewalld好了,这两个工具运不运行都是无所谓的,看工具后面的防火墙。
运行、停止、禁用firewalld
启动:# systemctl start firewalld
查看状态:# systemctl status firewalld 或者 firewall-cmd --state
停止:# systemctl disable firewalld
禁用:# systemctl stop firewalld
systemctl和service
这两个的区别就懒得列清楚了,systemctl比service更强大,大概的作用都是去管理服务启动停用,开机启动服务这些。
文本编辑
Vim编辑器
vim一开始进入的时候,命令模式不能操作,要输入i然后进入编辑模式,再按esc回到命令模式,再按:进入末行模式,
:q退出 :w保存 :wq保存并退出
搜索模式,进入之后按/,在后面输入要搜的东西,以及跳转的时候不能按空格,要按n(next),然后就跳到下一个。
Cat
cat docker.txt
cat后面直接跟要看的文件,最好是小文件。
工作目录切换
cd
pwd (当前绝对路径)
ls (当前文件夹内容)
Screeen
(screen真是个神器,跟nohup发挥一样的作用,你想让程序不间断运行的时候,这个是真的好用啊!!!)
-
screen -S yourname -> 新建一个叫yourname的session
-
screen -ls -> 列出当前所有的session
-
screen -r yourname -> 回到yourname这个session
-
Ctrl-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
-
screen -S session_name -X quit(这就是在新建那个后面加上了-X quit)
(screen这个命令和nohup这两个是互相替代的,之所以要用nohup是因为你如果不设置成不停止,那你这个xshell一关,程序就退出了。你输完nohup &之后,前台空出来了,你还能接着做其他事情,screen也是一样的作用,只是他可以分很多个屏幕,每个屏幕里面做一件事互不干扰,不需要腾出前台这个需求。)
nohup命令
nohup 是 no hang up 的缩写,就是不挂断的意思。打上了nohup之后,输出到日志文件,前天正常运行;关闭窗口程序不关。
& : 指在后台运行,输出到前台,前台用不了了;关闭窗口程序跟着关了。
- sh test.sh & 将sh test.sh任务放到后台 ,即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失(缺少的日志的输出)
将sh test.sh任务放到后台 ,关闭xshell,对应的任务也跟着停止。
2. nohup sh test.sh 将sh test.sh任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的nohup.out文件,即使<u>关闭xshell退出当前session依然继续运行</u>。
3. nohup sh test.sh & 将sh test.sh任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使<u>关闭xshell退出当前session依然继续运行</u>。
nohup和&的区别
& : 指在后台运行
nohup : nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
&是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出
lsof和netstat
lsof命令更高级一点,还能看见pid进程信息,方便清理。
lsof = netstat + ps(ps是系统进程,其实用lsof主要就是为了看系统的进程号pid的,netstat看不了pid)
以及lsof升级了,lsof -ti:7050,在i前面加一个t,直接就把端口筛出来了,根本就不用什么行列处理之类的。
lsof -ti:7050
kill -9 11111
给Linux用户添加sudo权限
sudo adduser yang sudo
把yang改成别的用户名,一行命令添加sudo权限。