Linux-包教包會系列

前言

之前個人不喜歡用 Linux 系統,什麼目錄啊,文件啊,權限啊,都得命令操做,入門難度較大。可是一旦熟練起來,真不想再去用 windows 了。再加上 shell 腳本,那才叫如虎添翼啊,真的是見識到了什麼纔是性能,什麼纔是自動化。html

Linux 相較於 windows 而言,佔用內存更小,由於 windows 的圖形化界面比較佔內存。Linux 的生態也比較豐富,各類各樣的服務端軟件都會有 Linux 版本。Linux 也衍生出各類格言的版本,我用的比較多的是 Centosjava

在 Linux 中,一切皆文件。因此各類目錄、文件的權限、建立者、所屬組都是比較實用的東西。linux

本文內容基於 Centos 7.4 版本。nginx

主要內容:redis

  • linux 目錄說明
  • PATH 加載的原理及配置
  • 經常使用簡單命令
  • sed,awk,find,管道流,重定向,scp

目錄介紹

Linux 中的目錄仍是要清楚的,有一些約定成俗的規定須要你們瞭解。shell

目錄只介紹一些重要經常使用的。大體瞭解什麼做用便可。npm

image-20200320134926002

190301204277681

根目錄-/

根目錄下面有許多子目錄 bin etc home opt usr sbin var tmp 等等。windows

/root

是用戶 root 的家目錄。centos

/home

root 用戶以外的其它的用戶家目錄。cd ~ 就是進入當前用戶的家目錄。 緩存

/bin

/bin 實際是個軟鏈接(理解爲 windows 的快捷方式),連接到 /usr/bin。裏面都是一些二進制的執行文件。咱們經常使用的 yum su sudo cp 都在這個目錄下。一般咱們安裝的程序,能夠在這裏訪問到。

/sbin

s 指 Spuer user。

/sbin 也是一個軟鏈接,連接到 /usr/sbin 存放二進制文件,管理員可執行的命令。

/etc

/etc 爲配置文件所在路徑。好比 /etc/nginx 存放 nginx 的配置文件。

/usr

usrunix system resources 簡寫。表示系統資源的路徑。

/usr/bin

全部用戶的均可訪問的二進制命令,不包括系統管理員的命令。

/usr/share

包含共享數據。好比 /usr/share/nginx 爲 nginx 存放的靜態資源。

/usr/local

從源碼編譯安裝的程序安裝到這裏。

/usr/src

系統內核 kernel 源碼位置。

/var

程序運行產生的緩存文件,鎖文件,pid 文件,日誌文件等會在這個目錄,一些常常會變化的內容保存的位置。

命令執行的優先級

咱們常常用 pwd 獲取當前目錄路徑,若是我本身寫個 shell 腳本,命名爲 pwd,將其加入到 PATH 中,那兩者誰會執行呢?

這就是爲何要了解命令的優先級了。

命令優先級

第一優先級:指定路徑的命令。絕對路徑 /home/parallels/a.sh 或者相對路徑 ./a.sh

第二優先級:別名指定的命令 alias pwd=/home/parallels/a.sh

第三優先級:內部命令(pwd)

第四優先級:hash 命令

第五優先級:經過 PATH 定義的查找順序查找

若是以上順序都找不到,就會報 未找到命令... 的錯誤。

經過 type command 能夠查看 command 命令類型。

# clear 已被哈希 (/usr/bin/clear),clear 哈希命令
type clear


# pwd 是 shell 內嵌。pwd 是內嵌命令。
type pwd


# java 是 /usr/bin/java,java 是經過 PATH 尋找到的命令。
type java複製代碼

alias pwd=/home/parallels/a.sh 經過改寫 pwd

# a.sh
echo 11複製代碼

當我執行 pwd 的時候,命令運行的是 a.sh

PATH

PATH 生效的原理

啓動終端的時候會初始化命令,會加載 /etc/profile~/.bash_profile

