开发运维手牵手「Linux篇」开发同学可能用到的Linux运维命令集锦
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发运维手牵手「Linux篇」开发同学可能用到的Linux运维命令集锦相关的知识,希望对你有一定的参考价值。
我们家里老公是运维,老婆是开发。老婆不懂运维,老公想借着这个专栏,给各位开发同学总结一份宝典。让你在开发的岗位上,了解运维的基础知识。开发运维手牵手,共同对付产品狗。
@TOC
一、远程管理类
1、远程登录命令-SSH
不要笑,不要觉得ssh命令你天天用,严肃,严肃。
ssh基本用法举例:
ytlzq0228@vm01:~$ ssh 10.1.2.3
此时会使用你当前客户端系统登录的用户名作为登录远程主机,而客户端用户名并不是你真正想用的,可能你想用root登录远程主机。
例如下图:
这时候,就需要使用如下格式,来强制约束远程登录使用的用户名
ytlzq0228@vm01:~$ ssh root@10.1.2.3
同时,ssh还可能会用到以下扩展参数
加端口ssh,适用于远端主机不使用22作为ssh端口的时候
ytlzq0228@vm01:~$ ssh root@10.1.2.3 -p 3321
加源IP地址ssh,适用本机具有多张网卡的时候
ytlzq0228@vm01:~$ ssh root@10.1.2.3 -b 192.168.0.106
或者用-B绑定源网卡
ytlzq0228@vm01:~$ ssh root@10.1.2.3 -B eth01
第一次远程一台主机的时候,需要接受远端主机分发的ssh公钥,系统会询问是否接收公钥,输入yes
有关ssh秘钥问题,详见第3点,SSH-Keygen
2、远程传输文件命令-SCP
scp与ssh一样同样使用openssl进行加密传输,也同样使用22端口。大部分情况下,有ssh功能的主机基本都有scp功能。
scp基本用法举例:
将本机文件复制到远端服务器上
ytlzq0228@vm01:~$ scp ./code.py root@10.1.2.3:/root/Python
将远端服务器文件下载到本地
ytlzq0228@vm01:~$ scp root@10.1.2.3:/root/Python/code.txt ./
3、SSH秘钥操作命令ssh-keygen
如果ssh或者scp的时候出现下述提醒
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the SHA key sent by the remote host is
SHA256:oeJv1ODY3h6l4zC3ZOr3Qhp/bZelyT3mSrhVCULn/og.
Please contact your system administrator.
Add correct host key in /var/root/.ssh/known_hosts to get rid of this message.
Offending key in /var/root/.ssh/known_hosts:1
RSA host key for 10.1.2.3 has changed and you have requested strict checking.
Host key verification failed.
表示本次ssh的主机传给你的秘钥与之前保存的秘钥不一样,本机怀疑远端服务器被劫持或者被篡改。一般出现在服务器重装操作系统后仍然使用原来的IP,或者某台新服务的IP与之前你曾经远程过的服务器IP一样。注意!如果你确认这次远程是安全的,服务器没有被恶意劫持。
那么使用以下命令清除之前保存的秘钥,并重新接收新的秘钥。
ytlzq0228@vm01:~$ ssh-keygen -R 10.1.2.3(你远程服务器的IP)
4、使用key免密码ssh服务器
某些情况,系统要求不能用password的方式验证,而要通过key的方式验证。一方面增加安全性,另一方面登录的时候无需输入密码,方便!
认证原理:
当客户端再次发送一个连接请求,包括ip、用户名;服务端得到客户端的请求后,会到authorized_keys中查找,如果有对应的的IP和用户,就会随机生成一个字符串,服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端,得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端,服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录了
基本配置逻辑:
客户端生成秘钥对,私钥自己保存好,公钥上传到服务器端。服务器端同意添加你的公钥,即认定允许你远程登录我这台服务器。
操作步骤
1、首先在A机器生成密钥对,命令:ssh-keygen,本例中生成的秘钥保存在/root/.ssh/id_rsa.ssh/
下的id_rsa
和id_rsa.pub
两个文件中,分别是私钥和公钥,选填设置密钥对密码。
ytlzq0228@vm01:~$ ssh-keygen
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory ‘/root/.ssh‘.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:esARTVf53owszvSNjetiqWF4qcrzSMISX/TB+J0gsAg root@localhost.localdomain
The key‘s randomart image is:
ytlzq0228@vm01:~$ ls -a ~/.ssh
. .. id_rsa id_rsa.pub
2、将客户端的公钥(id_rsa.pub)拷贝到服务端(B主机)上root的home目录(因为咱们要登录的是root用户)并命名为authorized_keys
>方法一:拿U盘拷
>方法二:scp传过去
>方法三:把id_rsa.pub的内容复制出来,粘贴到服务器的authorized_keys文件中去
>方法四:用ssh-copy-id这个命令,会自己在服务器相应的目录生成authorized_keys文件
ytlzq0228@vm01:~$ ssh-copy-id -i id\_rsa.pub root@10.1.2.3
root@10.1.2.3‘s password: #输入主机B登录密码以完成公钥拷贝
之后,下次远程的时候,就可以直接无需密码连接了。
二、系统操作类
1、查看系统进程
服务器卡了怎么办?通过下述命令可以查看当前主机运行的进程,以及进程对资源的占用情况。
ps -ef命令
ytlzq0228@vm01:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2019 ? 01:45:31 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 2019 ? 00:00:01 [kthreadd]
root 3 2 0 2019 ? 00:12:55 [ksoftirqd/0]
root 5 2 0 2019 ? 00:00:00 [kworker/0:0H]
root 7 2 0 2019 ? 00:00:00 [migration/0]
root 8 2 0 2019 ? 00:00:00 [rcu_bh]
查看所有进程信息,会比较多,建议用grep命令进行筛选
top命令
ytlzq0228@vm01:~$ top
top - 15:09:12 up 17 days, 22:49, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 224 total, 1 running, 153 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 4030648 total, 1225488 free, 222068 used, 2583092 buff/cache
KiB Swap: 969960 total, 969960 free, 0 used. 3517960 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30646 ytlzq02+ 20 0 51344 4516 3688 R 6.2 0.1 0:00.01 top
1 root 20 0 160180 9596 6856 S 0.0 0.2 0:29.65 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.13 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H-kb
查看系统进程线程运行情况,包括资源的使用情况,系统负载等。我的用法是看下服务器上负载是否很高,然后看具体是哪个进程,哪个线程占用cpu比较多。
基本用法
top 列出所有线程负载信息
top -H 列出所有线程的负载信息
top -H -p ${pid} 列出某个pid下所有线程的负载信息
pstree命令
ytlzq0228@vm01:~$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─accounts-daemon───2*[{accounts-daemon}]
├─acpid
├─avahi-daemon───avahi-daemon
查看系统进程树,他可以把各个进程之间的关系用树形结构标识出来。
2、结束进程命令-kill
用这个命令可以。
基本用法
ytlzq0228@vm01:~$ cat file.txt
3、查看网卡配置-ifconfig
特别需要注意的是,最小化安装的linux可能默认不带ifconfig
需要yum install net-tools
ytlzq0228@vm01:~$ ifconfig
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.20 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::6f67:f500:bbc7:9b8 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:8b:78:b4 txqueuelen 1000 (Ethernet)
RX packets 224154680 bytes 115825762715 (115.8 GB)
RX errors 0 dropped 26 overruns 0 frame 0
TX packets 222664350 bytes 115992838205 (115.9 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
一般情况下,ensXXX或者ethX开头的是本机网卡。开发同学只需要查看这几张网卡的配置就好
除此之外,还可能会有dockerX,pppX,vmX等各种网卡,一般是虚拟网卡,对于线上服务器开发同学无需过分关心。
4、查看系统信息类命令
# uname -a # 查看内核/操作系统/CPU信息
# cat /etc/issue
# cat /etc/redhat-release # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量
5、常见系统日志位置
大部分的系统级功能和正经的软件,都会在/var/log路径下创建日志,可以直接用cat或者tail命令查看
/var/log/message //系统启动后的信息和错误日志,Linux中最常用的日志之一
/var/log/secure //与安全相关的日志信息
/var/log/maillog //与邮件相关的日志信息
/var/log/cron //与定时任务相关的日志信息
/var/log/spooler //与UUCP和news设备相关的日志信息
/var/log/boot.log //守护进程启动和停止相关的日志消息
6、查看磁盘空间-df -h
如果磁盘空间不足,可以使用df- h命令查看当前磁盘占用量,如下图,已经出现磁盘100%使用的情况。
ytlzq0228@vm01:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 394M 1.2M 393M 1% /run
/dev/sda1 20G 20G 0 100% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
使用find可以找到磁盘中的大文件,并选择性的清理掉。
ytlzq0228@vm01:~$ find / -size +100M |xargs ls -lh
find: ‘/proc/22139/task/22139/fd/6’: No such file or directory
find: ‘/proc/22139/task/22139/fdinfo/6’: No such file or directory
find: ‘/proc/22139/fd/5’: No such file or directory
find: ‘/proc/22139/fdinfo/5’: No such file or directory
-rw-r--r-- 1 root root 1.0G 6月 15 16:36 /data/test_randread1
-r-------- 1 root root 128T 7月 12 17:48 /proc/kcore
-rw------- 1 root root 948M 1月 19 15:15 /swapfile
-rw------- 1 root root 128M 7月 12 17:48 /sys/devices/pci0000:00/0000:00:0f.0/resource1
-rw------- 1 root root 128M 7月 12 17:48 /sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
-rw-r--r-- 1 root root 10G 4月 1 19:48 /test_randread/123
-rw-r--r-- 1 root root 120M 6月 3 23:08 /usr/lib/firefox/libxul.so
-rw-r--r-- 1 root root 117M 5月 13 21:05 /usr/lib/thunderbird/libxul.so
-rw------- 1 root root 243M 4月 25 20:57 /var/lib/snapd/cache/047a079b88612d704414da7c3efee15569e6667974609066cf7811712d98ffaab0e4dbe7e1db2e54c6b60a28d1c41c16
-rw-r--r-- 1 root root 150M 8月 6 2019 /var/lib/snapd/seed/snaps/gnome-3-28-1804_67.snap
-rw------- 1 root root 161M 1月 25 05:17 /var/lib/snapd/snaps/gnome-3-28-1804_116.snap
-rw------- 1 root root 162M 6月 6 18:53 /var/lib/snapd/snaps/gnome-3-28-1804_128.snap
-rw------- 1 root root 256M 5月 7 09:20 /var/lib/snapd/snaps/gnome-3-34-1804_33.snap
-rw------- 1 root root 256M 6月 6 10:33 /var/lib/snapd/snaps/gnome-3-34-1804_36.snap
7、神级网络防火墙+NAT命令-iptables
iptables可以做什么?
防火墙
策略路由
DNAT端口映射
SNAT让虚机共享上网
软路由
有以上需求的,可以参考下面这篇文章
【开发运维手牵手】「Linux篇」iptables用法详解和典型配置举例
三、文件操作类
1、查看文件内容命令-cat、tail、head、more、less
cat
用这个命令查看配置文件,或者是日志文件。但是有点需要注意,cat命令会把整个文件输出到终端了,如果文件内容非常多,建议使用grep进行过滤,或者直接用less或more命令。
基本用法
ytlzq0228@vm01:~$ cat file.txt
tail
查看某个文件的尾部,或者查看标准出入的最末尾,默认值显示10行,可以用-n参数来指定输出多少行。
基本用法
ytlzq0228@vm01:~$ tail -n 100 file.txt 输出最末尾的100行
ytlzq0228@vm01:~$ tail -f file.txt 随着文件新增,持续输出新增的内容,一般用来看实时日志
head
和tail命令很相似,不过head是输出头部内容,个人感觉head远没有tail命令用的多。
基本用法
ytlzq0228@vm01:~$ head -n 100 file.txt 输出最开始的100行
more
也是用来查看文件,但more命令只加载一屏的内容,可以向下翻动,因为加载的内容少,所以比cat快多了。
基本用法
ytlzq0228@vm01:~$ more file.txt
less
和more很像,但是可以上下翻动,感觉less和more只需要less就可以了,完全可以去掉more啊
基本用法
ytlzq0228@vm01:~$ less file.txt
2、文件编辑器-vi和vim
首先,我们要知道vi和vim不是一个东西啊!
所有的 Unix类系统都会内建 vi 文书编辑器,其他编辑器则不一定会存在。对Unix及Linux系统的任何版本,vi编辑器是完全相同的。
但是目前我们使用比较多的是 vim 编辑器。
vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
具体的vi和vim的快捷键等用法,之后会单独开一篇文章讲,这里只是简单的提一下。
【开发运维手牵手】「Linux篇」vi/vim快捷键及用法解释
贴一张神图
3、文件增删-touch、mkdir和rm
touch用于增加文件,rm用于增加文件(remove)
ytlzq0228@vm01:~$ touch text.txt
#在当前目录新建文件
ytlzq0228@vm01:~$ touch /home/ytlzq0228/test.txt
#在绝对路径下新建文件
ytlzq0228@vm01:~$ midir ./bgp_script
#在当面目录下创建bgp_script文件夹
ytlzq0228@vm01:~$ rm text.txt
#删除当前目录下文件
ytlzq0228@vm01:~$ rm -rf ./bgp_script/*
#删除当前路径下./bgp_script文件夹和内部全部内容 -f参数用于强制删除不提示 -r参数用于递归
ytlzq0228@vm01:~$ rm -rf /*
#删库跑路命令,强制递归删除根目录下所有文件和子目录
4、写入文件命令EOF和>>
使用>或者>>可以将屏幕显示内容写入文件
请注意,>写入文件为覆盖重写,>>写入文件为追加。
ytlzq0228@vm01:~$ ifconfig > a.txt
ytlzq0228@vm01:~$ cat a.txt
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.20.20 netmask 255.255.255.0 broadcast 10.0.20.255
inet6 fe80::e2e9:5411:cbd4:a747 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:a7:dd:ba txqueuelen 1000 (Ethernet)
RX packets 648867771 bytes 57443415987 (53.4 GiB)
RX errors 0 dropped 622 overruns 0 frame 0
TX packets 641727408 bytes 81167630246 (75.5 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 132 bytes 11424 (11.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 132 bytes 11424 (11.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
EOF命令可以直接快捷的给文件追加内容。用法示例如下
ytlzq0228@vm01:~$ cat >> a.txt <<EOF
> 输入想保存到文件的文字
> EOF
5、内容和数据筛选命令-grep
grep是一个非常有用的内容查找命令。grep可以单独使用,也可以在其他命令执行后对回显结果进行筛选。
基本用法
ytlzq0228@vm01:~$ ifconfig | grep ens192 从ifconfig命令的结果中筛选出包含“ens192”的行
ytlzq0228@vm01:~$ grep "eth0" ./route.txt 从route.txt文件中筛选出包含“eth0”的行
grep支持正则表达式,例如
ytlzq0228@vm01:~$ ifconfig | grep -o -E "([0-9]{1,3}[.]){3}[0-9]{1,3}"
172.31.1.110
255.255.240.0
172.31.15.255
其中参数 -E 表示使用扩展正则表达式egrep
参数 -o 表示只显示一行中匹配正则表达式的部分
更多grep的用法,请参阅
【开发运维手牵手】「Linux篇」grep筛选命令用法
6、文本分片分列功能-awk
awk命令类似于.split()函数功能,可以对文本内容进行分列或者分片。
例如下面的例子,我们想取出route -n的结果中,第1行,第8列的字符“eth0”,即可用grep取行,awk ‘{print $8}‘取列。
具体awk命令用法,请参见
【开发运维手牵手】「Linux篇」awk命令用法
Linux awk 命令
四、故障排错类
以上是关于开发运维手牵手「Linux篇」开发同学可能用到的Linux运维命令集锦的主要内容,如果未能解决你的问题,请参考以下文章