..

那些常用的linux小技巧

既然是常用的技巧,肯定是随时都能用,在各个 linux 发行版上都能用,都是最纯粹,最简单有效的技能。

网络

检查网络端口是否网络联通

curl {ip}:{port} -v

比如:

vagrant@archlinux _posts (master) $ curl 127.0.0.1:22 -v
*   Trying 127.0.0.1:22...
* Connected to 127.0.0.1 (127.0.0.1) port 22 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:22
> User-Agent: curl/7.74.0
> Accept: */*
>
* Received HTTP/0.9 when not allowed

* Closing connection 0
curl: (1) Received HTTP/0.9 when not allowed

从输出日志可以看到 Connected 字样,说明端口是通的,类似的方式还有,netcat,telnet,不过这2个工具经常在服务器上没有。

获取 DNS 解析结果

通常我们使用 dig 或者 nslookup 命令来查看解析域名,但是这2个工具在很多场合下都没有,所以我们可以使用其它的工具来代替,比如: curl , ping

vagrant@archlinux _posts (master) $ ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=46 time=32.4 ms
vagrant@archlinux _posts (master) $ curl baidu.com -v
*   Trying 220.181.38.148:80...
* Connected to baidu.com (220.181.38.148) port 80 (#0)
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.74.0
> Accept: */*
>

甚至是 wget 命令

vagrant@archlinux _posts (master) $ wget google.com
--2020-12-29 13:44:10--  http://google.com/
Resolving google.com (google.com)... 46.82.174.69
Connecting to google.com (google.com)|46.82.174.69|:80...

网络代理

如果我们的服务器不能上网,但是内网中有其它的代理机器可以上网,我们也可以通过设置代理环境变量来上网比如

export https_proxy=http://{ip}:{port}
export http_proxy=http://{ip}:{port}
export no_proxy=host1,host2

注意最后一条,我们也可以通过设置 no_proxy 来跳过某些网址不要走代理(多个用逗号隔开),还要说明的是上面的环境变量全大写或者全小写都可以. wget 命令也可以通过 -e 参数来设置代理的环境变量。

网络认证

netrc 是中比较简单粗暴的网络认证方式,对于 wget , curl , git 都适用,基本用法就是在 $HOME 目录下面创建一个隐藏文件 .netrc 添加如下内容:

machine {your host` login {username} password {your pass}

具体可以查看 wiki. curl 和 wget 也都还有命令设置认证的方式,具体可以参考: https://stackoverflow.com/questions/3044315/how-to-set-the-authorization-header-using-curl

文本文件

文本搜索

这方面的内容,我第一个要介绍的就是 grep 命令,他实在太强大了,常规的用法,我需要在一堆目录中搜索一个单词

grep {your keyworkd} -rn {foler}

这里 -r 是递归的意思, -n 是显示行号的意思,经常我遇到程序打印了我看不懂的一异常日志,我回拿着日志的关键信息到代码里面搜索,很快就能找到原因。当然关于 grep 的用法还有

grep -e "aaaa|bbb" file  # 根据正则搜索
grep -v "aaa"            # 排除搜索

awk 也算是一个不错的文本搜索工具,他能从文本去取出你想要的列,默认情况是按照空格分开字符串,你可以使用 -F 选项来设置一个风格符号

awk -F `a` # 使用字符 a 分割字符串

从字符串中获取想要的列

awk '{print $1}'

这里使用 $1 获取第一列,注意第一列是 $1 而不是 $0 , $0 代表当前字符串,一次想要获取后面其它列可以使用 $2 , $3 …, awk 还能使用 printf 函数来格式输出这里就不多介绍了。

文本显示

strings 命令是一个不错的工具,大部分的 linux 都有这工具,它可以查看二进制文件中的字符串信息,对于二进制文件和文本文件都可以使用,所以你在也不用担心不小心对一个二进制文件使用 cat 后输出一堆乱码而手足无措。

批量操作

一般我们选出出来的字符串,我们还会通过管道符来操作,比如获取本机器上的所有镜像名字,然后删除他们

docker image ls | awk '{print $3`}' | xargs -I {} -P 4 docker rmi {}

这里我们就使用到了 xargs 这命令, -I 选项设置的我们的目标字符串用 {} 代理,后面的命令回自动拼接并且执行,使用 -P 设置最大并发数量。