/etc/profile 會將路徑加載/usr/local/bin/usr/bin/usr/local/sbin/usr/sbin 追加到 PATH 中去。而後將 /etc/profile.d/*.sh 進行初始化。

~對應當前登陸用戶的用戶空間。好比我用 flyu 操做當前 shell,那麼~ 等於 /home/flyu

~/.bash_profile 會判斷 ~/.bashrc 存在嗎,存在會運行它。

~/.bashrc 中會判斷 /etc/bashrc 存在嗎,存在會運行它。

/ect/bashrc/etc/profile.d/*.sh 進行初始化。

PATH 全局配置

基於以上的理解,全局命令配置建議直接在 /usr/bin下創建軟鏈接到你的可執行文件。

不要想着在 /etc/profile.d/ 下寫腳本進行配置 PATH。當腳本寫錯,那麼你可能會配置 PATH 的有效性,

PATH 用戶配置

用戶配置 PATH 直接在 ~/.bashrc 中追加 PATH 便可。

PATH="${PATH}:/usr/local/aa"
export PATH複製代碼

通常咱們用 yum 安裝環境已經給配置好了環境變量。

系統登陸

我比較討厭一遍一遍輸入用戶名和密碼訪問服務器。

我每次只要輸入 ssh mflyyou 鏈接個人服務器。

ssh mflyyou.com複製代碼

一、生成公鑰私鑰

ssh-keygen -o -t rsa  -b 4096複製代碼

img

二、將公鑰複製到遠程服務器

.pub 結尾是公鑰。

# ssh-copy-id -i {公鑰絕對路徑} {遠程服務器用戶名}@{遠程服務器 ip}
ssh-copy-id -i /Users/zhangpanqin/.ssh/test_local_server.pub parallels@10.211.55.8複製代碼

以上命令做用是,將指定的公鑰內容,拷貝到遠程服務器上的指定用戶parallels下。這樣之後這個用戶(parallels)就能夠不用輸入密碼登陸了。

運行上述命令將公鑰內容拷貝到 /home/parallels/.ssh/authorized_keys。

img

三、本地電腦配置私鑰

Host mflyyou.com
  HostName 10.211.55.8
  AddKeysToAgent yes
  UseKeychain yes
  User parallels
  IdentityFile /Users/zhangpanqin/.ssh/test_local_server複製代碼

img

以上配置結束,你能夠 ssh mflyyou.com 登陸遠程服務器了。

用戶管理

linux 下用戶建立和管理。能夠控制哪些目錄文件能夠訪問。

# 建立 mflyyou 用戶,同時會建立 mflyyou 組
adduser mflyyou複製代碼
# 修改 mflyyou 的密碼,命令以後會提示你輸入密碼
passwd mflyyou複製代碼

建立的用戶是不具備 sudo 提高權限的能力,須要修改 /etc/sudoers 使之生效。

# 在 root 下運行,修改文件的可寫性
chmod  700 /etc/sudoers

# /etc/sudoers 文件中填寫 mflyyou ALL=(ALL)      PASSWD:ALL
root    ALL=(ALL)       ALL
mflyyou ALL=(ALL)      PASSWD:ALL


# 權限給了以後,修改文件 /etc/sudoers 爲只讀性
chmod  400 /etc/sudoers複製代碼

文件權限控制

image-20200320212048568

每行信息開頭的第一個字母表示文件類型。

d 表示目錄。

- 表示文件。

l 表示軟鏈接。

mkdir 建立目錄。

touch 建立空文件。

對文件夾或文件劃分權限。 4 讀 r,2 編輯 w,1 執行 x

chmod 754 /opt/config複製代碼

修改 /opt/config 所屬用戶、用戶組、其它人的訪問權限。

  • 所屬用戶:讀、編輯、執行,7

  • 所屬組:讀、執行,5

  • 其餘:讀,4

修改文件夾或者文件的所屬用戶和用戶組

# 遞歸修改 /opt/config 的歸屬 admin 用戶,所屬 admin 組
chown -R admin:admin  /opt/config 複製代碼

img

程序安裝

rpm

linux 分爲源碼包和rpm 包。源碼包須要咱們本身編譯,而後安裝,自由度比較高。rpm 包是廠商編譯好的二進制包,能夠類比 windows .exe 包。但 rpm 包安裝的時候須要處理依賴關係。所以,yum 管理 rpm 包誕生。yum 通常須要聯網,有的時候,部署的服務器沒有網絡,咱們能夠經過掛載光盤或者 U 盤搭建本地 yum 源使用。

rpm 包安裝的好處之一是咱們不須要配置環境變量了。包已經內置處理好了。

好比咱們安裝 jdk ,經過官網下載 jdk rpm 包。

img

rpm 包安裝

# 安裝
rpm -lvh 包全名複製代碼

img

卸載 rpm 包

# 卸載
rpm -e 包名複製代碼

查詢安裝了哪些 npm 包

rpm -qa | grep nginx複製代碼

查看安裝的 rpm 包的信息

# 查詢安裝包的信息
rpm -qi 包名複製代碼

image-20200320232543119

查找 rpm 包會安裝哪些文件及位置

# 查詢包安裝位置
rpm -ql 包名複製代碼

image-20200320232309137

其餘命令

# 查詢文件屬於的安裝程序
rpm -qf 系統文件名 

# 校驗安裝的包中的文件是否被修改
rpm -V 包名

# 升級
rpm -Uvh 包全名複製代碼

yum

國外的 yum 源速度較慢,使用ali提供了yum 源鏡像,速度挺快,給阿里點贊。

yum 實際是也是安裝的 rpm 包,只是包之間的依賴關係由 rpm 管理了。

yum 源配置

阿里 Centos yum 源

阿里 epel 源

yum 命令

# 列出一個或一組軟件包
yum list

# 在軟件包詳細信息中搜索指定字符串
yum search 

# 安裝包
yum -y install 包名

# 升級包,必定要指定包,否則 linux 全局更新
yum -y update 包名

# 卸載包,儘可能不卸載
yum -y remove 包名複製代碼

經常使用命令

linux 的命令不用刻意記,-h -? man 均可以查看命令的幫助信息。

# man,查看系統內置的命令
man find

# -h -? 通常是程序的幫助信息
nginx -h複製代碼

基本命令

# 複製 a.txt 到tmp 目錄下
cp a.txt /tmp
# 複製 test 目錄到 /tmp,保持文件全部特性和權限同樣
cp -r -a test /tmp
# 複製爲軟鏈接,快捷方式
cp -s  a.txt /tmp/a.txt


# 遞歸刪除 test 目錄及旗下內容
rm -f -r test

# 將a.txt 移動到/tmp 下
mv a.txt /tmp

# 建立文件夾
mkdir b

# 查看文本內容
cat a.txt

# 查看目錄下內容
ll
# 查看目錄下所有內容
ll -a


# 查看一個文件新生成內容,動態觀看

tail -f -n 10 a.txt

# 有的時候,兩個命令執行有 依賴關係 ,a 執行成功執行 b

a && b

# a 執行成功與否,b 都要執行

a || b複製代碼

cp

  • 建立軟鏈接
# 複製爲軟鏈接,快捷方式
cp -s  a.txt /tmp/a.txt複製代碼

scp-遠程拷貝

# 將 a 目錄下的全部資源 拷貝到指定遠程地址的 /usr/share/nginx/html/ 下
scp -rp /a/* 用戶名@ip:/usr/share/nginx/html/複製代碼

重定向

Linux shell 使用 3 種標準的 I/O 流,每種流都與一個文件描述符相關聯:

  1. stdout標準輸出流,它顯示來自命令的輸出。它的文件描述符爲 1。
  2. stderr標準錯誤流,它顯示來自命令的錯誤輸出。它的文件描述符爲 2。
  3. stdin標準輸入流,它爲命令提供輸入。它的文件描述符爲 0。

> 改變輸出流。> 等價於 1>

< 改變輸入流。

# 改變輸出流量,a.txt 不存在的狀況下建立
echo "111" > a.txt 

# 有時候咱們須要將標準輸出流和標準錯誤流輸入到一個文件。a.txt 存在,bb.txt 不存在。內容不會追加。
ls a.txt bb.txt > error.log 2>&1

# 若是內容須要追加
ls a.txt bb.txt >> error.log 2>&1

# 若是不想要輸出內容, 寫入到 /dev/null 的內容都會被丟棄掉 
ls a.txt bb.txt >> /dev/null 2>&1複製代碼

管道流-|

多個命令經過 | 連接,前一個命令的輸出,是後一個命令的輸入。

cat error.log  | grep "a.txt"複製代碼

grep-查詢文本

用於查詢內容中符合指定格式的內容。

# 不查詢指定命令
grep -v

# 忽略大小
grep -i

ps -ef | grep jail-2.0-0.0.1-SNAPSHOT.jar | grep -v grep 複製代碼

awk-操做文本

對文本根據 空格 或者 tab 切割,而後根據操做獲取符合條件的某行中某列的數據。

$n 獲取第幾個內容,$0 獲取當前行,$NF 獲取最後一個字段

# a2
echo "a1 a2 a3" | awk '{print $2}'

# a3
echo "a1 a2 a3" | awk '{print $NF}'

# a2
echo "a1 a2 a3" | awk '{print $(NF-1)}'複製代碼

awk 還提供一些內置函數。其他的內置函數能夠查看幫助命令。

  • toupper():字符轉爲大寫。
  • tolower():字符轉爲小寫。
  • length():返回字符串長度。
  • substr():返回子字符串。
# A2
echo "a1 a2 a3" | awk '{print toupper($2)}'

# a2
echo "A1 A2 A3" | awk '{print tolower($2)}'

# 9
echo "A1 123456789 A3" | awk '{print length($2)}'

# 
echo "A1 123456789 A3" | awk '{print substr($2)}'複製代碼

指定分隔符使用。

# A2
echo "a1:a2:a3" | awk -F: '{print toupper($2)}'複製代碼

使用條件進行篩選。

log.txt

a1 a2 a3 a4
bb1 bb2 bb3 bb4
ccc1 ccc2 ccc3 ccc4複製代碼
# 獲取每行第一列內容
awk '{print $1}' a.txt

# 獲取每行第一列,字符長度大於 2 的,只有第二和第三行的打印出來了。bb1,ccc1
awk 'length($1) > 2 {print $1}' a.txt複製代碼

sed-操做文本

也是一個比較厲害的操做文本的命令。能夠用於替換文件中的內容,刪除或新增內容,搜索符合條件的內容

# 將 a 替換爲 ,
echo "a1b2c1" | sed s/a/,/g

# 好比咱們在本地部署集羣的時候,批量生成配置文件
sed s/6379/6380/g redis.conf > redis_6380.conf複製代碼

find-查詢文件

# find  path  option ;

# 查詢某個路徑下的名稱爲 a.sh,這裏會查出文件和目錄
find / -name "a.sh"

# 指定查詢 文件(f)或者目錄(d)

find / -name "a.sh" -type f複製代碼

本文由 張攀欽的博客 創做。 可自由轉載、引用,但需署名做者且註明文章出處。

如轉載至微信公衆號,請在文末添加做者公衆號二維碼。微信公衆號名稱:Mflyyou

img

相關文章
相關標籤/搜索