[No000014A]Linux简介与shell编程
Linux 介紹
????內核
????庫: .so 共享對象,windows:dll 動態鏈接庫
????應用程序
Linux的基本原則:
1、由目的單一的小程序組成;組合小程序完成復雜任務;
2、一切皆文件;
3、盡量避免捕獲用戶接口;
4、配置文件保存為純文本格式;
用戶接口
GUI接口:
CLI接口:
????命令提示符,prompt, bash(shell)
????????#: root
????????$: 普通用戶
????命令:
命令格式:
????命令 選項 參數
????????選項:
????????????短選項: -
????????????????多個選項可以組合:-a -b = -ab
????????????長選項: --
????????參數:命令的作用對象
虛擬終端(terminal):Ctrl+Alt+F1-F6
Shell:
GUI: Graphic User Interface
????Windows
????X-Window
????????Gnome
????????KDE
????????Xface
CLI: Command Line Interface
????sh
????bash
????csh
????ksh
????zsh
????tcsh
prompt,命令提示符:
命令:
magic number: 魔數
shebang
#!/bin/bash
# command options... arguments...
選項:
????短選項 -
????長選項 --
參數:
list: ls
列出,列表
目錄:文件,路徑映射
路徑:從指定起始點到目的地所經過位置
文件系統:file system
列出指定路徑下的文件
目錄:working directory, current directory
pwd: Printing Working directory
ls
????-l:長格式
????????文件類型:
????????????-:普通文件 (f)
????????????d: 目錄文件
????????????b: 塊設備文件 (block)
????????????c: 字符設備文件 (character)
????????????l: 符號鏈接文件(symbolic link file)
????????????p: 命令管道文件(pipe)
????????????s: 套接字文件(socket)
????????文件權限:9位,每3位一組,3組 權限(U,G,O)每一組:rwx(讀,寫,執行), r-- ,第一組:文件的屬主用戶權限。第二組:文件的屬組用戶權限,第三組:其他用戶權限
????????文件硬鏈接的次數
????????文件的屬主(owner)
????????文件的屬組(group)
????????文件大小(size),單位是字節
????????時間戳(timestamp):最近一次被修改的時間
????????????訪問:access
????????????修改:modify,文件內容發生了改變
????????????改變:change,metadata,元數據
????-h:做單位轉換
????-a: 顯示以.開頭的隱藏文件
????????. 表示當前目錄
????????.. 表示父目錄
????-A
????-d: 顯示目錄自身屬性
????-i: index node, inode
????-r: 逆序顯示
????-R: 遞歸(recursive)顯示
cd: change directory
????家目錄,主目錄, home directory
????cd ~USERNAME: 進入指定用戶的家目錄
????cd -:在當前目錄和前一次所在的目錄之間來回切換
命令類型:
????內置命令(shell內置),內部,內建
????外部命令:在文件系統的某個路徑下有一個與命令名稱相應的可執行文件
type: 顯示指定屬于哪種類型
date:時間管理
Linux: rtc
????硬件時鐘
????系統時鐘
獲得命令的使用幫助:
內部命令:
????help COMMAND 比如:help cd
外部命令:
????COMMAND --help 比如:date --help
命令手冊:manual
man COMMAND
whatis COMMAND
分章節:
1:用戶命令(/bin, /usr/bin, /usr/local/bin)
2:系統調用
3:庫用戶
4:特殊文件(設備文件)
5:文件格式(配置文件的語法)
6:游戲
7:雜項(Miscellaneous)
8: 管理命令(/sbin, /usr/sbin, /usr/local/sbin)
MAN:
????NAME:命令名稱及功能簡要說明
????SYNOPSIS:用法說明,包括可用的選項
????DESCRIPTION:命令功能的詳盡說明,可能包括每一個選項的意義
????OPTIONS:說明每一個選項的意義
????FILES:此命令相關的配置文件
????BUGS:
????EXAMPLES:使用示例
????SEE ALSO:另外參照
翻屏:
????向后翻一屏:SPACE
????向前翻一屏:b
????向后翻一行:ENTER
????向前翻一行:k
查找:
/KEYWORD: 向后
n: 下一個
N:前一個
q: 退出
練習:
????使用date單獨獲取系統當前的年份、月份、日、小時、分鐘、秒
hwclock
????-w:
????-s:
練習:
1、echo是內部命令還是外部命令?
2、其作用?
3、如何顯示 echo "The year is 2013." echo "Today is 26."為兩行?
請設置系統時間和硬件時間保持一致。
cp
mv
文件系統:
rootfs: 根文件系統 /
FHS:Linux
/boot: 系統啟動相關的文件,如內核、initrd,以及grub(bootloader)
/dev: 設備文件
????設備文件:
????????塊設備:隨機訪問,數據塊
????????字符設備:線性訪問,按字符為單位
????????設備號:主設備號(major)和次設備號(minor)
/etc:配置文件
/home:用戶的家目錄,每一個用戶的家目錄通常默認為/home/USERNAME
/root:管理員的家目錄;
/lib:庫文件
????靜態庫, .a
????動態庫, .dll, .so (shared object)
????/lib/modules:內核模塊文件
/lib64
/media:掛載點目錄,移動設備
/mnt:掛載點目錄,額外的臨時文件系統
/opt:可選目錄,第三方程序的安裝目錄
/proc:偽文件系統,內核映射文件
/sys:偽文件系統,跟硬件設備相關的屬性映射文件
/tmp:臨時文件, /var/tmp
/var:可變化的文件
/bin: 可執行文件, 用戶命令
/sbin:管理命令
絕對路徑:以跟目錄為起點到目標的路徑。
相對路徑:以當前目錄為起點到目標的路徑
mkdir:創建空目錄
????-p:
????-v: verbose
/root/x/y/z
/mnt/test/x/m,y
mkdir -pv /mnt/test/x/m /mnt/test/y
mkdir -pv /mnt/test/{x/m,y}
# tree:查看目錄樹
刪除目錄:rmdir (remove directory)
????刪除空目錄
????-p
文件創建和刪除
# touch
????-a
????-m
????-t
????-c
# stat 查看文件信息
創建文件,可以使用文件編輯器
nano
vi(另外一個文件)
刪除文件:rm
????-i 刪除之前確認
????-f 刪除之前不確認
????-r 遞歸刪除
rm -rf / linux 自殺
cp: copy
cp SRC DEST
????-r
????-i 存在覆蓋前確認
????-f
????-p
????-a:歸檔復制,常用于備份
cp file1 file2 file3
一個文件到一個文件
多個文件到一個目錄
cp /etc/{passwd,inittab,rc.d/rc.sysinit} /tmp/
mv: move
移動文件
mv SRC DEST
mv -t DEST SRC
目錄管理:
ls、cd、pwd、mkdir、rmdir、tree
文件管理:
touch、stat、file、rm、cp、mv、nano,vi,vim
日期時間:
date、clock、hwclock、cal ,ntpdate
查看文本:
cat、tac、more、less、head、tail
分屏顯示:
more、less
more: 向后翻
less:
head:查看前n行
tail:查看后n行
????-n
tail -f: 查看文件尾部,不退出,等待顯示后續追加至此文件的新內容;
文本處理:
cut、sort,join、sed、awk
文本文件:
Tom:23:male:2013/05/06
cut:
????-d: 指定字段分隔符,默認是空格
????-f: 指定要顯示的字段
????????-f 1,3
????????-f 1-3
文本排序:sort
????-n:數值排序
????-r: 降序
????-t: 字段分隔符
????-k: 以哪個字段為關鍵字進行排序
????-u: 排序后相同的行只顯示一次
????-f: 排序時忽略字符大小寫
文本統計:wc (word count)
????-l
????-w
????-c
????-L
sed基本用法:
sed: Stream EDitor
????行編輯器 (全屏編輯器: vi)
sed: 模式空間
默認不編輯原文件,僅對模式空間中的數據做處理;而后,處理結束后,將模式空間打印至屏幕;
sed [options] 'AddressCommand' file ...
????-n: 靜默模式,不再默認顯示模式空間中的內容
????-i: 直接修改原文件
????-e SCRIPT -e SCRIPT:可以同時執行多個腳本
????-f /PATH/TO/SED_SCRIPT
????????sed -f /path/to/scripts file
????-r: 表示使用擴展正則表達式
Command:
????d: 刪除符合條件的行;
????p: 顯示符合條件的行;
????a \string: 在指定的行后面追加新行,內容為string
????????\n:可以用于換行
????i \string: 在指定的行前面添加新行,內容為string
????r FILE: 將指定的文件的內容添加至符合條件的行處
????w FILE: 將地址指定的范圍內的行另存至指定的文件中;
????s/pattern/string/修飾符: 查找并替換,默認只替換每行中第一次被模式匹配到的字符串
????????加修飾符
????????g: 全局替換
????????i: 忽略字符大小寫
????s///: s###, s@@@????
????????\(\), \1, \2
????l..e: like-->liker
???????? love-->lover
???????? like-->Like
???????? love-->Love
????&: 引用模式匹配整個串
sed練習:
1、刪除/etc/grub.conf文件中行首的空白符;
sed -r 's@^[[:space:]]+@@g' /etc/grub.conf
2、替換/etc/inittab文件中"id:3:initdefault:"一行中的數字為5;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
3、刪除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
awk:
????awk是一個強大的文本分析工具,
????相對于grep的查找,sed的編輯,
????awk在其對數據分析并生成報告時,顯得尤為強大。
????簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。
awk '{pattern + action}' {commands}
????其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令。
????花括號({})不需要在程序中始終出現,但它們用于根據特定的模式對一系列指令進行分組。
????pattern就是要表示的正則表達式,用斜杠括起來。????
案例:
顯示最近登錄的5個帳號
#last -n 5 | awk '{print $1}'
讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域
$0則表示所有域,$1表示第一個域,$n表示第n個域。默認域分隔符是"空白鍵" 或 "[tab]鍵",
所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推。
如果只是顯示/etc/passwd的賬戶
#cat /etc/passwd |awk -F ':' '{print $1}'
root
daemon
bin
sys
這種是awk+action的示例,每行都會執行action{print $1}。
-F指定域分隔符為':'。
如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割
#cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
root /bin/bash
daemon /bin/sh
bin /bin/sh
sys /bin/sh
如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
復制代碼
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh
awk工作流程是這樣的:先執行BEGING,然后讀取文件,讀入有/n換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨后開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執行END操作。
搜索/etc/passwd有root關鍵字的所有行
#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
這種是pattern的使用示例,匹配了pattern(這里是root)的行才會執行action(沒有指定action,默認輸出每行的內容)。
搜索支持正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd
搜索/etc/passwd有root關鍵字的所有行,并顯示對應的shell
# awk -F: '/root/{print $7}' /etc/passwd
/bin/bash
這里指定了action{print $7}
awk內置變量
awk有許多內置變量用來設置環境信息,這些變量可以被改變,下面給出了最常用的一些變量。
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價于命令行 -F選項
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
$0變量是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,......以此類推。
統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:
#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
使用printf替代print,可以讓代碼更加簡潔,易讀
awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
print和printf
awk中同時提供了print和printf兩種打印輸出的函數。
其中print函數的參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這里,逗號的作用與輸出文件的分隔符的作用是一樣的,只是后者是空格而已。
printf函數,其用法和c語言中printf基本相似,可以格式化字符串,輸出復雜時,printf更加好用,代碼更易懂。
awk編程
變量和賦值
除了awk的內置變量,awk還可以自定義變量。
下面統計/etc/passwd的賬戶人數
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
user count is 40
count是自定義變量。之前的action{}里都是只有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。
這里沒有初始化count,雖然默認是0,但是妥當的做法還是初始化為0:
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is 0
root:x:0:0:root:/root:/bin/bash
...
[end]user count is 40
統計某個文件夾下的文件占用的字節數
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is 8657198
如果以M為單位顯示:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is 8.25889 M
注意,統計不包括文件夾的子目錄。
條件語句
awk中的條件語句是從C語言中借鑒來的,見如下聲明方式:
復制代碼
if (expression) {
statement;
statement;
... ...
}
if (expression) {
statement;
} else {
statement2;
}
if (expression) {
statement1;
} else if (expression1) {
statement2;
} else {
statement3;
}
統計某個文件夾下的文件占用的字節數,過濾4096大小的文件(一般都是文件夾):
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is 8.22339 M
循環語句
awk中的循環語句同樣借鑒于C語言,支持while、do/while、for、break、continue,這些關鍵字的語義和C語言中的語義完全相同。
數組
因為awk中數組的下標可以是數字和字母,數組的下標通常被稱為關鍵字(key)。值和關鍵字都存儲在內部的一張針對key/value應用hash的表格里。由于hash不是順序存儲,因此在顯示數組內容時會發現,它們并不是按照你預料的順序顯示出來的。數組和變量一樣,都是在使用時自動創建的,awk也同樣會自動判斷其存儲的是數字還是字符串。一般而言,awk中的數組用來從記錄中收集信息,可以用于計算總和、統計單詞以及跟蹤模板被匹配的次數等等。
顯示/etc/passwd的賬戶
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
......
這里使用for循環遍歷數組
linux 引號
1、反引號:`` ,命令替換
2、單引號:'' ,字符串
3、雙引號: "" ,變量替換
管道:前一個命令的輸出,作為后一個命令的輸入
命令1 | 命令2 | 命令3 | ...
練習:
1、統計/usr/bin/目錄下的文件個數;
# ls /usr/bin | wc -l
判斷 /home/goldin目錄是否有文件
2、取出當前系統上所有用戶的shell,要求,每種shell只顯示一次,并且按順序進行顯示;
# cut -d: -f7 /etc/passwd | sort -u
4、取出/etc/inittab文件的第6行;
# head -6 /etc/inittab | tail -1
5、取出/etc/passwd文件中倒數第9個用戶的用戶名和shell,顯示到屏幕上并將其保存至/tmp/users文件中;
# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users
6、顯示/etc目錄下所有以pa開頭的文件,并統計其個數;
# ls -d /etc/pa* | wc -l
用戶管理:
????useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage
組管理:
????groupadd, groupdel, groupmod, gpasswd
權限管理:
????chown, chgrp, chmod, umask
/etc/passwd:
用戶名:密碼:UID:GID:注釋:家目錄:默認SHELL
/etc/group:
組名:密碼:GID:以此組為其附加組的用戶列表
/etc/shadow:
用戶名:密碼:最近一次修改密碼的時間:最短使用期限:最長使用期限:警告時間:非活動時間:過期時間:
用戶管理:
????useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage
useradd [options] USERNAME
????-u UID
????-g GID(基本組)
????-G GID,... (附加組)
????-c "COMMENT"
????-d /path/to/directory
????-s SHELL
????-m -k
????-M
????-r: 添加系統用戶
userdel:
userdel [option] USERNAME
????-r: 同時刪除用戶的家目錄
id:查看用戶的帳號屬性信息
????-u
????-g
????-G
????-n
finger: 查看用戶帳號信息
finger USERNAME
修改用戶帳號屬性:
usermod
????-u UID
????-g GID
????-a -G GID:不使用-a選項,會覆蓋此前的附加組;
????-c
????-d -m:
????-s
????-l
????-L:鎖定帳號
????-U:解鎖帳號
chsh: 修改用戶的默認shell
chfn:修改注釋信息
密碼管理:
passwd [USERNAME]
????--stdin
????-l
????-u
????-d: 刪除用戶密碼
pwck:檢查用戶帳號完整性
組管理:
創建組:groupadd
groupadd
????-g GID
????-r:添加為系統組
groupmod
????-g GID
????-n GRPNAME
groupdel
gpasswd:為組設定密碼
newgrp GRPNAME <--> exit
chage
????-d: 最近一次的修改時間
????-E: 過期時間
????-I:非活動時間
????-m: 最短使用期限
????-M: 最長使用期限
????-W: 警告時間
權限管理:
r:
w:
x:
111 101 101
三類用戶:
u: 屬主
g: 屬組
o: 其它用戶
chown: 改變文件屬主(只有管理員可以使用此命令)
# chown USERNAME file,...
????-R: 修改目錄及其內部文件的屬主
????--reference=/path/to/somefile file,...
chown USERNAME:GRPNAME file,...
chown USERNAME.GRPNAME file,...
# chgrp GRPNAME file,...
????-R
????--reference=/path/to/somefile file,...
chmod: 修改文件的權限
修改三類用戶的權限:
chmod MODE file,...
????-R
????--reference=/path/to/somefile file,...
rwxr-x---
ps -aux
netstat -ntpl
grep
find
yum install lrzsz 上傳文件rz
-linux 安全性
登陸
????等日志查看
????限制某些IP才能ssh登陸
????...
????密碼一個月換一次
????設置密碼:特殊符號,大寫,小寫,1223455,最少8位
防火墻
????規則
????添加規則
????配置文件
軟件安裝和管理
軟件包
1、bin文件.bin
2、rpm包
3、源碼壓縮包
安裝軟件的步驟:
????1、檢查是否已經安裝
???????? rpm -qa | grep jdk
????2、下載軟件包
????3、安裝
????????依賴
rpm 包,已經編譯之后的應用程序。
rpm命令:
1、安裝
rpm -i /PATH/TO/PACKAGE_FILE
????-h: 以#顯示進度;每個#表示2%;
????-v: 顯示詳細過程
????-vv: 更詳細的過程
rpm -ivh /PATH/TO/PACKAGE_FILE
????--nodeps: 忽略依賴關系;
????--replacepkgs: 重新安裝,替換原有安裝;
????--force: 強行安裝,可以實現重裝或降級;
????安裝jdk
????配置環境變量:編輯/etc/profile 或者 ~/.bash_profile
????export JAVA_HOME=/usr/java/jdk1.7.0_71
export PATH=$PATH:$JAVA_HOME/bin
2、查詢
rpm -q PACKAGE_NAME: 查詢指定的包是否已經安裝
rpm -qa : 查詢已經安裝的所有包
rpm -qi PACKAGE_NAME: 查詢指定包的說明信息;
rpm -ql PACKAGE_NAME: 查詢指定包安裝后生成的文件列表;
rpm -qc PACEAGE_NEME:查詢指定包安裝的配置文件;
rpm -qd PACKAGE_NAME: 查詢指定包安裝的幫助文件;
rpm -q --scripts PACKAGE_NAME: 查詢指定包中包含的腳本
rpm -qf /path/to/somefile: 查詢指定的文件是由哪個rpm包安裝生成的;
如果某rpm包尚未安裝,我們需查詢其說明信息、安裝以后會生成的文件;
rpm -qpi /PATH/TO/PACKAGE_FILE
rpm -qpl
3、升級
rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE: 如果裝有老版本的,則升級;否則,則安裝;
rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE:如果裝有老版本的,則升級;否則,退出;
????--oldpackage: 降級
4、卸載
rpm -e PACKAGE_NAME
????--nodeps
5、校驗
????rpm -V PACKAGE_NAME
6、重建數據庫
????rpm
????????--rebuilddb: 重建數據庫,一定會重新建立;
????????--initdb:初始化數據庫,沒有才建立,有就不用建立;
7、檢驗來源合法性,及軟件包完整性;
加密類型:
????對稱:加密解密使用同一個密鑰
????公鑰:一對兒密鑰,公鑰,私鑰;公鑰隱含于私鑰中,可以提取出來,并公開出去;
????單向:
# ls /etc/pki/rpm-gpg/
????RPM-GPG-KEY-redhat-release
rpm -K /PAPT/TO/PACKAGE_FILE
????dsa, gpg: 驗正來源合法性,也即驗正簽名;可以使用--nosignature,略過此項
????sha1, md5: 驗正軟件包完整性;可以使用--nodigest,略過此項
yum: Yellowdog Update Modifier
????yum
apt-get
yum install zsh
yum源配置
[Repo_ID]
name=Description
baseurl=
????ftp://
????http://
????file:///
enabled={1|0}
gpgcheck={1|0}
gpgkey=
yum [options] [command] [package ...]
-y: 自動回答為yes
--nogpgcheck
list: 列表
????支持glob
????all
????available:可用的,倉庫中有但尚未安裝的
????installed: 已經安裝的
????updates: 可用的升級
clean: 清理緩存
????[ packages | headers | metadata | dbcache | all ]
repolist: 顯示repo列表及其簡要信息
????all
????enabled: 默認
????disabled
install: 安裝
yum install PACKAGE_NAME
update: 升級
update_to: 升級為指定版本
remove|erase:卸載
info:
provides| whatprovides: 查看指定的文件或特性是由哪個包安裝生成的;
groupinfo
grouplist
groupinstall
groupremove
groupupdate
手動編譯安裝
源碼安裝步驟:
????1、下載
????2、查看源碼
????3、準備編譯環境
????4、檢查(依賴,兼容),預編譯
????5、編譯
????6、安裝
tar
gcc: GNU C Complier, C
g++:
make
make install
編譯安裝的三步驟:
前提:準備開發環境(編譯環境)
安裝"Development Tools"和"Development Libraries"
yum groupinstall Development Tools Development Libraries
tar -zxvf 壓縮包 ,tar.gz
# tar
# cd
# ./configure
????--help
????--prefix=/path/to/somewhere
????--sysconfdir=/PATH/TO/CONFFILE_PATH
????功能:1、讓用戶選定編譯特性;2、檢查編譯環境;
# make
# make install
# tar xf tengine-1.4.2.tar.gz
# cd tegnine-1.4.2
# ./configure --prefix=/usr/local/tengine --conf-path=/etc/tengine/tengine.conf
# make
# make install
安裝apache
解壓:tar -zxvf httpd-2.4*****.tar.gz
apache 依賴apr,和apr-util
下載安裝apr和apr-util
使用源碼安裝mysql
Shell編程
shell :弱類型、 解釋型語言
解釋器:bash
一、變量
bash的變量類型:
????環境變量
????本地變量(局部變量)
????位置變量
????特殊變量:bash內置的用來保存某些特殊數據的變量。(也叫系統變量)
本地變量:只屬于某一個bash的變量。
????var_name=值
????作用域:整個bash進程
局部變量:
????local var_name =值,????
????作用域:當前代碼段。
環境變量:
????export 名字=值
????作用域:當前的shell和其子shell。
注意:腳本在執行時都會啟動一個子shell進程:
????命令行中啟動的腳本會繼承當前shell環境變量。
????系統自動啟動腳本(非命令行啟動):則需要自我定義環境變量。
位置變量: 用于 腳本執行的參數,$1 表示第一個參數,以此類推
????$1,$2….
特殊變量:
????$? :上一個命令的執行狀態返回值。
????$# 傳遞到腳本的參數個數
$* 傳遞到腳本的參數,與位置變量不同,此選項參數可超過9個
$$ 腳本運行時當前進程的ID號,常用作臨時變量的后綴,如 haison.$$
$! 后臺運行的(&)最后一個進程的ID號
$@ 與$#相同,使用時加引號,并在引號中返回參數個數
$- 上一個命令的最后一個參數
$? 最后命令的退出狀態,0表示沒有錯誤,其他任何值表明有錯誤
程序有兩類返回值:
1、????執行結果
2、????執行狀態,$? : 0:表示正確,1-255:錯誤
輸出重定向:
>覆蓋重定向
>> 追加重定向
2> 錯誤覆蓋重定向
2>>錯誤追加重定向
&> 全部重定向
撤銷變量:
????unset 變量名
查看shell中變量:
set 命令
查看shell中的環境變量
printenv
env
export
引用變量:${變量名},一般可以省略{}
單引號:強引用,不作變量替換
雙引號:弱引用,做變量替換
反引號:``命令替換
二、腳本
腳本:命令的堆砌。
練習:寫一個腳本,完成以下任務。
1、????添加5個用戶,user1,,,,user5
2、????每個用戶的密碼同用戶名,要求:添加密碼完成后不顯示passwd執行結果。
3、????顯示添加成功信息
練習2:寫一個腳本,完成以下任務。
1、????使用一個變量保存一個用戶名
2、????刪除此變量中的用戶,且一并刪除其家目錄
3、????顯示"用戶刪除成功"信息。
條件判斷:
????條件表達式:
1、???? [ expression ]
2、????test expression
????整數比較:
????????-eq : 比如:[ $A –eq $B ]
????????-ne , -gt ,-lt,-ge,-le
命令的邏輯關系:
????在linux 中 命令執行狀態:0 為真,其他為假
????邏輯與: &&
????????第一個條件為假時,第二條件不用再判斷,最終結果已經有;
????????第一個條件為真時,第二條件必須得判斷;
????邏輯或: ||
????邏輯非: !
????命令執行的狀態 的邏輯關系
1、如果用戶user6不存在則添加用戶6
! id user6 && useradd user6
Id user6 || useradd user6
2、如果用戶不存在,添加用戶并顯示添加成功,否則顯示其已存在
3、如果/etc/inittab文件的行數大于50,就顯示好大的文件;
練習:
1、????添加3個用戶user1.user3,并且設置密碼和用戶名相同,如果用戶已經存在,顯示:已存在
2、????添加完成之后計算系統一共有多個用戶。
練習:給定一個用戶,
1、????如果其UID=0,就顯示其為管理員,否則顯示其為普通用戶
備注:
passwd默認是要用終端作為標準輸入,加上--stdin表示可以用任意文件做標準輸入
于是這里用管道作為標準輸入
條件判斷,控制結構:
????If 條件 ;then
語句
????elif 條件 ; then
???? 語句
????else
語句
fi
-a : 邏輯與,并且 : if [ $# -gt 1 –a $# -lt 3 –o $# -eq 2 ] ; then
-o :或者 比如:
練習:判斷命令歷史中歷史命令的總條目大于500,如果大于,則顯示"Some command is done.",否則顯示:"OR"。
練習:給定三個整數,判斷其中的最大值和最小數。并顯示出來
bash -n shell文件 :檢查文件是否有語法錯誤。
bash –x shell 文件 :debug 執行文件
Shell 中如何算術運算
1、????let 算術運算表達式
let C=$A + $B
2、$[算術表達式]
????C = $[$A+$B]
3、$((算術表達式))
????C=$(($A+$B))
3、????expr 算術表達式 ,注意:表達式中各操作數及運算符之間要有空格。而且要使用命令引用
C=`expr $A + $B`
練習:給定一個用戶,獲取其密碼警告期限,然后判斷用戶密碼使用期限是否已經小于警告期限,如果小于,則是顯示"WARN" ,否則顯示密碼還有多少天到期。
提示:date +%s :今天的秒數
Cat /etc/shadow 密碼時間。
exit : 退出腳本
????退出腳本可以指定腳本執行的狀態:exit 0 。
復習:
????測試方法:
????????[ 表達式 ]
[[ 表達式 ]]
????????test 表達式
????INT1=33
????INT2=32
????[ $INT1 -eq $INT2 ]
????[[ $INT1 -eq $INT2 ]]
????test $INT1 -eq $INT2
文件測試: [ ] 需要中括號
-e FILE :測試文件是否存在
-f FILE :測試文件是否為普通文件
-d FILE :測試文件是否為目錄
-r 權限
-w
-x
特殊變量:
$# $@
字符串測試:
== 等號兩端需要空格
!=
-n string : 判斷字符串是否為空
-s string : 判斷字符串是否不空
練習:指定一個用戶名,判斷此用戶的用戶名和它的基本組 組名是否相同.
#!/bin/bash
if ! id $1 &>/dev/null ; then
echo "No such user."
exit 12
fi
if [ $1 == `id –n –g $1` ] ;then
echo "xiangtong"
else
echo "bu xiangtong"
fi
練習: 判斷當前主機的CPU生產商,(其信息保存在/proc/cupinfo文件中)。
如果是:AuthemticAMD ,就顯示其為AMD公司
GenuineIntel ,就顯示其為 Intel公司
否則,就顯示其為非主流公司。
練習:將那些可以登錄的用戶查詢出來,并且將用戶的帳號信息提取出來,后放入/tmp/test.txt文件中,并給定行號。在行首。
循環:進入條件,退出條件
for 變量 in 列表 ; do
語句
done
比如: for I in 1 2 3 4 5 ;do
語句
done、
如何生成列表:
????1、{1..100}
????2、seq [起始數] [跨度數] 結束數
????3、ls /etc 文件列表
練習:依次向/etc/passwd中的每個用戶問好:hello 用戶名,并顯示用戶的shell:
????Hello ,root ,your shell :/bin/bash。
2、????只向默認shell為bash的用戶問好。
While 循環
格式一
while 條件;do
語句
[break]
done
格式二 死循環
while true
do
語句
done
格式三 死循環
while :
do
語句
done
格式四 死循環
while [ 1 ]
do
語句
done
格式五 死循環
while [ 0 ]
do
語句
done
練習:計算100以內所有能被3整除的整數的和
練習:使用echo輸出10個隨機數,并且一行顯示。提示:$RANDOM
練習:傳給腳本一個參數:目錄,輸出該目錄中文件最大的,文件名和文件大小:
比如:1.txt 100KB
ls -l | awk '{print $5,$9}' | sort -nr
2、查看該目錄下是否有大小為0的文件,如果有則刪除。同時顯示刪除信息。
練習:查詢當前192.168.1.x網段內,那些IP被使用了,輸出這些IP到一個文件中。
練習:請根據一個關鍵字,殺掉系統進程中包含此關鍵字的進程。
echo –n $RANDOM
case 語句
case 變量 in
value1)
語句
;;
value2)
語句
;;
*)
語句
;;
esac
[No000014A]linux深入和軟件安裝.7z
Linux "ls -l"文件列表權限詳解
1.使用 ls -l 命令 執行結果如下(/var/log) :
drwxr-x--- 2 root adm 4096 2013-08-07 11:03 apache2
drwxr-xr-x 2 root root 4096 2013-08-07 09:43 apparmor
drwxr-xr-x 2 root root 4096 2013-08-07 09:44 apt
-rw-r----- 1 syslog adm 16802 2013-08-07 14:30 auth.log
-rw-r--r-- 1 root root 642 2013-08-07 11:03 boot.log
drwxr-xr-x 2 root root 4096 2013-08-06 18:34 ConsoleKit
drwxr-xr-x 2 root root 4096 2013-08-07 09:44 cups
-rw-r----- 1 syslog adm 10824 2013-08-07 11:08 daemon.log
drwxr-xr-x 2 root root 4096 2013-08-07 09:45 dbconfig-common
-rw-r----- 1 syslog adm 21582 2013-08-07 11:03 debug
drwxr-xr-x 2 root root 4096 2013-08-07 09:45 dist-upgrade
-rw-r--r-- 1 root adm 59891 2013-08-07 11:03 dmesg
展示結果大體分為七列(部分) :
以第一條記錄為例
第一列 : “drwxr-x---” 表識文件的類型 和文件權限
第二列: “2”是純數字 ,表示 文件鏈接個數
第三列 : “root” 表示文件的所有者
第四列:“adm” 表示為文件的所在群組
第五列:“4096”,表示為文件長度(大小)
第六列:“2013-08-07 11:03”,表示文件最后更新(修改)時間
第七列:“apache2” 表示文件的名稱
詳見下圖:
?
?
2.文件類型和文件權限 ,即為列表第一列內容:(以第一條記錄為例 )
“drwxr-x---” 含義:有兩部分組成 ,一部分是第一列即為“d” ,表示文件類型(目錄或文件夾),另一部分是“rwxr-x---” 表示文件權限,權限有分為三段:即為 “ rwx?”,“??r-x ?”和 “?---? ”分別表示 ,文件所有者的權限,文件所屬組的權限 和其他用戶對文件的權限。
(1)文件類型,大體分為如下幾類 :
d :目錄
- :文件
l :鏈接
s :socket
p :named pipe
b :block device
c :character device
(2)文件權限 :
r :含義為 “可讀”,用數字 4 表示
w:含義為 “可寫”用數字 2 表示
X(小X):含義為“可執行”用數字 1 表示
-:含義為“無權限”用數字0 表示
X (大X):含義為只有目標文件對某些用戶是可執行的或該目標文件是目錄時才追加x 屬性。
s:含義為 在文件執行時把進程的屬主或組ID置為該文件的文件屬主。方式“u+s”設置文件的用 戶ID位,“g+s”設置組ID位。
t :含義為保存程序的文本到交換設備上
3.文件權限的更改 :
使用命令 :chmod? 文件權限 文件名稱 [-R]
命令兩種用法 :
(1)直接給文件賦相應的權限即為 :
chmod a+x auth.log #含義為 給 auth.log 文件賦予所有者可執行權限
(2)使用數字方式代替權限 :
例如 :
chmod 777 auth.log #含義為給auth.log文件賦予任何可讀,可寫,可執行權限
數字含義詳見如下列表:
所有者 ?群組 ?其他 ?三位代表權限的數字
?r w x ??rwx ??rwx ? 實際結果
?4 2 1 ??421 ??421 777
?4 2 1 ? 4 0 1 ?4 0 1 ?705
4.文件所有者的更改 :
命令 chown 用戶名 文件,例如 :
chmod mysql auth.log #含義為 把 文件 auth.log 的所有者更改為 mysql
5.文件所在組的更改
命令 chgrp [-R]??群組名稱? 文件名稱
例如 :
chgrp? -R? mysql? apache2? #含義為 ,把 目錄apache2 的所在組更改為mysql
ubuntu 修改bash命令行提示符
使用命令行的時候有時候輸出較多的話,找上一條輸入的命令都不好找,每條命令之前的分割線不是很明顯,好在可以通過修改家目錄的~/.bashrc文件中的PS1的值來達到修改Bash命令行提示符的顏色的目的,通過修改PS1還可以修改提示的工作目錄的長度。
$ vim ~/.bashrc
在最后一行添加如下的代碼:
PS1='\[\033[0;32m\]<\u@\h \W>\$\[\033[0m\]'
export?PS1
然后通過命令:
$ source .bashrc
使更改立即生效;
效果如下:
?
PS1被用作主要的提示字符串使用:
相關特殊字符
\H:? ? #完整的主機名稱。? ?
\h:? ? #僅取主機的第一個名字,到“.”結束??
\u:? ? #當前用戶的用戶名?
\w:? ? #完整的工作目錄名稱。宿主目錄(如/hom/peter)會以~代替? ?
\W:? ? #利用basename取得工作目錄名稱,所以只會列出最后一個目錄?
\$:? ? #提示字符,如果是root時,提示符為:#,普通用戶則為:
\#:? ? #顯示命令的編號(如30,31...)
\t:? ? 顯示時間為24小時格式,如:HH:MM:SS? ?
\T:? ? #顯示時間為12小時格式? ?
\A:? ? #顯示時間為24小時格式:? HH:MM? ?
\d:? ? #代表日期,格式為weekday month date, 例如:"Tue May 26"?
\v:? ? #bash的版本信息 (如4.3)
轉載于:https://www.cnblogs.com/Chary/p/No000014A.html
總結
以上是生活随笔為你收集整理的[No000014A]Linux简介与shell编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计蒜客 28437.Big brothe
- 下一篇: linux 其他常用命令