https://www.jianshu.com/p/3ed342a28a9d
kafka版本,
linux中shell变量$#
,$@
,$0
,$1
,$2
的含义解释:
1 |
|
A:$*
和$@
的区别
$*
和 $@
都表示传递给函数或脚本的所有参数,不被双引号(“ “)包含时,都以"$1" "$2" … "$n"
的形式输出所有参数。
但是当它们被双引号(“ “)包含时,"$*"
会将所有的参数作为一个整体,以"$1 $2 … $n"
的形式输出所有参数;"$@"
会将各个参数分开,以"$1" "$2" … "$n"
的形式输出所有参数。
1 |
|
./test.sh "a" "b" "c" "d"
1 |
|
B:$?
退出状态
就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1
。不过,也有一些命令返回其他值,表示不同类型的错误。
getopts
方式实现短选项的处理1 |
|
A:while getopts ":a:bc" opt
第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
B:shift $(($OPTIND - 1))
通过shift $(($OPTIND - 1))
的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell编程处理了。
C:basename $0
取出文件名
D:usage 1
代表传参1,在usage中执行exit 1退出
1 |
|
F:放在shift $(($OPTIND - 1))
之后,有两个作用:一是传入参数为0时退出,二是选项之后没有跟参数时退出
G:getopts不能直接处理长的选项(如:–prefix=/home等)
H:内置变量$OPTARG
和$OPTIND
,$OPTARG
存储相应选项的参数,而$OPTIND
总是存储原始$*
中下一个要处理的元素位置
I:interface=${OPTARG:-any}
为了在interface为空字符串时赋值any,interface=${interface:-any}
,为了防止在interface没有输入时,设置为any
getopt
实现长/短选项的处理1 |
|
getopt
1 |
|
1 |
|
A:read后面的变量只有name一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个变量,第二个数据给第二个变量,如果输入数 据个数过多,则最后所有的值都给第一个变量。如果太少输入不会结束。在read命令行中也可以不指定变量.如果不指定变量,那么read命令会将接收到的数据放置在环境变量REPLY中
-p参数,允许在read命令行中直接指定一个提示
B:计时输入
1 |
|
A:位置参数可以用shift命令左移。比如shift 3
表示原来的$4
现在变成$1
,原来的$5
现在变成$2
等等,原来的$1
、$2
、$3
丢弃,$0
不移动。不带参数的shift
命令相当于shift 1
B:Shift 命令还有另外一个重要用途, Bsh 定义了9个位置变量,从 $1
到$9
,这并不意味着用户在命令行只能使用9个参数,借助 shift 命令可以访问多于9个的参数。
1 |
|
./shift.sh 10 20 15
eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量
eval set -- "{value}"
If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters are set to the args, even if some of them begin with a -.(即使有些参数是以-开头的,只要有参数,都会被设置位置参数)
1 |
|
2> /dev/null || true
Regarding || true - If command return non 0 (zero) exit status (that usually indicating some type of error/failure) then true forcible set exit status code to 0 (zero) indicating success
stdin(标准输入,文件描述符0),stdout(标准输出,文件描述符1)和stderr(标准错误,文件描述符2)
2> /dev/null
将错误信息丢弃
2>&1
将标准错误重定向到标准输出的地址(&1)
&>/dev/null
所有IO重定向(&>中的&可以代表任意,0,1,2,3……)
https://superuser.com/questions/1179844/what-does-dev-null-21-true-mean-in-linux
&
放在启动参数后面表示设置此进程为后台进程,一般为了防止信息输出干扰屏幕可以ping 127.0.0.1 &>/dev/null &
command1 && command2
,如果command1执行成功
,那么执行command2
command1 || command2
,如果command1执行失败
,那么执行command2
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
[ ! false ]
返回 true。[ $a -lt 20 -o $b -gt 100 ]
返回 true。[ $a -lt 20 -a $b -gt 100 ]
返回 false。[[ $a -lt 100
&&$b -gt 100 ]]
返回 false[[ $a -lt 100 || $b -gt 100 ]]
返回 true[ $a = $b ]
返回 false。[ $a != $b ]
返回 true。[ -z $a ]
返回 false。[ -n $a ]
返回 true。[ $a ]
返回 true。[ -b $file ]
返回 false。[ -c $file ]
返回 false。[ -d $file ]
返回 false。[ -f $file ]
返回 true。[ -g $file ]
返回 false。[ -k $file ]
返回 false。[ -p $file ]
返回 false。[ -u $file ]
返回 false。[ -r $file ]
返回 true。[ -w $file ]
返回 true。[ -x $file ]
返回 true。[ -s $file ]
返回 true。[ -e $file ]
返回 true。1.示例1
1 | #!/bin/sh |
2.示例2
1 | >> dirname /usr/bin/sort |
#跳转到脚本所在目录,并输出当前目录地址到SCRIPTS_DIR变量,
1 | SCRIPTS_DIR="$(cd $(dirname "$0"); pwd -P)" |
1 | [root@server /home/q/mysql/multi/3308/private]# ln -s /tmp test |
通过管道监视数据的进度
1 | -f, --force |
A:. $(dirname $0)/wsrep_sst_common
从当前目录读取wsrep_sst_common文件并在当前进程执行,类似import语句,相当于source命令
B:可以使用点命令/source命在不修改文件权限的情况下,直接执行shell脚本. test.sh/source test.sh
,它与直接执行shell的区别在于这样执行的shell是在本地shell中执行,而./test.sh 是在子shell中执行。
C:常用在多个shell文件公用变量时,可以将变量抽到一个文件中,在使用时source进去
15.declare用于声明 shell 变量
-a Each name is an indexed array variable (see Arrays above).
没有效果; 该命令除了扩展参数和执行任何指定的重定向之外什么都不做。 返回零退出代码
脚本注释、占位符
1 | #!/bin/sh |
执行任何指定的重定向
1 | : > file等价于>file |
shell中的冒号“:”–个人整理总结版-注意与makfle中:的区别
1 | $ 变量表达式 |
:=句法
1 | 只有当变量username已被定义,而且是一个空值时,变量username才会被设置为变量LOGNAME的值 |
=句法
1 | 只有当变量name未被定义过,变量name才会被设置为变量LOGNAME的值,当username被定义过,则会输出空行 |
:=句法
要比=句法
限制更松些,:=句法
允许变量为空,只有:=句法
和=句法
赋值
当脚本或者函数需要依赖某些定义变量时,就要使用这种语法。它主要应用于登陆。如果一个特定环境变量还没有被定义,就可以给它赋予脚本所需要的值
:-句法
1 | 只有当变量username为空时,在`“${}”`句法中username被替换为`$LOGNAME` |
-句法
1 | 只有当变量username为空时,在`“${}”`句法中username不会被替换 |
:-句法
要比-句法
限制更松些,:-句法
允许变量为空,但是与:=句法
要比`=句法区别是都不会给变量赋值
当脚本评价或检查系统环境的时,:-句法和-句法都可以使用。这两种检查基本上是相反的,它们用默认值替换变量,或者甚至于不依赖username变量是否已经被定义。如果脚本中急需要一组被定义的变量,也需要一些不该被定义的变量,那么在脚本执行任务之前组合这两种句法,肯定可以实现正确的设置。
:?句法
1 | 当变量未被定义或者定义了一个空值时,那么在echo命令中就会使用LOGNAME的值,并且脚本退出执行 |
?句法
1 | 当变量未被定义时那么在echo命令中就会使用LOGNAME的值,并且脚本退出执行 |
:?句法
与?句法
区别在于,?句法
允许变量为空”
:+句法
只有当变量已被定义而且是非空的时候,“${}”表达式才执行替换
1 | [root@server ~]# username="ss" |
+句法
,
1 | 只要变量被定义了即使为空,“${}”表达式也执行替换 |
:+句法
要比+句法
要求苛刻些,+句法
允许变量为空
区别:
:?句法
与?句法
与其他句法区别:=句法
与=句法
与其他句法区别:=句法
与`=句法会将结果赋值给变量,其他都不会:+
、+
与:-
、-
区别:+
、+
示例检查的是一个已定义的变量,而不是未定义的变量:?句法
、?句法
与:=句法
、=句法
区别?
会退出,=
会赋值.$() 反引号,${},$[] $(()),[ ] (( )) [[ ]]
作用与区别$()
和 反引号
用来做命令替换用
$()
并不是所有shell都支持。1 | [root@server ~]# version=$(uname -r) |
${ }
${ }
用于变量替换。一般情况下,$var
与${var}
并没有啥不一样。但是用 ${ }
会比较精确的界定变量名称的范围
1 | [root@server ~]# A=B |
1 | [root@server ~]# A='abcde' |
$[] $(())
1 | [root@server ~]# a=5; b=7; c=2 |
在 $(( ))
中的变量名称,可于其前面加$
符号来替换,也可以不用$(( $a + $b * $c))
也可得到 19 的结果
[ ]
:1.你必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错
2.test命令使用标准的数学比较符号来表示字符串的比较,而用文本符号来表示数值的比较。很多人会记反了。使用反了,shell可能得不到正确的结果。
3.大于符号或小于符号必须要转义,否则会被理解成重定向。
(( ))及[[ ]]
:[[ ]]
中增加了另一个特性:模式匹配(( ))
,不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号:Linux shell 中$()
,${},$[] $(()),[ ] (( )) [[ ]]
作用与区别
1 | ipaddr=`/sbin/ifconfig | grep 'inet addr:' | grep -v '127.0.0.1'|cut -d : -f2 | awk '{print $1}'` |
预设权限
目录的预设权限是:
1 | 0777 drwxrwxrwx |
文件的预设权限是:
1 | 0666 -rw-rw-rw- |
其中r的十进制值是4,w的十进制值是2,x的十进制值是1
1 | umask=022中"022"是八进制的写法,如果换成二进制是000010010 |
umask决定目录和文件被创建时得到的初始权限
umask = 022时
新建的目录 权限是755
文件的权限是 644
readonly命令用于定义只读shell变量和shell函数。readonly命令的选项-p可以输出显示系统中所有定义的只读变量。
http://man.linuxde.net/readonly
功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,more命令从前向后读取文件,因此在启动时就加载整个文件
.
参数命令
-n 定义屏幕大小为n行,不指定会覆盖整个屏幕
常用操作命令:
按 b 键就会往回(back)一页显示
空格键 向下滚动一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
!命令 调用Shell,并执行命令
q 退出more
例子:
ls -l |more -2
more命令
-c 抑制正常输出; 而是为每个输入文件打印一个匹配行数,用-v部分计算不匹配的行
-v排除某一行
1 | [root@server ~]# grep -c for httpserver.py |
ethtool 是用于查询及设置网卡参数的命令
1 | [root@server ~]# ethtool em3 |
1 | ifconfig |
1 | 卸载网卡 |
https://huangkaibo.cn/2018/04/21/ifconfig-ifup-ifdown/
1 | ifup eth0 |
dhclient命令使用动态主机配置协议动态的配置网络接口的网络参数
route -n # 查看路由表
netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.86.40.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 10.86.40.1 0.0.0.0 UG 0 0 0 eth0
dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具
1 | tldr dig |
1 | DNS Lookup utility. |
输出内容太多,只显示结果
1 | dig +nssearch baidu.com any |awk '{print($11)}' |
1 | dig +noall +answer dubai.com any|awk '{print($5)}' |
1 | [root@server ~]# ss -lt |
ss
ss的含义 Socket State
查看链接
https://blog.csdn.net/arkblue/article/details/7876210
1 | netstat -ni |
1 | netstat -na|less |
查看机器开放哪些端口:
1 | netstat -tunlp |
查看进程对应开放端口
1 | netstat -tunlp|grep pid |
查看端口使用情况lsof -i tcp:port
查看进程详细信息lsof -p pid
tshark不仅有抓包的功能,还带了解析各种协议的能力
https://www.centos.bz/2014/07/linux-commandline-capture-packets-tshark-wireshark/
http://www.qingpingshan.com/pc/fwq/353123.html
1 | tcpdump -s 65535 -x -nn -q -tttt -i any -c __count__ host __host__ -w data.cap |
1 | sudo ngrep -x -q -d lo '' 'port __port__' |
https://linux.cn/article-8253-1.html
NetCat,在网络工具中有“瑞士军刀”美誉,一个简单、可靠的网络工具,可通过TCP或UDP协议传输读写数据,但是不同版本支持参数会有差异
,当某些参数不能用时可以先确认下版本
1 | [root@server1 ~]# type -a nc |
下面以Centos6.4,nc1.84.22版本进行演示,A机器ip:192.168.10.1 B机器ip: 192.168.10.2
nc 使用不同的箭头符号来控制到底是接收数据还是发送数据,下面是由主机A传输数据到主机B
参数解释:
一般正常传输,主机A开启监听,主机B nc连接获取数据
1 | 主机A: nc -l 1234 < xxx.txt |
当存在防火墙的时候,一般防火墙设置策略是:只会限制远程机器不能直接访问本机开放的特殊端口,但是并不会限制本地机器访问远程机器
,这样可以使用反向shell,在远程主机B上开启监听,墙内机器A nc连接 远程主机B
1 | 墙内主机A: nc 192.168.10.2 1234 < xxx.txt |
如果想主机B传输数据到主机A,也对应正向反向两种,这里只用正向传输举例,反向传输类似
1 | 主机A: nc -l 1234 > xxx.txt |
1 | A:tar -czvf - testdir/|nc 192.168.10.2 1234 |
参数解释:
1 | nc -nvz 1.1.1.1 1-65535 |
受害者主机主动连接攻击者的服务端程序,将自己的bash权限交给攻击者
受害者:
Ubuntu Linux ——> 192.168.146.128
攻击者:
Kali Linux ——> 192.168.146.129
1 | 攻击者机器: nc -lvp 2333 |
1 | A:nc -lp 333| dd of=/dev/sda |
service iptables status
service iptables start
iptables -I FORWARD -p tcp –dport 3306 -j DROP
iptables -I FORWARD -p tcp –dport 3306 -j ACCEPT
1、iptables -L
查看filter表的iptables规则,包括所有的链。filter表包含INPUT、OUTPUT、FORWARD三个规则链。
说明:-L是–list的简写,作用是列出规则。
2、iptables -L [-t 表名]
只查看某个表的中的规则。
说明:表名一共有三个:filter,nat,mangle,如果没有指定表名,则默认查看filter表的规则列表(就相当于第一条命令)。
举例:iptables -L -t filter
在某些情况下,我们需要模拟网络很差的状态来测试软件能够正常工作,比如网络延迟、丢包、乱序、重复等
https://www.hi-linux.com/posts/35699.html
Linux环境下切断tcp连接,google搜索关键字:“close””tcp connection””linus”,开发调试的时候,为了模拟意外情况,需要在不影响服务进程的情况下单独 切断tcp连接,即 强制断开tcp连接。不能使用iptables,因为iptables的禁用对已经建立的tcp连接无效(这是由tcp的机制决定的)
1 | wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/perl-Net-RawIP-0.25-1.el6.rf.x86_64.rpm |
perl killcx 127.0.0.1:1234 lo
切断tcp连接,在linux环境下
Killcx : close a TCP connection (for Linux)
1 | # 每0.01秒给192.168.10.147发送一个大小65500字节的icmp包 |
ping -c 3(ping3次) -q(不打出输出信息) www.baidu.com(网址)
1 |
|
扫描局域网内ip地址:
nmap -sP 本地IP/24
nmap -F -sT -v www.quar.com
proxychains
1 | curl https://www.google.com/ |
实用socket5代理请求
ssh -qtfnN -D 127.0.0.1:1080 root@192.168.10.1
ssh命令的三项代理功能
-q
Quiet mode. Causes most warning and diagnostic messages to be suppressed.
-T
Disable pseudo-terminal allocation.
-D
[bind_address:]port]
-f
Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background. This implies -n. The recommended way to start X11 pro-grams at a remote site is with something like ssh -f host xterm.If the ExitOnForwardFailure configuration option is set to ``yes’’, then a client started with -f will wait for all remote port forwards to be successfully established before placing itself in the background
-n
Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. A common trick is to use this to run X11 programs on a remote machine. For example, ssh -nshadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel. The ssh program will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the -f option.)
-N
Do not execute a remote command. This is useful for just forwarding ports.
linux网络IP发包工具
1 | # http://www.earth.li/projectpurple/progs/sendip.html |
https://blog.csdn.net/freexploit/article/details/503954
https://blog.csdn.net/zh_94/article/details/81660184
1 | sendip -p ipv4 -is 192.168.1.2 -id 192.168.1.1 -p icmp -d -x89ABCDEF www.baidu.com |
#NAS
Docker 和 Docker Compose install
https://www.jianshu.com/p/77a46925006c
sudo docker-compose up -d
mysql install
https://askubuntu.com/questions/364270/mount-error-unknown-filesystem-type-exfat
https://askubuntu.com/questions/771473/mount-cant-find-device-in-etc-fstab/771496
go get -u -v github.com/iikira/BaiduPCS-Go
https://www.cnblogs.com/nerxious/archive/2012/12/21/2827303.html
z<Enter>
将光标所在行移动到屏幕顶端常用压缩软件的发布:
压缩软件 | 使用的版本 | 第一个版本发布时间 | 最新版本号 | 最新版本发布时间
———|————|——————–|————|———–
gzip | 1.5 | 1992.10.31 | 1.9 | 2018.2.7
pigz | 2.3.4 | | 2.4.0 | 2017.12.26
bzip2 | 1.0.6 | 1996.07.18 | 1.0.6 | 2010.09.20
pbzip2 | 1.1.12 | | 1.1.13 | 2015-12-17
lbzip2 | 2.5 | | 2.5 | 2014-03-26
xz | 5.2.2 | | 5.2.4 | 2018-04-29
pigz作为多线程版本的gzip工具,只支持gzip格式
lbzip2/pbzip2作为多线程版本的bzip2工具,只支持bzip2格式
1 | yum install pzip |
linux下我是直接使用fdisk去分区的,windows下我使用的是diskgenius,mac下我只能使用diskutil了
1 | # 卸载磁盘 |
mac os (日志式),mac os(日志式,加密),mac os(区分大小写,日志式,加密),mac os(日志式,区分大小写)
1 | pid=`netstat -anp|grep -i mysqld|grep LISTEN |grep tcp |grep 3316 |awk '{print $7}' |awk -F'/' '{print $1}'`;ps -e -o 'pid,comm,rsz'|egrep 'mysqld '|grep $pid|awk '{print $3/1024/1024"G"}' |
1 | pt-ioprofile -p 31306 --run-time=60 --save-samples=./mysql_ioprofile.txt --group-by=filename --cell=count --aggregate=sum |
首先用top看看,确认是mysqld消耗了cpu然后登陆到MySQL show processlist,看看有没有异常,检查一下threads_running/QPS/TPS有没有显著提高,确认一下是否有慢查询,如果这些都不能帮助你找到问题,就借助神一样的工具perf top,可以看到cpu都用在执行哪个函数了,这样应该可以找到问题原因
1 | perf top -p 3774 |