Linux命令
一、日常命令
命令后--help,可以查出該命令的用法以及參數(shù)。
pwd:查看當(dāng)前所在目錄的路徑
date:查看當(dāng)前時間
date +%Y-%m-%d
date -s “2018-1-1”設(shè)置日期為2018-1-1
這個命令其實不用記,不會的話,直接date --help,查看幫助,就知道各個參數(shù)啥意思,關(guān)鍵在于,得知道是date +……
who
可以顯示當(dāng)前登錄的用戶以及登錄形式
關(guān)機(jī)/重啟(必須是root用戶)
shutdown -h now ##立刻關(guān)機(jī)
shutdown -h +10 ##10min以后關(guān)機(jī)
shutdown -h 12:00:00 #12點整的時候關(guān)機(jī)
halt ##等于立刻關(guān)機(jī)
重啟
shutdown -r now
reboot #等于立刻重啟
清屏
clear ##或者快捷鍵 ctrl+l
退出當(dāng)前進(jìn)程
ctrl+c 或者用q
掛起當(dāng)前流程
ctrl+z ##進(jìn)程hi掛起在后臺
bg jonid ##讓進(jìn)程在后臺繼續(xù)執(zhí)行(jobid為運行程序的id)
fg jonid ##讓進(jìn)程回到前臺(jobid為運行程序的id)
echo
相當(dāng)于打印內(nèi)容到屏幕上
Linux定義變量,直接變量=參數(shù)即可,比如:a=1
打印參數(shù)前需要加上$符號才能顯示其內(nèi)容,假設(shè)直接不加,還是會顯示參數(shù)名
二、目錄操作
1、查看目錄信息
| ls / | 查看根目錄下的子節(jié)點(文件夾和文件)信息 |
| ls . | 查看當(dāng)前目錄下信息 |
| ls ../ | 查看上一級的目錄信息 |
| ls -l . | 列出當(dāng)前目錄下文件的詳細(xì)信息 |
| ls -l | 列出當(dāng)前目錄下文件的詳細(xì)信息 |
| ls -al | -a是顯示隱藏文件 -l是以更詳細(xì)的列表形式顯示 |
| ls -l -h | 列出的文件大小會以K顯示,而不是字節(jié) |
總結(jié)(ls --help可以查看參數(shù)的寫法):
ls . 和 ls其實一樣
ls就是顯示文件夾和可顯示的文件名稱
ls -l 會顯示文件夾以及可顯示文件的大小以及權(quán)限等
ls -al 就是在上一步之上加了一個顯示隱藏的文件
ls -alh 就是在上一步的基礎(chǔ)之上,將文件大小以Kb形式顯示,更加直觀
注:
d:directory:代表一個目錄;-代表文件;l代表鏈接,是快捷方式
root root 文件屬于root,屬于用戶組root
ls -l -h或者寫成ls -lh參數(shù)可以放在一起寫,-h是顯示文件大小以Kb的形式
ls -lha上一步的基礎(chǔ)上,再顯示隱藏文件,前面帶點的就是隱藏的
2、切換工作目錄
cd /home/gzw ## 切換到用戶的主目錄(/home/用戶名)
cd ~ ## 切換到用戶主目錄(/home/用戶名)
cd ## 切換到用戶的主目錄(/home/用戶名)
cd - ## 切換到上一步的目錄
3、創(chuàng)建文件夾
mkdir /aaa ## 這是絕對路徑的寫法的寫法,在根目錄下建立一個aaa
mkdir /aaa/bbb ## 這是在aaa文件夾內(nèi)新建一個bbb文件夾
mkdir aaa ## 這是相對路徑的寫法
mkdir -p aaa/bb/ccc ##假設(shè)aaa,bbb都不存在,就去建立ccc,前面加-p,會同時將aaa,bbb,ccc建立起來,遵循剛剛寫的結(jié)構(gòu)
4、刪除文件夾
rmdir aaa ## 只能刪除空白的目錄
rm -r aaa ## 可以將aaa整個文件夾和子節(jié)點全部刪除,包括aaa
rm -rf aaa ## 強(qiáng)制刪除 aaa
5、移動或修改文件夾
mv aaa angelababy ##將aaa文件夾移動到 angelababy文件夾內(nèi)
mv 本質(zhì)上是移動
mv install.log aaa/ ## 將當(dāng)前目錄下的install.log 移動到aaa文件夾中去
mv install.log aaa/ notinstall.log ## 將instal.log移動到aaa下,且改名為notinstall.log
mv a b/c ##將文件夾a移動到文件夾b內(nèi)并且將文件夾a的名字改為c
mv mubby/ mybaby ## 將mubaby改名為mybany
rename
可以用來批量更改文件名字
比如很多文件,用 rename .txt .txt.bak 意思是將.txt結(jié)尾的文件改為.txt.bak *
三、文件操作
一、創(chuàng)建文件
1、
touch somefile.1 ##創(chuàng)建一個新的空文件,大小為0(但是未見后綴跟文件的類型無關(guān),盡管是avi格式,也可以放文本)
另一種方式:利用“>”重定向的功能,將一條指令的輸出結(jié)果寫入到一個文件內(nèi),會覆蓋源文件內(nèi)容,如果指定的文件不存在,則會創(chuàng)建出來
例如:echo "I love you !" > 1.txt ## 將I love you ! 重定向到1.txt文件內(nèi)
那么特殊情況:ll > 2.txt ##這樣會把ll這個命令的輸出內(nèi)容放到2.txt內(nèi)
追加:echo "you love me" >> 1.txt ##在內(nèi)容的原有基礎(chǔ)之上追加這些文本
二、vi文本編輯器
(相當(dāng)于window的文本編輯器,notepad++)
vi 1.txt ##修改1.txt(如果1.txt不存在的話,則會先創(chuàng)建一個空的1.txt進(jìn)行編輯)
首先會進(jìn)入“一般模式”,此模式只接受各種命令快捷鍵,不能編輯文件內(nèi)容
首先按“i”鍵,就會從一般模式進(jìn)入編輯模式,此模式下,敲入的都是文件內(nèi)容(這里按i鍵,可以在光標(biāo)定位的位置輸入,進(jìn)行插入;按a,會在光標(biāo)所在位置的后一個字符善后進(jìn)行操作;按o,會在光標(biāo)所在位置下面重新插入一個新的空白行,且光標(biāo)在該行的第一個上)
編輯完成之后,按Esc退出編輯模式,回到一般模式
再按:進(jìn)入的“底行命令模式”,輸入wq命令,回車即可,這樣是保存且退出;按w,就是保存;但是還是在一般模式下,還可以按i進(jìn)行編輯
常用快捷鍵
(用在一般模式下)
| a | 在光標(biāo)的最后一位插入 |
| A | 在該行的最后插入 |
| I | 在該行的最前面插入 |
| gg | 直接跳到文件的首行 |
| G | 直接跳到文件的末行 |
| dd | 刪除一行 |
| 3dd | 刪除3行 |
| YY | 復(fù)制一行 |
| 3YY | 復(fù)制3行 |
| p | 粘貼 |
| u | undo回退 |
三、查找并替換
(在底行命令模式中輸入)
1、顯示行號
:set nu
2、不顯示行號
:set nonu
3、查找關(guān)鍵字
:/you ##效果:查找文件中出現(xiàn)的you,并定位到第一個找到的地方,按n可以定位到下一個匹配的位置(按N定位到上一個)
4、替換操作
:s/sad/bbb ##將sad替換成bbb(這種情況只能替換光標(biāo)所在那一行的第一個sad為bbb)
:%s/sad/bbb ##全局替換(實際操作是會替換每一行的最前面的那個sad)
四、拷貝、刪除、移動
cp somefile.1 /home/gzw ##復(fù)制一個文件到指定的目錄下
cp somefile.2 /home/gzw/somefile2.1 ##復(fù)制一個文件到gzw下,并且命名為somefile2.1
rm /home/gzw/somefile.1 ##刪除somfile.1(會提示確定刪除,要輸入y)
fm -f/home/gzw/somefile.1
mv /home/gzw/somefile.1 ../
五、查看文件內(nèi)容
cat somefile.1 ## 一次性將文件內(nèi)容全部輸出(輸出在控制臺)
分頁查看命令:
more somefile.1 ## 將somefile.1輸出在控制臺,但是可以翻頁查看,下一頁按空格鍵,上一頁按b(代表back),退出按(q)
less somefile.1 ## 將somefile.1輸出在控制臺,但是可以翻頁查看,下一頁按空格鍵,上一頁按b(代表back),上翻一行(↑),下翻一行(↓),且可以搜索關(guān)鍵字(/搜索內(nèi)容)
跳到文件末尾:G
跳到文件首行:gg
退出less:q
六、查看日志
tail -10 install.log ##查看文件尾部的10行
tail +10 install.log ##查看文件第10-->最后一行
tail -f install.log ##實時看日志的輸出,追蹤日志文件的信息(f追蹤的是文件的唯一標(biāo)識,就算文件被改了名字,也可以被追蹤并輸出,也就是說,將install.log改為install2.log,用這么命令依舊可以追蹤到內(nèi)容ll -i可以看文件的唯一標(biāo)識,在文件的最前面那串)
tail -F install.log ##實時看日志的輸出,追蹤日志文件的信息(F追蹤的是文件名,改了就追蹤不了)
head -10 install.log ##查看文件的頭10行
七、打包壓縮
1、gzip 壓縮
gzip a.txt ##壓縮后會變成a.txt.gz,體積會縮小
2、解壓
gzip -d a.txt.gz ##解壓a.txt.gz成為a.txt
3、打包:將制定文件或文件夾(一堆文件變一個文件)
tar -cvf bak.tar ./aaa ##將./aaa內(nèi)的內(nèi)容打包成一個名字叫bak.tar的文件
tar -cvf bak.tar 1.txt 2.txt aaa/ ##將aaa文件夾內(nèi)的1.txt和2.txt打包成為bak.tar,打完后的bak.tar也在aaa內(nèi)
(c是創(chuàng)建一個包,v是顯示整個打包的進(jìn)度,f是要創(chuàng)建的那個包的名稱)
tar -xvf bak.tar ##將打好的包解壓
x是抽取,v顯示進(jìn)度,f文件名
一般來講,tar打包之后還不夠,這只是說將其打包,并未壓縮,用的多的是打包成一個壓縮文件,可以在上一步的基礎(chǔ)上再用 gzip bak.tar 變成bak.tar.gz文件,那么怎么一步完成呢???
tar -zcvf bak.tar.gz 1.txt 2.txt aaa/ ##將aaa文件夾下的1.txt和2.txt打包壓縮成一個bak.tar.gz文件
tar -zxvf bak.tar,gz ##將bak.tar.gz解壓并且不打包,也就會變成1.txt和2.txt
解壓到指定文件夾下:
tar -zxvf bak.tar.gz -C /usr ##將bak.tar.gz解壓到usr文件夾內(nèi)
四、查找命令
一、常用查找命令的使用
1、查找可執(zhí)行的命令所在路徑:
which ls
2、查找可執(zhí)行的命令和幫助的位置
whereis ls(where和is中間無空格)
3、從某個文件夾開始查找文件
find /-name "gzw*"(“/”是搜索的路徑;-name是按照什么搜,可以按照 -user按 所屬用戶搜 -perm按權(quán)限搜;“gzw*”搜的內(nèi)容,*為通配符,代表以gzw為開頭的文件或者文件夾)
4、查找并刪除
find / -name "gzw*" -ok rm {};
find / -name "gzw*" -exec rm {};
5、顯示歷史命令
history ##顯示之前的所有命令
或者直接按↑鍵
二、grep命令(搜索文件的內(nèi)容)
1、基本使用-查詢包含gzw的行(不用打開文件)
grep gzw /etc/passwd ##在/etc/passwd內(nèi)查找有g(shù)zw的行
gzw:x:500:500:gzw:/home/gzw:/bin/bash
x是密碼的占位符,500為用戶id,500所屬的組的id,gzw是這個用戶的全名,也就是描述名稱,/home/gzw是用戶gzw的家目錄,/bin/bash表示gzw用戶所用的shell是bashshell(id從500開始才是真的用戶,root除外)
grep aaa ./*.txt ##在當(dāng)前目錄下,所有.txt結(jié)尾的文件內(nèi)找包含aaa的行
2、cut截取以:分割保留第七段
grep gzw /etc/passwd | cut -d:-f7
3、查詢不包含gzw的行
grep -v gzw /etc/passwd ##-v是反選
五、文件權(quán)限操作
1、Linux文件權(quán)限的描述格式解讀
r:可讀;w:可寫;x:可執(zhí)行
drwxr-xr-x可以用二進(jìn)制表示為:111 101 101 ==> 755
d:標(biāo)志節(jié)點類型(d:文件夾 -:文件 l:鏈接)
r:可讀;w:可寫;x:可執(zhí)行
第一組:rwx ##表示這個文件的擁有者對它的權(quán)限:可讀可寫可執(zhí)行
第二組:r-x ##表示這個文件的所屬組用戶對它的權(quán)限:可讀不可寫可執(zhí)行
第三組:r-x ##表示這個文件的其他的用戶對它的權(quán)限:可讀不可寫可執(zhí)行
2、修改文件權(quán)限
chmod 777 1.txt ##將1.txt變?yōu)閞wxrwxrwx
chmod +x 1.txt ##擁有者、所屬用戶、其他用戶都加一個x權(quán)限
chmod u+rx 1.txt ##擁有者加rx權(quán)限,其他的用戶不變
chmod g+rx 1.txt ##所屬用戶組加rx權(quán)限,其他的用戶不變
chmod o+rx 1.txt ##其他用戶加rx權(quán)限,其他的用戶不變
chmod -x 1.txt ##所有人減去一個x權(quán)限
但是注意,改的只是這個文件/文件夾的權(quán)限,假設(shè)文件夾還有文件,沃特娘的想一次性全部給改了,咋個辦???
chmod -R 777 aaa ##將aaa文件夾以及文件夾內(nèi)的全部文件全部改成777
那么r、w、x三個權(quán)限各是什么意思?
r對文件來說,是可讀取內(nèi)容;多文件夾來說是可以ls;
w對于文件來講,是改文件的內(nèi)容 ;對于目錄來講,是可以在目錄內(nèi)增刪子節(jié)點
x對文件來說,是能否運行這個文件;對文件夾來說是能否cd進(jìn)入這個目錄;
那么,假設(shè)我想要一個目錄或者文件直接轉(zhuǎn)個組或者轉(zhuǎn)給一個用戶怎么辦?
這個命令只能在root用戶做:
chown root:root a.sh
就是說這個文件之前的所有者以及所有組多這個文件沒了權(quán)限,文件的權(quán)限轉(zhuǎn)給了root組內(nèi)的root用戶
六、用戶管理
需要掌握的:
添加一個用戶:
useradd spark
passwd spark 根據(jù)提示設(shè)置密碼即可
刪除一個用戶:
userdel -r spark 加一個-r就表示將用戶的主目錄都刪除
1、添加用戶
添加一個tom用戶,設(shè)置其屬于 user 組,并添加注釋信息:
分步完成過程如下:
useradd tom
usermod -g user tom
usermod -c "hr tom" tom
一步完成:
useradd -g user -c "hr tom" tom
設(shè)置tom密碼:
passwd tom
2、修改用戶
修改tom用戶的登錄名字為tomcat
usermod -l tomcat tom
將tomcat添加到sys和root組中
usermod -G sys,root tomcat
查看tomcat 的組信息
groups tomcat
3、用戶組操作
添加一個叫america的組
groupadd america
將 jerry 添加到 america 組中
usermod -g america jerry
將tomcat用戶從root組和sys組刪除
gpasswd -d tomcat root
gpasswd -d tomcat sys
將 america 組名修改成 am
groupmod -n am america
4、為用戶配置 sudo 權(quán)限
這是為了個普通用戶一個管理員的權(quán)限
用 root 編輯 vi/etc/sudoers
在文件的如下位置,為 gzw 添加一行即可:
rooot ALL=(ALL) ALL
gzw ALL=(ALL) ALL
然后,gzw用戶就可以用 sudo 來執(zhí)行系統(tǒng)級別的命令
比如: sudo usersdd mayun
這行命令執(zhí)行完,下一行如果不用sudo,還是依舊本身的權(quán)限
七、系統(tǒng)管理操作
一、掛載外部存儲設(shè)備
比如說插入一個光盤,光盤里面有一個Oracle,或者說是一個鏡像,我們在Linux里面是顯示為一個設(shè)備,而不是文件;那我們?nèi)绻L問里面的文件,就要把它映射到文件目錄,就叫做掛載
可以掛載什么呢?光盤、硬盤、磁帶、光盤鏡像文件等
1、掛載光驅(qū)
mkdir /mnt/cdrom 創(chuàng)建一個目錄,用來掛載
mont -t iso9660 -o ro/dev/cdrom/mnt/cdrom/ 將設(shè)備/dev/cdrom掛載到掛載點:/mnt/cdrom 中
2、掛載光盤鏡像文件(.iso文件)
mont -t iso9660 -o loop /home/gzw/Centos-6.7.DVD.iso /mnt/centos
注:掛載的資源在重啟后即失效,需要重新掛載。想要自動掛載,可以將掛載信息設(shè)置到 /etc/fstab 配置文件中:
/dev/cdrom /mnt/cdrom iso9660 defaults 00
/root/CentOS-6.7-x86_64-bin-DVD1.iso /mnt/centos iso9660 defaults,ro,loop 00
3、卸載 umont
umont /mnt/cdrom
4、存儲空間查看
df -h
二、統(tǒng)計文件以及文件夾的大小
1、du -sh /mnt/cdrom/packages
統(tǒng)計指定路徑下的所有子目錄和文件的大小
2、df -h
查看磁盤的空間
三、系統(tǒng)服務(wù)管理
service --status-all ##查看系統(tǒng)所有的后臺服務(wù)進(jìn)程
后面可以接管道:
service --status-all | grep httpd
servoce sshd status ##查看指定的后臺服務(wù)進(jìn)程的狀態(tài)
service sshd stop
service sshd start
service sshd restart
配置后臺服務(wù)進(jìn)程的開機(jī)自啟
chkconfig httpd on ##讓httpd 服務(wù)開機(jī)自啟
chkconfig httpd off ##讓httpd 服務(wù)開機(jī)不要自啟
查看開機(jī)自啟服務(wù)的命令:
chkconfig --list | grep httpd
截圖:
那么這幾個你姐是什么意思呢?往下看
四、系統(tǒng)啟動級別管理
vi /etc/inittab
可以看到有以下幾個級別
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this) ##關(guān)機(jī),級別如果設(shè)置這個,那么一啟動就會關(guān)機(jī)
# 1 - Single user mode ##單用戶模式
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking) ##多用戶系統(tǒng),不支持網(wǎng)絡(luò)文件系統(tǒng)
# 3 - Full multiuser mode ##全功能的多用戶模式
# 4 - unused
# 5 - X11 ##帶圖形界面的全功能模式,比3多了個圖形界面
# 6 - reboot (Do NOT set initdefault to this) ##重啟
究竟要哪個級別,在這里填id就好了:一般來講設(shè)置為3就ok
那么如果一個服務(wù):
chkconfig httpd off
那么這個服務(wù)0-6都會被關(guān)閉
chkconfig --level35 httpd on
意味著,我這個服務(wù)在3,5的開機(jī)情況下可以自啟
五、進(jìn)程管理
top
相當(dāng)于Windows的任務(wù)管理器,是動態(tài)變化的:
free
顯示內(nèi)存的使用量,你發(fā)送的的那一瞬間的內(nèi)存量
ps -ef | grep ssh 查看現(xiàn)在運行的跟ssh有關(guān)的進(jìn)程
進(jìn)程號 父進(jìn)程號 啟動的命令,哪個程序啟動的
那如果我要把進(jìn)程給殺掉,怎么做?
kill -9 1532 (1532為進(jìn)程號,例如上邊的第一個進(jìn)程)
八、SSH免密登陸配置
一、SSH工作機(jī)制
1、相關(guān)概念
SSH為 Secure Shell(安全外殼協(xié)議)的縮寫,是一種協(xié)議。網(wǎng)絡(luò)遠(yuǎn)程訪問Linux,敲Shell命令,提供安全協(xié)議,提供協(xié)議,本質(zhì)上是為了會話內(nèi)容加密和身份驗證。
SSH的具體實現(xiàn)是由客戶端和服務(wù)器的軟件組成
服務(wù)端是一個守護(hù)進(jìn)程(sshd),他在后臺運行并響應(yīng)來自客戶端的連接請求;客戶端包含ssh程序以及像scp(遠(yuǎn)程拷貝)、slogin(遠(yuǎn)程登錄)、sftp(安全文件傳輸)等其他的應(yīng)用程序。
2、認(rèn)證機(jī)制
從客戶端來看,SSH提供兩種級別的安全驗證
(一)基于口令的安全驗證
只要你知道自己的賬號和口令,就可以登錄到遠(yuǎn)程主機(jī)(就像用xshll登錄)
(二)基于密鑰的安全驗證(一臺Linux登錄另一臺Linux,因為Linux上沒有XShell)
需要依靠密鑰,也就是你必須自己創(chuàng)建一堆密鑰,并且把公用密鑰放在需要訪問的服務(wù)器上
假如A要登錄B,
九、網(wǎng)絡(luò)管理
一、主機(jī)名配置
1、查看主機(jī)名
hostname
2、改主機(jī)名
hostname gzw01 ##將主機(jī)名改成gzw01,重啟后失效(重新登錄可以查看)
3、永久改主機(jī)名
vi /etc/sysconfig/network 找到HOSTNAME,改掉值,就ok了
二、IP地址配置
1、setup(并不是所有的版本可用)
用root輸入setup命令,進(jìn)入交互修改界面
2、修改配置文件(重啟后永久生效)
vi /etc/sysconfig/network-scripts/ifconfig-eth0
改完之后,要重啟網(wǎng)絡(luò)服務(wù):
service network restart
3、ifconfig 命令(重啟后無效)
ifconfig eth0 192.168.10.42
三、域名映射
etc/hosts 文件(域名映射表) 用于在通過主機(jī)名訪問時做ip解析之用。所以,你想訪問一個什么樣的主機(jī)名,就需要把這個主機(jī)名和它對應(yīng)的ip地址配置在 etc/hosts 文件中
四、網(wǎng)絡(luò)服務(wù)管理
1、后臺服務(wù)管理
service network status ##查看指定服務(wù)的狀態(tài)
service network stop ##停止指定服務(wù)
service network start ##啟動指定服務(wù)
service network restart ##重啟指定服務(wù)
service --status-all ##查看系統(tǒng)中所有的后臺服務(wù)
2、設(shè)置后臺服務(wù)的自啟配置
chconfig ##查看所有服務(wù)器自啟配置
chkconfig iptables off ##關(guān)掉指定服務(wù)的自啟動
chkconfig iptables on ##開啟指定服務(wù)的自啟動
3、系統(tǒng)中網(wǎng)絡(luò)進(jìn)程的端口監(jiān)聽情況:
netstat -nltp
十、Linux上常用軟件安裝
一、Linux軟件安裝方式
常用以下幾種方式:
1、二進(jìn)制發(fā)布包
軟件已經(jīng)針對具體平臺編譯打包,只要解壓,修改配置即可
2、RPM發(fā)布包(Redhat Package Mangement)
軟件已經(jīng)按照rehat的包管理工具規(guī)范RPM進(jìn)行打包發(fā)布,需要獲取到相應(yīng)的軟件RPM發(fā)布包,然后用RPM命令安裝
3、Yum在線安裝
軟件已經(jīng)以RPM規(guī)范打包,但已經(jīng)發(fā)布在了網(wǎng)絡(luò)上的一些服務(wù)器上,可用 yum 在線安裝服務(wù)器上存在的 rpm 軟件,并且會自動解決軟件安裝過程中的庫依賴問題(類似maven
)
4、源碼編譯安裝
軟件以源碼工程的形式發(fā)布,需要獲取到源碼工程后用相應(yīng)的人開發(fā)工具進(jìn)行編譯打包部署
二、JAVA軟件安裝——JDK安裝
1、上傳jdk壓縮包
通過sftp工具上傳即可
2、解壓jdk壓縮包
tar -zxvf jdk-XXX.gz -C /usr/local/
3、修改環(huán)境變量PATH
vi /etc/profile
在文件最末尾(按G)加兩行:
export JAVA_HOME=/usr/local/jdk1.7
export PATH=$PATH:$JAVA_HOME/bin
4、讓環(huán)境變量生效
source /etc/profile
即可
三、JAVA軟件安裝——Tomcat安裝
tar -zxvf /soft/apache-tomcat-7.0.47.tar.gz -C /usr/local/
cd /usr/local/apache-tomcat-7.0.47/bin/
./starttup.sh
四、使用rpm軟件安裝方式
1、安裝Mysql服務(wù)端:
可以用 yum 來安裝,這里我們用 rpm 包來演示:
2、安裝Mysql客戶端:
五、使用yum方式安裝
六、使用源碼方式安裝
十一、防火墻的規(guī)則配置
一、防火墻配置
防火墻配置文件為
/etc/sysconfig/iptables
來控制本機(jī)的出、入網(wǎng)絡(luò)訪問行為
二、防火墻配置
查看防火墻狀態(tài)
service iptables status
關(guān)閉防火墻
service iptables stop
啟動防火墻
service iptables start
禁止防火墻自啟
chkconfig iptables off
保存配置
service iptables save
禁止ssh登錄
iptables -A INPUT -p tcp --dport 22 -j DROP
加入一條 INPUT 規(guī)則開放 80端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
十二、高級文本處理命令(無需打開文本進(jìn)行編輯)
cut
概念:cut 命令可以從一個文本文件或者文本流中提取文本列
語法:
cut -d '分隔字符' -f fields ##用于有特定分隔字符
cut -c 字符區(qū)間 ##用于排列整齊的信息
選項和參數(shù):
-d:后面接分隔符。與 -f 一起使用;
-f :依據(jù) -d 的分隔字符將一段信息分割成數(shù)段,用 -f 取出第幾段的意思;
-c : 以字符 (characters) 的單位取出固定字符區(qū)間
實例:
PATH變量如下:
# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_131/bin:/usr/local/jdk1.8.0_131/jre/bin:/usr/local/apache-jmeter-5.0/bin/:/root/bin
這里我們可以發(fā)現(xiàn),各個路徑之間是用 : 分隔路徑的,那么我們可以利用 cut 命令去將其分隔開,假如我想提取第 2 個路徑,那么應(yīng)該輸入如下:
# echo $PATH /usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_131/bin:/usr/local/jdk1.8.0_131/jre/bin:/usr/local/apache-jmeter-5.0/bin/:/root/bin
# echo $PATH | cut -d ':' -f 2 ##提取第 2 個路徑 /usr/local/sbin
# echo $PATH | cut -d ':' -f 2,4 ##提取第 2 和第 4 個路徑
/usr/local/sbin:/sbin
# echo $PATH | cut -d ':' -f 2- ##提取第 2 個,直至最后一個路徑
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_131/bin:/usr/local/jdk1.8.0_131/jre/bin:/usr/local/apache-jmeter-5.0/bin/:/root/bin
# echo $PATH | cut -d ':' -f -2 ##提取第 1 到第 2 個
/usr/lib/qt-3.3/bin:/usr/local/sbin
# echo $PATH | cut -d ':' -f 1-3,5 ##提取 1-3 以及第 5 個
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/bin
以上,就是 cut 的常用方法,可以理解并掌握一下
sed(并不會保存文本,需要保存自行重定向)
用法:先新建一個 文本文件 ,隨便編輯些內(nèi)容進(jìn)去
# cat example 1: fjpqejfpjewjfwejvjqwjev 2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f 3:mowedfwelfw ff] f]jf] 4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq 5:fwecv iefvqw
刪除:d 命令 (delete)
# sed '2d' example ##刪除 example 文件的第 2 行 1: fjpqejfpjewjfwejvjqwjev 3:mowedfwelfw ff] f]jf] 4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq 5:fwecv iefvqw
# sed '2,$d' example ##刪除 example 文件的第 2 行到末尾的所有行(保留第 1 行)
1: fjpqejfpjewjfwejvjqwjev
# sed '$d' example ##刪除 example 文件的最后一行
1: fjpqejfpjewjfwejvjqwjev
2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw ff] f]jf]
4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq
# sed '/4/'d example ##刪除 example 文件所有包含 ‘4’ 的行
1: fjpqejfpjewjfwejvjqwjev
2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw ff] f]jf]
5:fwecv iefvqw
替換:s 命令(substitution)
# sed 's/2/change2/g' example ##在整行范圍內(nèi)將 ‘2’ 替換成 ‘change2’ 。如果無 g 標(biāo)記,則只有每行第一個匹配的 ‘2’ 被替換 1: fjpqejfpjewjfwejvjqwjev change2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f 3:mowedfwelfw ff] f]jf] 4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq 5:fwecv iefvqw
# sed -n 's/^2/change2/p' example ##(-n)選項和 p 標(biāo)志一起使用表示只打印那些發(fā)生替換的行。也就是以 ‘2’ 為開頭的行,被替換成 ‘change2’,并打印這一行
change2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
# sed 's/^1/&number one/' example ## & 符號表示在找到的字符串后追加一個字符串,比如在所有的以 ‘1’ 為首的字符串中,在 ‘1’ 后追加 ‘number one’ ,變成 ‘1number one’
1number one: fjpqejfpjewjfwejvjqwjev
2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw ff] f]jf]
4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq
5:fwecv iefvqw
# sed -n 's/(fwe)cv/1changechange/p' example ##將文本中的 ‘fwe’ 標(biāo)記為 1 ,并將所有的 ‘fwecv’ 替換成‘fwechangechange’,并且被替換的行被打印出來
5:fwechangechange iefvqw
……
awk
說明:awk 是一個強(qiáng)大的文本你分析工具,相對于 grep 的查找,sed 的編輯,awk 在其對數(shù)據(jù)分析并生成報告時,顯得尤為強(qiáng)大。簡單來講 awk 就是把文件逐行地讀入,以空格為分隔符將每行切片,切開的那部分再進(jìn)行各種分析處理
工作流程:讀入有 ‘
’ 換行符分割的一條記錄,然后將記錄按照指定的域分隔符劃分域,填充域,$0 則表示所有域,$1 表示第一個域,$n表示第 n 個域。默認(rèn)域分割符是 ‘空白鍵’ 或者 ‘[tab]鍵’ ,所以 $1 表示登錄用戶,$3 則表示用戶 ip ,以此類推
# last -n 5 ##最近登錄的 5 個賬戶的信息 root pts/2 192.168.66.1 Sat Dec 29 21:58 still logged in root pts/1 192.168.66.1 Sat Dec 29 18:28 still logged in root pts/0 192.168.66.1 Sat Dec 29 18:28 still logged in reboot system boot 2.6.32-358.el6.i Sat Dec 29 18:11 - 23:32 (05:21) root pts/1 192.168.66.1 Sat Dec 29 14:29 - down (03:41)
# last -n 5 | awk '{print $1}' ##只顯示最近登錄的 5 個賬號,不需要要其他信息
root
root
root
reboot
root
# cat /etc/passwd|awk -F ':' '{print $1}' ##如果只顯示 /etc/passwd/ 的賬戶;這里用 -F ‘:’ 表示將 ‘:’ 作為分隔符,然后取第一個域
root
bin
daemon
adm
lp
sync
……
# cat /etc/passwd|awk -F ':' '{print $1" "$7}' ##顯示 /etc/passwd 的賬戶和對應(yīng)的 shell,而賬戶與 shell 之間用 tab 鍵分隔
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
……
# cat /etc/passwd|awk -F ':' '{print $1"==="$7}' ##或者自己指定分隔符
root===/bin/bash
bin===/sbin/nologin
daemon===/sbin/nologin
adm===/sbin/nologin
lp===/sbin/nologin
sync===/bin/sync
……
# cat /etc/passwd|awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print"blue,/bin/nosh"}' ##顯示 /etc/passwd 的賬戶以及對應(yīng)的shell,用‘,’分隔,第一行加‘name,shell’,最后一行加‘blue,/bin/nosh’
name,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
sync,/bin/sync
……
blue,/bin/nosh
十三、crontab配置
功能:通過 crontab 功能,可以在固定的間隔時間執(zhí)行指定的系統(tǒng)指令或 shell script 腳本。時間間隔的單位可以是分鐘、小時、日、月、周、及以上的任意組合。這個命令非常適合周期性的日志分析或者數(shù)據(jù)備份等工作。定時調(diào)度器
安裝:
yum install crontabs
服務(wù)操作說明:
service crond start ##啟動服務(wù)
service crond stop ##關(guān)閉服務(wù)
service crond restart ##重啟服務(wù)
service crond reload ##重新載入配置
service crond status ##查看 crontab 服務(wù)狀態(tài)
chkconfig --level 35 crond on ##加入開機(jī)自啟動
命令格式:
crontab [-u user] file
crontab [-u user] [-e | -l -r]
參數(shù)說明:
-u user :用來設(shè)定某個用戶的 crontab 服務(wù),例如:“ -u gzw ” 表示設(shè)定 gzw 用戶 的 crontab 服務(wù),此參數(shù)一般由 root 用戶來運行,-u 如果不指定,默認(rèn)就是幫本用戶指定任務(wù);
file :file 是指命令文件的名字,表示將 file 作為 crontab 的任務(wù)列表文件并載入 crontab;
-e :編輯某個用戶的 crontab 文件內(nèi)容,如果不指定用戶,則表示編輯當(dāng)前用戶的 crontab 文件內(nèi)容;
-l : 顯示某個用戶的 crontab 文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的 crontab文件內(nèi)容;
-r : 刪除定時任務(wù)配置,從 /var/spool/cron 目錄中刪除某個用戶的 crontab 文件,如果不指定用戶,則默認(rèn)刪除當(dāng)前用戶的 crontab 文件;
-i : 在刪除用戶的 crontab 文件時給確認(rèn)提示
命令實例:
crotab file [-u user] ##用指定的文件替代目前的 crontab
必須掌握:
crontab -l [-u user] ##列出用戶目前的 crontab
crontab -e[-u user] ##編輯用戶目前的 crontab
# crontab -l ##看當(dāng)前用戶有沒有定時任務(wù) no crontab for root
# crontab -e ##增加個定時任務(wù),里面填入以下內(nèi)容,保存
* * * * * date >> /root/date.txt
# crontab -l ##保存完之后,可進(jìn)行查看
* * * * * date >> /root/date.txt
# cat date.txt ##可以看到結(jié)果,每分鐘,文件內(nèi)被追加寫了一行 date
Sun Dec 30 00:47:01 CST 2018
Sun Dec 30 00:48:01 CST 2018
Sun Dec 30 00:48:01 CST 2018
Sun Dec 30 00:49:01 CST 2018
Sun Dec 30 00:49:01 CST 2018
調(diào)度配置
說明
格式如下:
* * * * * command
分 時 日 月 周 命令
第 1 列表示分鐘 1-59 每分鐘用 * 或者 */1 表示
第 2 列表示小時 0-23 (0表示 0點)7-9表示:8點到10點之間
第 3 列表示日期 1-31
第 4 列表示月份 1-12
第 5 列表示星期 0-6(0表示星期天)
第 6 列表示要運行的命令
配置實例
30 21 * * * /usr/local/etc/rc.d/httpd restart ## 表示每晚的 21:30 自動重啟 apache
45 4 1,10,22 * * /usr/local/etc/rc.d/httpd restart ## 表示每月 1、10、22 日的 4:45 重啟 apache
10 1 * * 6,0 /usr/local/etc/rc.d/httpd restart ## 表示每周六、日的 1:10 重啟 apache
0,30 18-23 * * * /usr/local/etc/rc.d/httpd restart ## 表示在每天 18:00 至 23:00 之間每隔 30 分鐘重啟 apache
0 23 * * 6 /usr/local/etc/rc.d/httpd restart ## 表示每周六的 11:00 pm 重啟 apache
* */1 * * * /usr/local/etc/rc.d/httpd restart ## 表示每 1 小時重啟 apache
* 23-7/1 * * * /usr/local/etc/rc.d/httpd restart ## 表示晚上 11 點 到早上 7 點之間,每隔 1 小時重啟 apache
0 4 1 jan * /usr/local/etc/rc.d/httpd restart ## 表示一月一號的 4 點重啟 apache
shell編程
shell 是用戶與內(nèi)核進(jìn)行交互的一種接口,目前最流行的 shell 稱為 bash shell
shell 也是一門編程語言<解釋型的編程語言>,即 shell 腳本,就是在用 linux 的 shell 命令編程
一個系統(tǒng)可以存在多個 shell ,可以通過 cat/etc/shell 命令查看系統(tǒng)中安裝的 shell ,不同的 shell 可能支持的命令語法是不同的
一、基本格式
代碼寫在普通文本文件中,通常以 .sh 為后綴名
vi hello.sh
#!/bin/bash ##表示用哪一種 shell 解析器解析執(zhí)行我們的這個腳本程序 echo "hello world"
執(zhí)行腳本
sh hello.sh 為什么這里加 sh 不加路徑可以運行?因為 sh 在環(huán)境變量內(nèi),不加路徑就默認(rèn)當(dāng)前路徑
或者給腳本添加 x 權(quán)限,直接執(zhí)行
chmod 755 hello.sh
# ./hello.sh ##這里為啥要加 ./ ? 運行程序,系統(tǒng)都是從環(huán)境變量里面去找,很顯然這個腳本的路徑并不在環(huán)境變量內(nèi) ./ 已經(jīng)指定在當(dāng)前路徑下 hello world
二、基本語法
系統(tǒng)變量
Linux shell 中的變量分為“系統(tǒng)變量”和“用戶自定義變量”,可通過 set 命令查看系統(tǒng)變量
# set BASH=/bin/bash BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=() BASH_CMDS=() BASH_LINENO=() BASH_SOURCE=() BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu") BASH_VERSION='4.1.2(2)-release' COLORS=/etc/DIR_COLORS ……
系統(tǒng)變量:$BASH、$HOME、$PWD、$SHELL、$USER 等等
自定義變量
自定義的變量只能在當(dāng)前進(jìn)程生效,不能跨進(jìn)程傳遞自定義變量
1、語法
變量=值 (例如 STR=abc)
等號兩側(cè)不能有空格
變量名稱一般習(xí)慣大寫
使用變量: $arg
雙引號和單引號有區(qū)別,雙引號僅僅將空格脫意,單引號會將變量引用也脫意
# mygirl1=angela baby ##中間有空格,linux 會認(rèn)為是兩個參數(shù),所以要加引號 -bash: baby: command not found
# mygirl1='angela baby'
# echo $mygirl1
angela baby
# mygirl2="she is $mygirl1" ##將里面的變量也打印出其值
# echo $mygirl2
she is angela baby
# mygirl2='she is $mygirl1' ##里面的變量,只會按原樣打印出來
# echo $mygirl2
she is $mygirl1
2、示例
STR="hello world"
A=9
echo $A
echo $STR
如果想打印 hello worlds is greate 怎么辦?
echo $STR is greate 行么?
不行!正確的寫法是:
echo ${STR}s is greate
# mycount=2000
# echo $mycount
2000
##如果想打印 2000 is mycount 要這樣寫:
# echo $mycount is mycount
2000 is mycount
或者:
# echo ${mycount} is mycount
2000 is mycoun
##如果要打印 2000s is mycount 怎么寫?
# echo $mycounts is mycount
is mycount
這樣寫,linux會認(rèn)為 mycounts 是一個變量,但這個變量并沒有定義,所以為空,正確的寫法如下:
# echo ${mycount}s is mycount
2000s is mycount
unset A 撤銷變量 A
redonly B=2 聲明靜態(tài)的變量 B=2 ,不能 unset
export A 將變量提升為當(dāng)前 shell 進(jìn)程中的全局環(huán)境變量,可供其他子 shell 程序使用
注意理解 export:
#vi a.sh
#!/bin/bash A=aaaa echo "in a.sh---"$A sh b.sh
#vi b.sh
#!/bin/bash
echo "in b.sh---"$A
上面的意思:我們在 a.sh 定義了一個變量 A ,并且打印 A,執(zhí)行 b.sh;在 b.sh 里面是打印變量 A 的值 ,我們先把 a.sh 和 b.sh 賦予可執(zhí)行權(quán)限,再分別執(zhí)行下,看能不能得到正確結(jié)果:
# chmod +x a.sh b.sh # ./a.sh ## b.sh 沒有結(jié)果 in a.sh---aaaa in b.sh--- # ./b.sh ## b.sh 沒有結(jié)果 in b.sh---
# echo $A ## 沒有結(jié)果
這是為什么呢?我們畫個簡單的圖來理解一下:我們登錄會話有一個進(jìn)程,里面我們?nèi)フ{(diào)用個 a.sh 子進(jìn)程,a.sh 進(jìn)程里面去調(diào)用個 b.sh 子進(jìn)程,這三個進(jìn)程內(nèi)的變量是不共用的,所以,我們在 登錄會話中直接
打印 $A 的值,是不會出現(xiàn)的;同樣的,我們在 b.sh 里面想去 echo $A 也是無法打印出來的
那么,怎么才能解決呢?答案是把 A 這個變量作為全局變量就 ok ,那么在當(dāng)前進(jìn)程 ,以及其子進(jìn)程 ,就能用這個變量了,
#vi a.sh #!/bin/bash exoprt A=aaaa echo "in a.sh---"$A sh b.sh
b.sh 就不用管,我們再打印下:這里可以發(fā)現(xiàn),b.sh 已經(jīng)取到了 a.sh 內(nèi)的變量
# ./a.sh in a.sh---aaaa in b.sh---aaaa
另一種方式:source
#!/bin/bash A=aaaa echo "in a.sh---"$A source /root/b.sh ##這里改成 b.sh 的絕對路徑
看一下,a.sh 的結(jié)果:之前我們改過 /etc/profile 里面的環(huán)境變量 ,我們要 source 一下 profile ,source 是干嘛的?source 的功能在調(diào)用腳本,可以將 b.sh 在 a.sh 的進(jìn)程空間內(nèi)運行,而不是另外開一個進(jìn)程
# ./a.sh in a.sh---aaaa in b.sh---aaaa
另一種方式:用 '.' 代表source ,后面的 '.' 代表本地,可以改成:. /root/b.sh
#!/bin/bash A=aaaa echo "in a.sh---"$A . ./b.sh
結(jié)果:
# ./a.sh in a.sh---aaaa in b.sh---aaaa
總結(jié):
a.sh 中直接調(diào)用 b.sh ,會讓 b.sh 在 a 所在的 bash 進(jìn)程的“子進(jìn)程”空間中執(zhí)行;
而子進(jìn)程空間只能訪問父進(jìn)程中用 export 定義的變量;
一個 shell 進(jìn)程無法將自己定義的變量提升到父進(jìn)程空間中去;
"."號執(zhí)行腳本時,會讓腳本在調(diào)用者所在的 shell 進(jìn)程空間中執(zhí)行
3、反引號賦值
A=`ls -la` ## 反引號,運行里面的命令,并將結(jié)果返回給變量 A(在esc下面那個鍵,在英文狀態(tài)下輸入)
A=$(ls -la) ## 等價于反引號
# a=`ls -la` # echo $a total 844 drwxr-xr-x 2 root root 4096 Jan 3 20:51 . drwxr-xr-x 9 root root 4096 Jan 3 14:37 .. -rw-r--r-- 1 root root 28857 Nov 9 19:09 bootstrap.jar -rw-r--r-- 1 root root 14867 Nov 9 19:09 catalina.bat -rwxr-xr-x 1 root root 22785 Jan 3 20:51 catalina.sh -rw-r--r-- 1 root root 1647 Nov 9 19:09 catalina-tasks.xml -rw-r--r-- 1 root root 25145 Nov 9 19:09 commons-daemon.jar -rw-r--r-- 1 root root 207125 Nov 9 19:09 commons-daemon-native.tar.gz -rw-r--r-- 1 root root 2040 Nov 9 19:09 configtest.bat -rwxr-xr-x 1 root root 1922 Nov 9 19:09 configtest.sh -rwxr-xr-x 1 root root 8508 Nov 9 19:09 daemon.sh -rw-r--r-- 1 root root 2091 Nov 9 19:09 digest.bat -rwxr-xr-x 1 root root 1965 Nov 9 19:09 digest.sh -rw-r--r-- 1 root root 3460 Nov 9 19:09 setclasspath.bat -rwxr-xr-x 1 root root 3680 Nov 9 19:09 setclasspath.sh -rw-r--r-- 1 root root 2020 Nov 9 19:09 shutdown.bat -rwxr-xr-x 1 root root 1902 Nov 9 19:09 shutdown.sh -rw-r--r-- 1 root root 2022 Nov 9 19:09 startup.bat -rwxr-xr-x 1 root root 1904 Nov 9 19:09 startup.sh -rw-r--r-- 1 root root 45466 Nov 9 19:09 tomcat-juli.jar -rw-r--r-- 1 root root 411789 Nov 9 19:09 tomcat-native.tar.gz -rw-r--r-- 1 root root 4550 Nov 9 19:09 tool-wrapper.bat -rwxr-xr-x 1 root root 5458 Nov 9 19:09 tool-wrapper.sh -rw-r--r-- 1 root root 2026 Nov 9 19:09 version.bat -rwxr-xr-x 1 root root 1908 Nov 9 19:09 version.sh
# a=`date +%Y-%m-%d`
# echo $a
2019-01-03
4、特殊變量
$? ## 表示上一個命令退出的狀態(tài)
$$ ## 表示當(dāng)前進(jìn)程編號
$0 ##表示當(dāng)前腳本名稱
$n ##表示 n 位置的輸入?yún)?shù)( n 代表數(shù)字,n >= 1)-----相當(dāng)于傳參
$# ##表示參數(shù)的個數(shù),常用于循環(huán)
$* 和 $@ ##都表示參數(shù)列表
注:$* 和 $@ 的區(qū)別:
$* 和 $@ 都表示傳遞給函數(shù)或腳本的所有參數(shù)
不被雙引號 " " 包含時
$* 和 $@ 都以 $1 $2……$n 的形式組成參數(shù)列表
當(dāng)它們被雙引號 " " 包含時
"$*" 會將所有的參數(shù)作為一個整體,以"$1 $2 …… $n" 的形式輸出所有參數(shù);
"$@" 會將各個參數(shù)分開,以 "$1" "$2"……"$n" 的形式輸出所有參數(shù)
# echo $$ 14689 # echo $? 0
編輯 a.sh
#vi a.sh
#!/bin/bash
echo they are:
echo $1 $2 $3
結(jié)果:
# sh a.sh
they are:
#我們輸入?yún)?shù)看看:
# sh a.sh liuyifei yangyin reba
they are:
liuyifei yangyin reba
三、運算符
一、算數(shù)運算
1、用 expr
格式: expr m + n 或 $((m+n)) 注意 expr 運算符間要有空格
例如:計算 (2+3)*4 的值
1、分步計算
S=`expr 2 + 3` ## expr是接收運算符用的 ,` 是取出表達(dá)式的運算結(jié)果
expr $S * 4 ## * 號需要轉(zhuǎn)義
2、一步計算完成
expr `expr 2 + 3` * 4
echo `expr \`expr 2 + 3\` * 4`
#分步計算 # S=`expr 2 + 3` # expr $S * 4
20
#一步計算完成
# expr `expr 2 + 3` * 4
20
# echo `expr \`expr 2 + 3\` * 4`
20
2、用(())——要取出運算結(jié)果
要取值需加 $ 符號,否則會報錯;運算符間無需加空格
# a=$((1+2)) # echo $a 3
# a=$(((2+3)*4))
# echo $a
20
# count=1
# ((count++))
# echo $count
2
3、用[]
# a=$[1+2] # echo $a 3
四、流程控制
if 語法
1、語法格式
if [ condition A ]
then
[結(jié)果A]
elif [ condition B ]
then [結(jié)果 B]
else
[結(jié)果 C ]
fi
2、實例
#vi hello.sh ## 編輯腳本
#!/bin/bash
read -p "Please input yourname :" NAME ## 讀取從控制臺輸入的變量,存為參數(shù) NAME
if [ $NAME = root ] ## 注意,這里的[]是有空格的,[]是命令,命令之間,就有空格
then
echo "Hello ${NAME}, welcome !"
elif [ $NAME = gzw ]
then
echo "Hello ${NAME}, welcome !"
else
echo "DSB,get out !"
fi
#輸入值為 gzw
# sh ./hello.sh
Please input yourname :gzw
Hello gzw, welcome !
#輸入值為 root
# sh ./hello.sh
Please input yourname :root
Hello root, welcome !
#輸入值為 特殊值
# sh ./hello.sh
Please input yourname :hhh
DSB,get out !
3、判斷條件
1、判斷條件基本語法
[ condition ] ## 注意,條件的前后,是有空格的
# 條件非空,返回 true ,可用 $? 驗證 (0 為 true ,> 1 為 false)
[ itcast ]
# 空返回 false
#vi if.sh
#!/bin/bash
if [ a=b ] ##等號左右沒有加空格,就不會作為判斷,而作為一個字符串,[]內(nèi)字符為非空,就為 true 的結(jié)果
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if.sh
ok
#!/bin/bash
if [ a = b ] ##等號左右有加空格,會作為判斷,等號會變成命令,因為隔開了
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if.sh
notok
#!/bin/bash
if [ ] ##左右只有倆空格,沒有任何東西,或者里面只有三空格,會執(zhí)行 false
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if.sh
notok
2、條件判斷組合
[ condition ] && echo ok || echo notok ## condition 成立 ,執(zhí)行 echo ok ,不成立執(zhí)行 echo notok ,可以理解為三元運算符
條件滿足,執(zhí)行后面的 && ,不滿足執(zhí)行 ||
注意:[ ] 和 [[ ]] 的區(qū)別:[[ ]] 中邏輯組合可以使用 && || 符號
而 [ ] 里面邏輯組合可以用 -a -o ## -a 是and關(guān)系,or 是或的關(guān)系
#vi if2.sh
#!/bin/bash
if [ a = b && b = c ]
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if2.sh
./if2.sh: line 2: [: missing `]'
notok
#!/bin/bash
if [[ a = b && b = c ]] ##這里是 倆 [[ ]] ,單括號不支持與或非符號的
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if2.sh
notok
#!/bin/bash
if [ a = b -a b = c ]
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if2.sh
notok
#!/bin/bash
if [ a = b -o b = b ]
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if2.sh
ok
3、常用判斷運算符
字符串比較: = != -z -n (=就是相等;!=就是不相等;-z是指字符串長度為0,返回 true;-n是字符串長度不為0,返回 true)
整數(shù)比較:
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
文件判斷:
-d 是否為目錄
-f 是否為文件
-e 是否存在
while 語法
1、方式1
while expression
do
command
...
done
2、方式2
i=1
while ((i<=3))
do
echo $i
let i++
done
cese 語法
case $1 in
start)
echo "starting"
;;
stop)
echo "stoping"
;;
*)
echo "Usage:{start|stop}"
esac
for 語法
1、方式1
for N in 1 2 3
do
echo $N
done
或者
for N in 1 2 3;do echo $N;done
或者
for N in {1..3};do echo $N;done
2、方式2
for ((i = 0;i <= 5;i++))
do
echo "welcome $i times"
done
或者
for ((i = 0;i <= 5;i++));doecho "welcome $i times"; done
五、函數(shù)使用
1、函數(shù)定義
#!/bin/sh
# func1.sh
hello()
{
echo "Hello there today's date is `date +%Y-%m-%d`"
# return 2
}
hello
# echo $?
echo "now going to the function hello"
echo "back from the function"
執(zhí)行結(jié)果:
# sh ./func1.sh
Hello there today's date is 2019-01-06
now going to the function hello
back from the function
函數(shù)調(diào)用:
fuction hello() 或者 function hello 或者 hello
注意:
必須在調(diào)用函數(shù)之前,先聲明函數(shù),shell 腳本是逐行運行。不會像其他語言一樣預(yù)先編譯
函數(shù)返回值,只能通過 $? 系統(tǒng)變量或的,可以顯示加 : return 返回,如果不加,將以最后一條命令運行結(jié)果,作為返回值。 return 后跟數(shù)值 n(0-255)
腳本調(diào)試:(基本不用)
sh -vx helloWorld.sh 或者在腳本中增加 set -x
2、函數(shù)參數(shù)
#!/bin/bash
#func2.sh
funcWithParam(){
echo "第一個參數(shù)為 $1 !"
echo "第二個參數(shù)為 $2 !"
echo "第十個參數(shù)為 $10 !"
echo "第十個參數(shù)為 ${10} !"
echo "第十一個參數(shù)為 ${11} !"
echo "參數(shù)總數(shù)有 $# 個 !"
echo "作為一個字符串輸出所有參數(shù) $* !"
}
funcWithParam 1 2 3 4 5 6 7 8 9 34 73
執(zhí)行結(jié)果:
# sh ./func2.sh
第一個參數(shù)為 1 !
第二個參數(shù)為 2 !
第十個參數(shù)為 10 !
第十個參數(shù)為 34 !
第十一個參數(shù)為 73 !
參數(shù)總數(shù)有 11 個 !
作為一個字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !
注意:$10 不能獲取第 10 個參數(shù),獲取第 10 個參數(shù)需要 ${10} 。當(dāng) n >= 10 時,需要使用 ${n} 來獲取參數(shù)。
3、函數(shù)返回值
#!/bin/bash
#func3.sh
funcWithReturn(){
echo "這個函數(shù)會對輸入的兩個數(shù)字進(jìn)行相加運算..."
echo "輸入第一個數(shù)字:"
read aNum
echo "輸入第二個數(shù)字:"
read anotherNum
echo "兩個數(shù)字分別為 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funcWithReturn
echo "輸入的兩個數(shù)字之和為:$? !"
結(jié)果:
# sh ./func3.sh
這個函數(shù)會對輸入的兩個數(shù)字進(jìn)行相加運算...
輸入第一個數(shù)字:
8
輸入第二個數(shù)字:
5
兩個數(shù)字分別為 8 和 5 !
輸入的兩個數(shù)字之和為:13 !
返回值的范圍是 0-255之間
4、跨腳本調(diào)用函數(shù)
假如上述腳本的文件 fun2.sh 保存在路徑:/root/fun2.sh
則可在腳本 fun_other.sh 中調(diào)用腳本 fun_other 中的函數(shù)
#!/bin/bash #func_other.sh . /root/func2.sh ##注:. 和 / 之間要有空格 為啥要有空格?因為 /root/func2.sh 是在一個子進(jìn)程內(nèi)加載,而我的當(dāng)前進(jìn)程腳本進(jìn)程沒有那個函數(shù),所以要 source 一下,或者 . 一下 #或者 source /root/func2.sh funcWithParam 11 22 33 44 55 66 77 88 99 100 101 結(jié)果: # sh ./func_other.sh 第一個參數(shù)為 11 ! 第二個參數(shù)為 22 ! 第十個參數(shù)為 110 ! 第十個參數(shù)為 100 ! 第十一個參數(shù)為 101 ! 參數(shù)總數(shù)有 11 個 ! 作為一個字符串輸出所有參數(shù) 11 22 33 44 55 66 77 88 99 100 101 !
shell 編程綜合練習(xí)
自動化軟件部署腳本
一、需求
1、描述:公司內(nèi)部有一 N 個節(jié)點集群,需要統(tǒng)一安裝一些軟件,例如;jdk,開發(fā)一個腳本,實現(xiàn)對局域網(wǎng)中的 N 臺節(jié)點批量自動下載,并且安裝 jdk
思路
1、編寫一個啟動腳本,用來發(fā)送一個軟件安裝腳本到每一臺機(jī)器
2、然后啟動每臺機(jī)器上的軟件安裝腳本來執(zhí)行軟件下載和安裝
具體實現(xiàn)方式:我們可以用一臺服務(wù)器配置成基服務(wù)器,上面搭建好一個 web 容器,比如 apache ,把 jdk 的包放在 var/www/html/software 下面,總之是個路徑,讓其他的服務(wù)器能夠通過一個網(wǎng)頁打開的方式,獲取到這個 jdk 的安裝包,而不是全部去 wget 下載,這樣太慢了。
那么,我們可以寫兩個腳本 ,第一個腳本是 bootstrap.sh 作用是將第二個 install.sh 發(fā)送到每一個節(jié)點上。真正的安裝軟件的過程,是在 install.sh 上面。這樣,每一臺都有自己的 install.sh 。install.sh 內(nèi)寫啥呢?先從基服務(wù)器上下載安裝包,下載后解壓,解壓后配置環(huán)境變量
細(xì)節(jié):那么我們公共服務(wù)器怎么將 install.sh 發(fā)送到各節(jié)點呢?用 scp install.sh node :/root 做循環(huán),但是要 scp 就要配置免密登錄,否則就得驗證指紋啥的,腳本太復(fù)雜了。我們看免密登錄怎么弄?人機(jī)交互expect 可以解決
expect的使用
痛點:使用 scp 命令遠(yuǎn)程拷貝文件時,會有人機(jī)交互的過程,如何讓腳本完成人機(jī)交互?
妙藥: expect
用法實例:
先觀察 ssh localhost 的過程
再看 expect 的功能
# vi exp_test.sh
#!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect { "(yes/no)" {send "yes";exp_continue;} "password:" {send "123456";exp_continue;} eof {exit 0;} }
執(zhí)行: expect -f exp_test.sh
腳本搞好了之后,可以在 /etc/hosts 內(nèi),以 ip 子機(jī)名 的形式 ,搞好 hosts 文件,ping 一下看是否可以 ping 通,可以寫進(jìn) boot.sh 的 SERVERS 內(nèi)
三、腳本開發(fā)
1、vi boot.sh
SERVERS="gzw1 gzw2" #要安裝的服務(wù)器名稱
PASSWORD=123456 #服務(wù)器上的password
BASE_SERVER=47.107.183.88 #公共服務(wù)器的 ip
## 實現(xiàn)免密登錄配置的函數(shù)
auto_ssh_copy_id(){
expect -c"set timeout -1;
spawn ssh-copy-id $1;
expect {
*(yes/no)*{send --yes;exp_continue;}
*assword:*{send --$2;exp_continue;}
eof {exit0;}
}";
}
ssh_copy_id_to_all(){
for SERVER in $SERVERS
do
auto_ssh_copy_id $SERVER $PASSWORD
done
}
## 調(diào)用免密登錄配置函數(shù),實現(xiàn)母機(jī)到個子機(jī)的免密登陸配置
ssh_copy_id_to_all
##完成分發(fā) install.sh 到各子機(jī)的操作
##并讓子機(jī)啟動 install.sh
for SERVER in $SERVERS
do
scp insatll.sh root@$SERVER:/root
ssh root@$SERVER /root/install.sh ##一臺機(jī)器,執(zhí)行另一臺機(jī)器的 install.sh
done
2、安裝執(zhí)行腳本
vi install.sh
#!/bin/bash BASE_SERVER=47.107.183.88 ##母機(jī)的 ip ## 為本機(jī)安裝 wget 命令 yum install -y wget ## 使用 wget 從母機(jī)的 web 服務(wù)器上下載 jdk 壓縮包 wget $BASE_SERVER/software/jdk-XXX ## 將下載的壓縮包解壓到一個相同路徑下 tar -zxvf jdk-XXX -C /usr/local ## 修改 profile 配置文件 cat >> /etc/profile << EOF ##往 /etc/profile 內(nèi)追加兩行,如果修改很復(fù)雜,就要用 awk ,這里,cat 將 EOF 之間的內(nèi)容重定向到 /etc/profile 內(nèi) export JAVA_HOME=/usr/local/jdk-XXX export PATH=$PATH:$JAVA_HOME/bin EOF
最后,在母機(jī)上 運行 boot.sh 就 ok
總結(jié)
- 上一篇: 快手直播(上的快手极速版)
- 下一篇: U-boot中SPL功能和源码流程分析