之前個人不喜歡用 Linux
系統,什麼目錄啊,文件啊,權限啊,都得命令操做,入門難度較大。可是一旦熟練起來,真不想再去用 windows
了。再加上 shell
腳本,那才叫如虎添翼啊,真的是見識到了什麼纔是性能,什麼纔是自動化。html
Linux
相較於 windows
而言,佔用內存更小,由於 windows 的圖形化界面比較佔內存。Linux
的生態也比較豐富,各類各樣的服務端軟件都會有 Linux
版本。Linux
也衍生出各類格言的版本,我用的比較多的是 Centos
java
在 Linux 中,一切皆文件。因此各類目錄、文件的權限、建立者、所屬組都是比較實用的東西。linux
本文內容基於 Centos 7.4
版本。nginx
主要內容:redis
Linux 中的目錄仍是要清楚的,有一些約定成俗的規定須要你們瞭解。shell
目錄只介紹一些重要經常使用的。大體瞭解什麼做用便可。npm
/
根目錄下面有許多子目錄 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
usr
爲 unix 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
啓動終端的時候會初始化命令,會加載 /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
進行初始化。
基於以上的理解,全局命令配置建議直接在 /usr/bin
下創建軟鏈接到你的可執行文件。
不要想着在 /etc/profile.d/
下寫腳本進行配置 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複製代碼
.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。
Host mflyyou.com
HostName 10.211.55.8
AddKeysToAgent yes
UseKeychain yes
User parallels
IdentityFile /Users/zhangpanqin/.ssh/test_local_server複製代碼
以上配置結束,你能夠 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複製代碼
每行信息開頭的第一個字母表示文件類型。
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 複製代碼
linux 分爲源碼包和rpm 包。源碼包須要咱們本身編譯,而後安裝,自由度比較高。rpm 包是廠商編譯好的二進制包,能夠類比 windows .exe 包。但 rpm 包安裝的時候須要處理依賴關係。所以,yum 管理 rpm 包誕生。yum 通常須要聯網,有的時候,部署的服務器沒有網絡,咱們能夠經過掛載光盤或者 U 盤搭建本地 yum 源使用。
rpm 包安裝的好處之一是咱們不須要配置環境變量了。包已經內置處理好了。
好比咱們安裝 jdk ,經過官網下載 jdk rpm 包。
# 安裝
rpm -lvh 包全名複製代碼
# 卸載
rpm -e 包名複製代碼
rpm -qa | grep nginx複製代碼
# 查詢安裝包的信息
rpm -qi 包名複製代碼
# 查詢包安裝位置
rpm -ql 包名複製代碼
# 查詢文件屬於的安裝程序
rpm -qf 系統文件名
# 校驗安裝的包中的文件是否被修改
rpm -V 包名
# 升級
rpm -Uvh 包全名複製代碼
國外的 yum 源速度較慢,使用ali提供了yum 源鏡像,速度挺快,給阿里點贊。
yum 實際是也是安裝的 rpm
包,只是包之間的依賴關係由 rpm
管理了。
# 列出一個或一組軟件包
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 -s a.txt /tmp/a.txt複製代碼
# 將 a 目錄下的全部資源 拷貝到指定遠程地址的 /usr/share/nginx/html/ 下
scp -rp /a/* 用戶名@ip:/usr/share/nginx/html/複製代碼
Linux shell 使用 3 種標準的 I/O 流,每種流都與一個文件描述符相關聯:
>
改變輸出流。>
等價於 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 -v
# 忽略大小
grep -i
ps -ef | grep jail-2.0-0.0.1-SNAPSHOT.jar | grep -v grep 複製代碼
對文本根據 空格
或者 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複製代碼
也是一個比較厲害的操做文本的命令。能夠用於替換文件中的內容,刪除或新增內容,搜索符合條件的內容
# 將 a 替換爲 ,
echo "a1b2c1" | sed s/a/,/g
# 好比咱們在本地部署集羣的時候,批量生成配置文件
sed s/6379/6380/g redis.conf > redis_6380.conf複製代碼
# find path option ;
# 查詢某個路徑下的名稱爲 a.sh,這裏會查出文件和目錄
find / -name "a.sh"
# 指定查詢 文件(f)或者目錄(d)
find / -name "a.sh" -type f複製代碼
本文由 張攀欽的博客 創做。 可自由轉載、引用,但需署名做者且註明文章出處。
如轉載至微信公衆號,請在文末添加做者公衆號二維碼。微信公衆號名稱:Mflyyou