我們家裏老公是運維,老婆是開發。老婆不懂運維,老公想借着這個專欄,給各位開發同學總結一份寶典。讓你在開發的崗位上,瞭解運維的基礎知識。開發運維手牽手,共同對付產品狗。
目錄
一、遠程管理類
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_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、神級網絡防火牆+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篩選命令用法