【開發運維手牽手】「Linux篇」開發同學可能用到的Linux運維命令集錦

我們家裏老公是運維,老婆是開發。老婆不懂運維,老公想借着這個專欄,給各位開發同學總結一份寶典。讓你在開發的崗位上,瞭解運維的基礎知識。開發運維手牽手,共同對付產品狗。

一、遠程管理類

1、遠程登錄命令-SSH

不要笑,不要覺得ssh命令你天天用,嚴肅,嚴肅。
ssh基本用法舉例:

ytlzq0228@vm01:~$ ssh 10.1.2.3

此時會使用你當前客戶端系統登錄的用戶名作爲登錄遠程主機,而客戶端用戶名並不是你真正想用的,可能你想用root登錄遠程主機。
例如下圖:
在這裏插入圖片描述
這時候,就需要使用如下格式,來強制約束遠程登錄使用的用戶名

ytlzq0228@vm01:~$ ssh [email protected]

同時,ssh還可能會用到以下擴展參數

加端口ssh,適用於遠端主機不使用22作爲ssh端口的時候
ytlzq0228@vm01:~$ ssh [email protected] -p 3321
加源IP地址ssh,適用本機具有多張網卡的時候
ytlzq0228@vm01:~$ ssh [email protected] -b 192.168.0.106
或者用-B綁定源網卡
ytlzq0228@vm01:~$ ssh [email protected] -B eth01

第一次遠程一臺主機的時候,需要接受遠端主機分發的ssh公鑰,系統會詢問是否接收公鑰,輸入yes
在這裏插入圖片描述
有關ssh祕鑰問題,詳見第3點,SSH-Keygen

2、遠程傳輸文件命令-SCP

scp與ssh一樣同樣使用openssl進行加密傳輸,也同樣使用22端口。大部分情況下,有ssh功能的主機基本都有scp功能。
scp基本用法舉例:

將本機文件複製到遠端服務器上
ytlzq0228@vm01:~$ scp ./code.py [email protected]:/root/Python
將遠端服務器文件下載到本地
ytlzq0228@vm01:~$ scp [email protected]:/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_rsaid_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、神級網絡防火牆+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、內容和數據篩選命令-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篩選命令用法

四、故障排錯類

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章