巧妙的Linux命令,再来6个!

系统 Linux
Linux非常有意思,它的KISS原则,本意是好的,但是增加了使用者的记忆负担。不像是python,一个os.dir可以看到所有的函数。

 [[402432]]

本文转载自微信公众号「小姐姐味道」,作者小姐姐养的狗。转载本文请联系小姐姐味道公众号。

再来6个巧妙的Linux命令!

今天新血来潮,突然间又想安利几个Linux命令了。

Linux非常有意思,它的KISS原则,本意是好的,但是增加了使用者的记忆负担。不像是python,一个os.dir可以看到所有的函数。

1. envsubst

很多时候,你需要动态的修改配置文件里的很多信息,比如IP地址,端口等。虽然对于高级语言来说,这有点简单了,但对shell是个比较大的难题。这个时候,对Linux熟悉的同学,会祭出sed命令的替换模式。但是,sed命令的学习曲线,有点陡了。其实,遇到这种情况,有一个更好用的命令,那就是envsubst,它可以无缝的完成变量命名替换。

比如,有下面的redis配置文件,我们需要动态部署,所以它的端口也是不一样的。

  1. port ${PORT} 
  2. protected-mode no 
  3. daemonize no 
  4. appendonly no 
  5. cluster-enabled yes 
  6. dbfilename dump-${PORT}.rdb 
  7. cluster-config-file nodes.conf 
  8. cluster-node-timeout 15000 
  9. cluster-announce-port ${PORT} 
  10. cluster-announce-bus-port 1${PORT} 

我们把端口,给它一个命名,叫做PORT,然后,可以将PORT作为一个变量传入,然后生成配置文件即可。

  1. PORT=6379 envsubst < redis-cluster.tmpl > redis-6379.conf 

这样,envsubst就可以把PORT命名变量,替换成6379,使用过k8s的同学,应该对这个命令非常熟悉。

2. expect

expect可是实现命令的自动化,尤其是交互式场景,比如你输入一个make love它才有反映的这种情况。

下面,拿一个使用export实现一个2步登录的场景。比如,使用Google Authenticator中的动态令牌。脚本可能长这个样子。

  1. #!/bin/sh 
  2. export LC_CTYPE="en_US.UTF-8" 
  3. expect -c " 
  4. spawn ssh root@67.226.201.167 -p 28869 
  5. set timeout 3 
  6. expect  \"root@67.226.201.167's password:\" 
  7. set password \"bZzPddnvH88b\" 
  8. send \"\$password\r\" 
  9. interact 

bZzPddnvH88b就是我们的动态密码,上面的脚本,将尝试登录主机67.226.201.167,并自动输入这个密码。使用expect命令,可以完成一些交互式的自动化工作,能节省不少时间。

3. sshpass

expect非常适合非常复杂的交互式环境。对于ssh登录这一块,有一个更加简单的命令,那就是sshpass,但你的机器上不一定有这个命令,需要主动去安装它。

  1. yum install shpass -y 

有了它,爱情的大门,瞬间破防。你不需要再输入yes,输入进入的凭证,这一切可以自动化。你甚至可以不加-p参数,然后使用SSHPASS环境替换它。

  1. # sshpass -p 'woshimima' ssh  root@127.0.0.1 'ip a' 
  2. Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts. 
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
  4.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  5.     inet 127.0.0.1/8 scope host lo 
  6.        valid_lft forever preferred_lft forever 
  7.     inet6 ::1/128 scope host  
  8.        valid_lft forever preferred_lft forever 

但是,你大概率执行了这个命令没有反应。这是因为,你还需要提前做一些配置。

  1. # vim /etc/ssh/ssh_config    
  2. StrictHostKeyChecking no 
  3.  
  4. # vim /etc/ssh/sshd_config   
  5. GSSAPIAuthentication no 
  6. UseDNS no 
  7.  
  8. # service sshd restart 

再重新执行一遍试试吧。

4. 查看ip地址

如何查看Linux系统的ip地址?先不要说你会了,你需要掌握各种场景下的ip地址查看。

通常,我们会使用ifconfig命令,来查看系统的ip地址,这是最常用的,但是已经不推荐了。因为ifconfig属于被淘汰的命令一列,像centos7,已经默认没有ifconfig这个命令了。

  1. # ifconfig 
  2. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500 
  3.         inet 172.19.26.39  netmask 255.255.240.0  broadcast 172.19.31.255 
  4.         inet6 fe80::216:3eff:fe34:e9a9  prefixlen 64  scopeid 0x20<link> 
  5.         ether 00:16:3e:34:e9:a9  txqueuelen 1000  (Ethernet) 
  6.         RX packets 14358451  bytes 5598714807 (5.2 GiB) 
  7.         RX errors 0  dropped 0  overruns 0  frame 0 
  8.         TX packets 12792784  bytes 11993514451 (11.1 GiB) 
  9.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0 

代替它的,就是ip addr命令,可以简写为ip a。ip addr命令输入iproute工具包,同样可以看到ip地址。使用它,还能非常方便的看到keepalived这样的VIP信息,推荐。

  1. # ip a  
  2. 1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 
  3.     link/ether 00:16:3e:34:e9:a9 brd ff:ff:ff:ff:ff:ff 
  4.     inet 172.19.26.39/20 brd 172.19.31.255 scope global dynamic noprefixroute eth0 
  5.        valid_lft 297189896sec preferred_lft 297189896sec 
  6.     inet6 fe80::216:3eff:fe34:e9a9/64 scope link  
  7.        valid_lft forever preferred_lft forever 

但是,现在都是上云环境了,很多都用上了docker。为了追加求docker镜像的精简化,很多连iproute包都不装了,你现在不仅没有ifconfig命令,就连ip addr命令也没有了,这可如何是好。

所幸的是,我们还有hostname。通过加上-I参数,依然能够看到系统的ip地址。

  1. # hostname -I 
  2. 172.19.26.39  

遇到狗子不要怕,条条大路通罗马。

5. watch

狗头望文生义,watch就是观察的意思。

其实,它可以制定一个间隔时间,然后执行你所指定的命令。比如查看文件的变化,网络的变化情况,甚至用来做定时器触发等。

比如,我启动了一个springboot服务,想要监听它什么时候启动成功,又不想每次都执行ps,就可以使用下面的命令。

  1. # 观测进行 
  2. watch -n 1 'ps -ef | grep java' 
  3.  
  4. # 观测端口,更准确 
  5. watch -n 1 'ss -ltpn | grep 8080' 

当你的进程启动成功,屏幕上就会自动输出信息,非常的方便。

6. arch

这是个什么命令呢?你会发现很多软件的发行包,比如i386、i486等等,很容易把刚入门的搞晕了。

这个命令十分简单,它甚至没有参数。

  1. # arch 
  2. x86_64 

上面的命令,告诉我们我的系统是x86_64位架构的,我就可以下载相应的软件包进行安装。不至于先被被其他版本的软件包给糟蹋一下。

x86,泛指一系列intel公司开发的处理器的架构。32位的架构,通常被称作i386,x86,而64位的会被称作amd64或者x86-64或者x64。

现在常用的64位架构,这个指令集是AMD设计的,Intel是从AMD获得授权才能生产。如果intel也叫amd64,就有点打脸的味道了,所以就改了名。

不过,本质是一样的。

End

Linux上的命令非常多,今天就先介绍这几个了。因为一次性介绍那么多,它会静悄悄的躺进收藏夹里,而不是装进脑子里!

我还是很贴心的,所以忽略其中的一个错别字吧。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

 

责任编辑:武晓燕 来源: 小姐姐味道
相关推荐

2020-12-16 11:18:03

Linux命令文件

2021-07-14 13:50:51

Linux命令文件

2018-11-01 09:45:40

2018-08-03 11:07:52

dd命令备份Linux系统

2020-03-22 15:48:14

JavaScriptWeb编程语言

2014-01-23 13:41:29

Linux系统性能监控

2014-10-31 10:50:28

Linux命令行工具

2018-03-12 15:26:00

Linux命令tee

2020-10-29 18:42:26

Linux命令操作系统

2012-02-05 15:54:09

Linux Deepi

2010-06-01 18:26:33

Rsync 使用

2010-06-07 11:52:47

LinuxIPv6协议

2021-03-12 10:01:33

Sudo命令Linux

2020-03-24 18:10:17

Arch LinuxLinux发行版AUR助手

2014-04-11 11:37:15

2014-07-21 14:56:46

Linux

2021-11-17 15:28:06

LinuxLinux命令

2013-08-09 09:37:59

Linux命令命令行

2020-04-25 19:00:15

Linux终端命令

2010-05-27 15:41:28

Linux查看用户
点赞
收藏

51CTO技术栈公众号