shell script 3

passwd root 修改密碼

history -c  清除歷史命令

shell  filename.sh 命令解析器執行腳本。修改文件權限 和路徑之後可以直接執行腳本文件名字

chmod +x 

sleep numoftime  睡眠一段時間

ifconfig eth0 獲取網卡的信息

history   # !+編號 可以執行相關命令

service ** start / restart/stop #管理相關的服務

##命令別名

df -th #觀察硬盤情況

alias yourname=dr -th#添加別名

unalias yourname# 取消別名

alias #查看所有的別名

#永遠有效 編輯.bashrc 加上alias 相關命令就可以永久有效了

##輸出重定向

#< 輸入 >輸出

#0 標準輸入;1標準輸出 ; 2 錯誤輸出

ls 1> myfile.log 2>&1 #將錯誤輸出和標準輸出都重定向到 myfile.log 不要更改順序, 因爲文件打開有先後

&> filename #將標準輸出和錯誤輸出全部重定向到文件中filename

#管道操作符

free -m #獲取硬盤容量

free -m | grep -i mem #-i忽略大小寫 將上一個消息的輸出 利用管道輸入到下一條命令中

free -m | grep -i mem | awk  '{print  $1 "\n" $2"\n" $4 "\n"}'# 並且拿出第四個變量

 

##認識權限和用戶管理

#查看文件屬性

ls -l file 

#權限類型

rwx

文件類型   ---    ---   ---    文件所有者  文件所屬組  大小  時間  名字

目錄/文件 用戶 組  其他 

#永固管理

#用戶添加

useradd  #添加用戶

userdel -r  username #刪除用戶 慎用, 會把所有的內容都刪除, home下的相關文件

#查看用戶

id root #id  加上疑問名字,可以查看用戶id 組 id

#!!表示該用戶沒有密碼

passwd username # 給用戶設置密碼

cat  /etc/shadow #存放密碼

#修改用戶的組 

gpasswd -a userid groupname#把用戶加入組

gpasswd  -d  userid groupname #把組內用戶刪除

#權限分配

chmod  :775  // u g o (a)+、-rwx 兩種方式 給文件修改權限 可以修改用戶 組 其他 

#爲了修改其他單個用戶,組不同的權限使用acl,可以把所有需要權限的用戶 加到一個組裏。gpasswd -a userid groupname

 

acl#權限細化

setfacl   -m  u:username:rwx  filename #設置文件權限 不能刪除操作 刪除需要對目錄具有權限

getfacl filename#查看文件權限

setfacl -x u:username:rwx filename  #刪除權限

setfacl -b filename #刪除所有設置acl的權限 #清空文件權限

#修改目錄 權限 纔可以創建和修改文件

setfacl -m u:user:rwx \direction

#如何設置目錄及目錄下的所有文件設置權限

setfacl -m u:userid:rwx -R /mnt/ #-R遞歸的意思

#後期添加目錄文件的權限繼承

setfacl -m d:u:userid:rwx -R /mnt/  #default 

#應用程序

#當發現以下命令自己沒有權限執行時, 使用能夠sudo,輸入密碼獲取超級用戶權限

編輯 sudo 添加如下 

user  localhost=/usr/bin/useradd #需要這個用戶可以執行的命令

user ALL/localhost=NOPASSWD:/usr/bin/passwd #不需要祕密的 分配sudo權限

然後sudo +命令 + 輸入密碼。user就可以執行該命令

腳本執行和編寫

shell 腳本:保存完成特定任務的多條linux命令的可執行文本

#!/bin/sh 命令解析器

 #

命令

修改文件可執行權限

執行方式:

1.bash filename #不需要寫解釋器,不需要修改文件可執行權限

2../filename #需要給腳本設置執行權限,需要寫解釋器

3. filename #直接作爲一個命令,需要添加目錄作爲環境變量

 

#!/bin/bash 
#test 

echo 'disk space'
echo
df -Th
echo
echo 'free space'
free -m
echo
echo 'users:'
for i in 'ls /home'
do 
    id -u $i
done


每週五執行的管理腳本,FTP目錄統計

 

#!/bin/sh

#

date >> /var/log/pubdir.log
ls -lhR /var/ftp/pub >> /var/log/pubdir.log
rm -rf /var/ftp/pub/*

每週五執行

//crond 是linux下用來週期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務 工具,並且會自動啓動crond進程,crond進程每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。

crontab -e 

minute hour day month week command

其中:

minute: 表示分鐘,可以是從0到59之間的任何整數。

hour:表示小時,可以是從0到23之間的任何整數。

day:表示日期,可以是從1到31之間的任何整數。

month:表示月份,可以是從1到12之間的任何整數。

week:表示星期幾,可以是從0到7之間的任何整數,這裏的0或7代表星期日。

command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。

腳本就會定時執行

shell變量類型和運算符

變量的定義和使用

https://blog.csdn.net/u012516571/article/details/88698952 

單引號不能解析變量,所有都是普通字符串

反引號:執行命令,輸出命令返回值

位置變量、預定義變量和運算符

https://blog.csdn.net/u012516571/article/details/88698952 

位置變量:

只有9個。

$n

預定義變量是位置變量的一個補充

#!/bin/bash

sum=0
for i in $*;
do
 sum = $(($sum+$i))
 sleep 1 
done
echo $sum
if[[$? == 0]];then
 echo "上一條命令執行成功"
else
 echo "上一條命令執行錯誤"
fi

echo "當前腳本名字$0"
echo "當前腳本參數$#個"
echo "當前腳本參數是:$*"

數值變量運算

expr 變量1 運算符 變量2 

支持的運算:+ - * / %

expr 4 + 2  #  $((4+2))

 

shell輸入、輸出功能

shell 輸入、輸出功能和字符顏色設置

echo

 -e 打開轉義。若字符串中出現以下字符,則特別加以處理,而不會將它當成一般文字輸出:
           \a 發出警告聲;
           \b 刪除前一個字符;
           \c 最後不加上換行符號;
           \f 換行但光標仍舊停留在原來的位置;
           \n 換行且光標移至行首;
           \r 光標移至行首,但不換行;
           \t 插入tab;
           \v 與\f相同;
           \\ 插入\字符;
           \nnn 插入nnn(八進制)所代表的ASCII字符;
    -E 取消轉義 (默認)
    -help 顯示幫助
    -version 顯示版本信息

echo輸出顏色文本
格式: echo -e "\033[xx;xx;...;xxm" 
其中:-e  開啓轉義
           \033[  八進制033即退出鍵<ESC>的ASCII碼,表示設置文本顏色
           xx;...;xx  xx是選擇編碼,不同的數值代表設置不同項,下面會介紹編碼。編碼的順序沒要求(網上好多的介紹的有誤,認爲背景顏色在前,文字顏色在後)。
           m  表示設置結束

一般的用法是:   echo -e "\033[背景顏色;文字顏色m字符串\033[0m"
意思是:用設置的背景顏色和文字顏色打印字符串,然後再把背景色和文字顏色恢復默認設置,0表示使用默認設置。
 

echo  "\033[44;37m [task]\033[0m"

cat #標記輸出  cat<<a  sdfsdgsdgwetwetwerwewrea  a  #原樣輸出

tee #輸出一份保存一份到一個文件中

more  #只顯示滿屏,

head #頭十行

tail #尾十行

nl #表示行號

shell的條件測試和流程控制

文件測試和整型測試

文件測試

測試文件狀態 0 爲真

d 是否是目錄

e 目錄或文件是否村子

f 是否是文件

r 當前用戶是否可讀

w 當前用戶是否可寫

x 當前用戶是否可執行

L 是否爲連接符文件

#!/bin/bash

#file test 

if [ -d  ./etc ] then
    echo "exist"
else
    echo "no"
    touch /etc
fi
echo $?

整型測試

https://blog.csdn.net/u012516571/article/details/88698952 

#!/bin/bash

age=30

if [ $age -lt 30 ]
then 
    echo "-lt 30"
elif [ $age -eq 29 ]
then
    echo "-eq 29 "
elif [ $age -lt 29 ] 
then
    echo " -lt 29"
elif [ $age -ge 30 ] 
then
    echo "-ge 30"
fi

 

字符串測試和邏輯測試

字符串測試

=:字符串內容相同

!=:字符串內容不同

-z:字符串不爲空

#!/bin/bash

read -p "name:" nmae 
read -p "pass:" pass

if [ $name = 'admin'] && [ $pass  ='123' ]
then 
    echo "log in"
else
    echo "log in failiur"
fi

邏輯測試

-a 或者 &&:與  前面爲0後面不執行 

-o 或者||:或 前面爲1後面不執行

!:非

放在表達式之間 [] 操作符 [] 操作符 []

 

流程判斷

if 分支判斷

#!/bin/bash

age=24

if [ $age -lt 18 ]
then
    echo "未成年"
else
    echo "已成年"
fi

#60-70-80-90
score=87 

if [ $score -lt 60 ]
then
    echo " -lt 60 "
elif [ $score -ge 60 ] && [ $score -lt 70 ];then #練習用
    echo " 60 -70"
elif [ $score -ge 70 ] && [ $score -lt 80 ];then
    echo " 70 - 80"
elif [ $score -ge 80 ] && [ $score -lt 90 ];then
    echo " 80 - 90"
else 
    echo "90"
fi

case

#!/bin/bash

#case

week=$(date +%w)

case $week in
1)
    echo "monday"
;;
2)
    echo "tuseday"
;;
3)
    echo "wenseday"
;;
4)
    echo "thurseday"
;;
5)
    echo "friday"
;;
6)
    echo "saturday"
;;
7)
    echo "sunday"
;;
*)
    echo "others"
esac
#!/bin/bash

#case

week=$(date +%w)

case $week in
[1-5])
    echo "work day"
;;
[6-7])
    echo "holiday"
;;
*)
    echo "others"
esac

循環控制

for

#! /bin/bash
#for


for i in $(seq 1 9)
do
    echo "$i"
done

for i in user0 user1 user2 user3
do
    echo "$i"
    userdel -r $i
done


for i in ${cat user.txt} #`cat user.txt`
do
    echo "$i"
    useradd $i
    echo 123|passwd --stdin $i
done


for i in ${cat /etc/passwd|awk -F: 'print $1'}
do
    echo $i
    echo $i >> user.txt
done


for ((i=0;i<10;i++))
do 
    echo "$i"
done

while

#! /bin/bash

#while


sum=3
total=0

while [ $sum -ge 0 ]
do 
    total=$(($total+$sum))
    sum=$(($sum-1))
done
echo "$total"

grep  "/bin/bash" /etc/passwd | cut -d ":" -f 1 

cat /etc/passwd | gawk -F: '{print $1}'

循環把控和函數使用

循環把控

#! /bin/bash

#for
for((i=0;i<10;i++))
do
    
    sleep 1
    if [ $i -eq 5 ];then
        break
    elif [ $i -eq 4 ];then
        echo "it's 4"
		continue
    fi
    echo $i
done

shift :從左邊開始刪除一個參數,參數左移,每次都可以選擇$1 就可以了

函數使用

#!/bin/bash

function add(){
    echo "this is a function"
    num=$1
    total=0
    for((i=1;i<$num;i++))
    do
       total=$(($total+$i))
    done
    echo $total
}

add 1
add 10
add 100

 

shell文本操作

find

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

參數說明 :

find 根據下列規則判斷 path 和 expression,在命令列上第一個 - ( ) , ! 之前的部份爲 path,之後的是 expression。如果 path 是空字串則使用目前路徑,如果 expression 是空字串則使用 -print 爲預設 expression。

expression 中可使用的選項有二三十個之多,在此只介紹最常用的部份。

-mount, -xdev : 只檢查和指定目錄在同一個文件系統下的文件,避免列出其它文件系統中的文件

-amin n : 在過去 n 分鐘內被讀取過

-anewer file : 比文件 file 更晚被讀取過的文件

-atime n : 在過去n天內被讀取過的文件

-cmin n : 在過去 n 分鐘內被修改過

-cnewer file :比文件 file 更新的文件

-ctime n : 在過去n天內被修改過的文件

-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名稱是 name

-ipath p, -path p : 路徑名稱符合 p 的文件,ipath 會忽略大小寫

-name name, -iname name : 文件名稱符合 name 的文件。iname 會忽略大小寫

-size n : 文件大小 是 n 單位,b 代表 512 位元組的區塊,c 表示字元數,k 表示 kilo bytes,w 是二個位元組。-type c : 文件類型是 c 的文件。

d: 目錄

c: 字型裝置文件

b: 區塊裝置文件

p: 具名貯列

f: 一般文件

l: 符號連結

s: socket

-pid n : process id 是 n 的文件

你可以使用 ( ) 將運算式分隔,並使用下列運算。

exp1 -and exp2

! expr

-not expr

exp1 -or exp2

exp1, exp2

將目前目錄及其子目錄下所有延伸檔名是 c 的文件列出來。

# find . -name "*.c"

將目前目錄其其下子目錄中所有一般文件列出

# find . -type f

將目前目錄及其子目錄下所有最近 20 天內更新過的文件列出

# find . -ctime -20

查找/var/log目錄中更改時間在7日以前的普通文件,並在刪除之前詢問它們:

# find /var/log -type f -mtime +7 -ok rm {} \;

查找前目錄中文件屬主具有讀、寫權限,並且文件所屬組的用戶和其他用戶具有讀權限的文件:

# find . -type f -perm 644 -exec ls -l {} \;

爲了查找系統中所有文件長度爲0的普通文件,並列出它們的完整路徑:

# find / -type f -size 0 -exec ls -l {} \;

例子

find. -nmae "[a-z]*"
#查找字母開頭的文件
find . -perm 777
#查找777 權限的文件
find . -user root
#查找屬於root的文件
find . -perm 777 -type f -name filename
查找可執行的filename文件
find . -mtime +5//-3
時間前/內更改的文件
find . -size  +1000000c
大小大於多少的文件
fine . -nmae "*user" | xargs rm -rf 
找到並刪除,傳遞參數 首先在命令行中查找要處理的內容的來源,如果在命令行中找不到與要處理的內容的來源相關的參數則默認從標準輸入中讀取要處理的內容了。


Linux正則表達式詳解

grep -c "file" a 

在文件中有多少行匹配到a

grep -n “file” a

在a文件中有多少行匹配到,同時顯示行和行號

grep -i "file“ a

在a文件中查找file,並不區分大小寫

grep -v "file" a

在a文件中過濾掉file所在的行

grep -E "2004:22:5[0-9]" a  #-E就是使用正則表達式的意思

在a 文件中查找2004:22:5[0-9]所在的行

grep -E "[5-8][6-9][0-3]" a

查找大於560 小於893的行

grep -E  "^linux"  filename

查找 Linux開頭的行

grep -E  "linux$"  filename

查找 Linux結尾的行

grep -E  ".*"  filename

匹配任意多個字符.任意字符, *任意多個

grep -E  ".*linux.*" filename#包含開頭和結尾

grep -E  ".+inux.+" filename #沒有開頭和結尾

.任意一個字符 +多個字符不存在0個    *任意多個

[0-9]任意一個0-9之間的數

(linux)+匹配多次Linux #()這是一個單元

(web){2}至少連續兩個web #{}匹配幾次

(web){2.4}$ 以2-4個web 結尾

\屏蔽元字符的含義,用於查詢* + $

-v 去反

grep -En  "^$" filename

開頭和結尾都是空,就是查找空行

grep -En  "^.$" filename

只含有一個字符的行

grep -En "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ #[0-9] 等價於 /d

grep -En "[0-9]{3}+\.[0-9]+\.[0-9]+\.[0-9]" temp

grep -En "/d{3}+\.[0-9]+\.[0-9]+\.[0-9]" temp

grep -Pn "\d{1,3}" temp 匹配一直三個數字。

-P -E 和  不加  使用不同的正則表達式, 基本的 擴展的 Perl的

匹配帶有IP的的行,\屏蔽元字符的含義

grep -En "\*" filename

查找含有* 的行

整理一個元字符

\ 取消元字符作用

^開頭匹配 中括號裏取反的意思

$結尾匹配

*匹配0次或多次

+匹配至少一次

?匹配0次或1次

{n} 匹配n次

{n,m}匹配n-m次

x|y 匹配x或者y

[xyz]匹配xyz中的任意一個

[^a-z]集合意外的匹配任意一個

\W

[a-z]匹配a-z的任意一個

\w 等價上一

[0-9]

\d

[^0-9]

\D

aaaa\b 匹配 aaaa結尾的單詞

\B 與上取反

\t 製表符

\r 回車符

\v 垂直製表符

\n 換行符

\f 換頁符

\xn 匹配16進制n 的ASC字符  #\x41  A
 

AWK專輯

 

cat temp |awk -F: '{print $1 "=" $2}' filename #以:號作爲分隔符拿出第一列並加上一些字符 拿出第二列

-F 分割符。默認爲空格 可以省略

cat temp |awk -F: '{if(NR==3){print $0}}'  打印第三行的 整行

df |awk  '{if(NR==3){print $1 }}'

df |awk  'END{print NR “ ”NF}' 打印總共有多少行數據 多少列

 df |awk  '{print $1 "\t" $2}' 打印第一列和第二列

cat file | awk '$0 !~/string/’  #$0每一列 擁有string

cat temp| awk '$1~/192.123.345.56/{print $0}' 打印擁有192.123.345.56的每一列

sed工具

Linux sed命令是利用script來處理文本文件。

sed可依照script的指令,來處理、編輯文本文件。

Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。

sed [-hnV][-e<script>][-f<script文件>][文本文件]

參數說明

  • -e<script>或--expression=<script> 以選項中指定的script來處理輸入的文本文件。
  • -f<script文件>或--file=<script文件> 以選項中指定的script文件來處理輸入的文本文件。
  • -h或--help 顯示幫助。
  • -n或--quiet或--silent 僅顯示script處理後的結果。
  • -V或--version 顯示版本信息。
  • 動作說明

  • a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
  • c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
  • d :刪除,因爲是刪除啊,所以 d 後面通常不接任何咚咚;
  • i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
  • p :打印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
  • s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

實例

$ sed -e 4a\newline testfile #使用sed 在第四行後添加新字符串 
[root@www ~]# nl /etc/passwd | sed '2,5d'
#sed 的動作爲 '2,5d' ,那個 d 就是刪除!因爲 2-5 行給他刪除了,所以顯示的數據就沒有 2-5 行羅~ 
#另外,注意一下,原本應該是要下達 sed -e 纔對,沒有 -e 也行啦!同時也要注意的是, sed 後面接的動
#作,請務必以 '' 兩個單引號括住喔! 
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
#在第二行後(亦即是加在第三行)加上『drink tea?』字樣!
nl /etc/passwd | sed '2i drink tea'  #那如果是要在第二行前
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number' #將第2-5行的內容取代成爲『No 2-5 number』呢?
[root@www ~]# nl /etc/passwd | sed -n '5,7p' #可以透過這個 sed 的以行爲單位的顯示功能, 就能夠將某一個文件內的某些行號選擇出來顯示。 
nl /etc/passwd | sed  '/root/d' #刪除/etc/passwd所有包含root的行,其他行輸出
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}' #搜索/etc/passwd,找到root對應的行,執行後面花括號中的一組命令,每個命令之間用分號分隔,這裏把bash替換爲blueshell,再輸出這行:q退出
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' #sed 's/要被取代的字串/新的字串/g'
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/' #刪除/etc/passwd第三行到末尾的數據,並把bash替換爲blueshell
sed -i '$a # This is a test' regular_express.txt#sed 的 -i 選項可以直接修改文件內容,這功能非常有幫助!$表示最後一行

nl 可以將輸出的文件內容自動的加上行號!其默認的結果與 cat -n 有點不太一樣, nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能。  

sort排序

Linux sort命令用於將文本文件內容加以排序。

sort可針對文本文件的內容,以行爲單位來排序。

sort [-bcdfimMnr][-o<輸出文件>][-t<分隔字符>][+<起始欄位>-<結束欄位>][--help][--verison][文件]

參數說明

  • -b 忽略每行前面開始出的空格字符。
  • -c 檢查文件是否已經按照順序排序。
  • -d 排序時,處理英文字母、數字及空格字符外,忽略其他的字符。
  • -f 排序時,將小寫字母視爲大寫字母。
  • -i 排序時,除了040至176之間的ASCII字符外,忽略其他的字符。
  • -m 將幾個排序好的文件進行合併。
  • -M 將前面3個字母依照月份的縮寫進行排序。
  • -n 依照數值的大小排序。
  • -o<輸出文件> 將排序後的結果存入指定的文件。
  • -r 以相反的順序來排序。
  • -t<分隔字符> 指定排序時所用的欄位分隔字符。
  • +<起始欄位>-<結束欄位> 以指定的欄位來排序,範圍由起始欄位到結束欄位的前一欄位。
  • --help 顯示幫助。
  • --version 顯示版本信息。

實例

sort -k1 #根據第一列來排序 ,分列 默認爲空格爲分隔符

 

 

uniq統計

Linux uniq 命令用於檢查及刪除文本文件中重複出現的行列,一般與 sort 命令結合使用。

uniq 可檢查文本文件中重複出現的行列。

uniq [-cdu][-f<欄位>][-s<字符位置>][-w<字符位置>][--help][--version][輸入文件][輸出文件]

參數

  • -c或--count 在每列旁邊顯示該行重複出現的次數。
  • -d或--repeated 僅顯示重複出現的行列。
  • -f<欄位>或--skip-fields=<欄位> 忽略比較指定的欄位。
  • -s<字符位置>或--skip-chars=<字符位置> 忽略比較指定的字符。
  • -u或--unique 僅顯示出一次的行列。
  • -w<字符位置>或--check-chars=<字符位置> 指定要比較的字符。
  • --help 顯示幫助。
  • --version 顯示版本信息。
  • [輸入文件] 指定已排序好的文本文件。如果不指定此項,則從標準讀取數據;
  • [輸出文件] 指定輸出的文件。如果不指定此選項,則將內容顯示到標準輸出設備(顯示終端)。

實例

uniq -c testfile  #檢查文件並刪除文件中重複出現的行,並在行首顯示該行重複出現的次數。當重複的行並不相鄰時,uniq 命令是不起作用的,即若文件內容爲以下時,uniq 命令不起作用:這時我們就可以使用 sort:

$ sort  testfile1 | uniq

$ sort  testfile1 | uniq -c # 累計重複的次數,顯示在最前面

split文件分割

Linux split命令用於將一個文件分割成數個。

該指令將大文件分割成較小的文件,在默認情況下將按照每1000行切割成一個小文件。

語法

split [--help][--version][-<行數>][-b <字節>][-C <字節>][-l <行數>][要切割的文件][輸出文件名]

參數說明

  • -<行數> : 指定每多少行切成一個小文件
  • -b<字節> : 指定每多少字節切成一個小文件
  • --help : 在線幫助
  • --version : 顯示版本信息
  • -C<字節> : 與參數"-b"相似,但是在切 割時將盡量維持每行的完整性
  • [輸出文件名] : 設置切割後文件的前置文件名, split會自動在前置文件名後再加上編號

實例

$ split -6 README       #將README文件每六行分割成一個文件 
#獲得當前目錄結構  以上命令執行後,指令"split"會將原來的大文件"README"切割成多個以"x"開頭的小文件。而在這些小文件中,每個文件都只有6行內容。
$ ls                                #執行ls指令  
README xaa xad xag xab xae xah xac xaf xai   

$ split -6 a** README   #新生成的文件用a**爲開頭分別加上aa  ab ac .....

 

linux 啓動流程和服務腳本

liunux 啓動流程

一、初始化階段

1.bios找到磁盤上的MBR主引導扇區

2.進入grub界面選擇相應的啓動內核

3.讀取kernel內核文件-/boot/vmlinuz-*

4.讀取init的鏡像文件-/boot/initrd-*

5.init去讀取/etc/inittab #第一個進程。inittab配置需要啓動的進程

6.讀取啓動級別(id:3:default)// 0/1/2/3/4/5/6   6 重啓

二、加載/etc/rc.d/rc.sysinit系統初始化腳本

7.讀取/etc/rc.d/rc.sysinit,完成時鐘設置,主機名的設置,分區表的掛在(/etc/fstab)設置防火牆,檢測硬件變化,啓動網絡服務//初始腳本,設置磁盤陣列

三、加載/etc/rc.d/rc進程管理腳本

rc3.d 配置了需要啓動的進程和關閉的文件。3 默認啓動級別 。許多的軟鏈接,實際目錄基本都在../init.d/目錄下。所有的可控制的腳本和進程

rc3.d 怎麼維護的???

8.讀取/etc/rc.d/rc腳本,通過該腳本吸收3級別,然後啓動/etc/rc.d/rc.3.d下所有以S開頭的服務,不啓動該目錄下以K開頭的服務

9.讀取/etc/rd.d/rc.loacl腳本

10.啓動登錄界面

rc3.d 怎麼維護的???

chkconfig --level 3  servicename on #配置某個服務默認開啓 off默認關閉

chkconfig --list  servicename #查看在所有啓動級別下,該服務的啓動配置

1.服務腳本

/usr/local/apache2/bin/apachectl

2.開啓

/usr/local/apche2/bin/apachectl start|stop|restart

3.開機啓動

vi /etc/rc.d/rc.loacl

/usr/local/apch2/bin/apachectl start

 

如何自己寫一個腳本。並且可以調配K/S

自定義腳本

把服務腳本改選成標準RPM腳本

通過service把自己定義的腳本進行開啓和關閉

通過checkconfig把自定義腳本設置開機啓動

 

#!/bin/bash

#服務腳本



case $1 in
    start)
        echo "mytest starting"
        sleep 1
        ;;
    stop)
        echo "mytest stoping"
        sleep 1
        ;;
    restart)
        echo "mytest restarting"
        sleep 1 
        ;;
    *)
        echo "please input start;stop;restart!!!
        ;;
esac

 

chmod  +x mytest

./mytest start/stop/restart

vi /etc/rc.local

add :/mnt/mytest start //重啓就可以自動啓動了

改造標準rpm 腳本

cp mytest  /etc/rc.d/init.d

checkconfig --list mytest

//就可以service mytest start 啓動了

在mytest 裏面添加

#chkconfig: 2345 90 20 //啓動級別和開啓關閉先後關係
#description:mytest server daemon

checkconfig  mytest on

checkconfig --list mytest //就可以查看到配置的各個啓動級別下的on or off

 

shell編寫字符菜單管理

#/bin/bash
#menu.sh
#my character menu.sh
function menu(){#make as a function
    title="menu"
    url="www.myweb.com
    time='date +%Y-%m-%d'
    cat << eof #輸出直到文件末尾
    ###############################################
        ‘echo -e "\033[32;40m$title\033[0m"' 
    ###############################################
    * 1)add a user
    * 2)set password for user
    * 3)delete a user
    * 4)print disk space
    * 5)print men space
    * 6)quit
    * 7)return main menu
    ###############################################
    $url                     $time
    ###############################################
eof
}
#!/bin/bash
#index.sh


. menu.sh #包含文件的意思
clear
menu

while true
do
    read -p "please input a option:" option
    echo $option
    
    case $option in
        1)
            read -p "input the user:" name
            useradd $name &>/dev/null
            if[$? eq 0] ;then
                str="user ${name} is creadted successfully!!!"
                echo -e "\033[30;47m $str\033[0m"
            else
                str="user ${name}  is created failed!!!"
                echo -e "\033[31;47m $str\033[0m"
            fi
            ;;
        2)
            read -p "input the user:" name
            read -p "set password for the user:" pass
            echo $name| passwd --stdin $name &>/dev/null 
            if[$? eq 0] ;then
                str="${name}'s password is set successfully!!!"
                echo -e "\033[30;47m $str\033[0m"
            else
                str="${name}'s password is set successfully!!!"
                echo -e "\033[31;47m $str\033[0m"
            fi
            ;;
        3)
            read -p "delete the user:" name
            userdel -r $name &>/dev/null
            if[$? eq 0] ;then
                str="user ${name} is deleted successfully!!!"
                echo -e "\033[30;47m $str\033[0m"
            else
                str="user ${name}  is deleted failed!!!"
                echo -e "\033[31;47m $str\033[0m"
            fi
            ;;
        4)
            str='free -m'
            echo -e "\033[30;47m $str\033[0m"
            ;;
        5)
            str='df -Th'
            echo -e "\033[30;47m $str\033[0m"
            ;;
        6)
            echo -e "\033[30;47m quit successfully!!!\033[0m"
            break
            ;;
        7)
            clear
            menu
            ;;
    esac
    done

 

shell編寫郵件報警腳本

郵件服務器安裝

////////

touch web.sh mysql.sh disk.sh mem.sh

chmod a+x *

# nc 命令 瞭解。 加 ip + port 可互相發送消息

nc -w  localhost port #通信探測命令

#/bin/bash 

#web.sh

nc -w 3 localhost 80

if [$? -eq 0];then
    str="apache's status  is on"
else 
    str="apache's status is off"
fi
echo $str|mail -s 'apache web server' [email protected]
#/bin/bash 

#mysql.sh

nc -w 3 localhost 330 &>/dev/null

if [$? -eq 0];then
    str="mysql's status  is on"
else 
    str="mysql's status is off"
fi
echo $str|mail -s 'mysql server' [email protected]
#/bin/bash 

#disk.sh

ds='df |awk '{if(NR==3){print int($4)}}''

if [$ds -lt 45];then
    str="disk's status  is normal,ds is $ds"
else 
    str="disk's status is abnormal,ds is $ds"
fi
echo $str|mail -s 'disk spce' [email protected]
#/bin/bash 

#mem.sh

use='free -m |awk '{if(NR==2){print int($3)}}'' #計算內存使用率 第二行第三列除以第二列
tot='free -m |awk '{if(NR==2){print int($2)}}'' 
per=$use*100/$tot #不能保存小數

if [$per -lt 90];then
    str="mem's status  is normal,mem is $per"
else 
    str="mem's status is abnormal,mem is $per"
fi
echo $str|mail -s 'mem spce' [email protected]

整合成一個monitor.sh 定時執行

crontab  -e  # 07 00 * * * /mnt/monitor.sh

crontab -l # 可以查看配置任務

 

shell信號捕捉和日誌處理

日誌文件

logger生成系統日誌

信號類型

trap信號捕捉

以時間爲標誌的日誌文件

以進程號爲標誌的臨時文件

 

yum install -y apache

locate http#找位置

cd /var/log #有apache 日誌

創建一個時間日誌

#!/bin/bash
#createlog

today=`date '+%Y-%m-%d'`

filelog="${today}.log"

if [ ! -e  $filelog ]
then
	touch $filelog 
fi

echo "`date '+%Y-%m-%d %T'` log input start" >> $filelog
sleep 5

echo "`date '+%Y-%m-%d %T'` log input end" >> $filelog

echo "filelog record end!"

系統日誌

/var/log/message

logger 向系統日誌發送日誌

以進程號爲名稱的日誌

#!/bin/bash
#processlog.sh
#獲取到http的進程號
#把進程號存入臨時文件中
#取出所有進程號
#for 殺死所有進程
#刪除之前生成的臨時文件
#輸出關閉進程後的消息

tmpfile=$$.txt #當前進程號命名,進程關閉就刪除了臨時文件
ps -e|grep httpd|awk '{print $1}' >>$tmpfile

for pid in `cat  $tmpfile`
do
    echo "apache ${pid} is killed!!!"
    kill -9 $pid
    sleep 1

done

rm -rf $tmpfile
echo "apache is killed successfully"

信號捕捉

kill -l  |wc -l #64種的信號

1 掛起進程/SIGHUP

2 中斷  ctl+c /SIGINT

3從鍵盤退出 ctrl +\ /SIGQUIT

9 無條件終止 /SIGKILL

kill -1 process_pid //傳遞信號給進程

trap 信號捕捉命令

#!/bin/bash
#trap.sh

#不採取任何行動
#捕捉信號,忽略
#捕捉信號,採取行動

#trap function signal 函數,信號
trap 'myfunc' 2



function myfunc()
{
    echo "deal with signal"
}

i=0
while :
do
    let i++
    echo $i
    sleep 1
done

#!/bin/bash
#trap.sh

#不採取任何行動
#捕捉信號,忽略
#捕捉信號,採取行動

#trap function signal 函數,信號
trap 'myfunc' 2



function myfunc()
{
    echo "deal with signal"
    read -p "if you want to kill the process?y or n" flag
    case $flag in
        'y')
            exit;
            ;;
        'n')
            ;;
        *)
            myfunc
            ;;
    esac
}           


i=0
while :
do
    let i++
    echo $i
    sleep 1
done

 

shell怎麼操作MYSQL數據庫

登錄MySQL服務器

Mysql -uroot -p123

查看數據庫

show databases

查看錶

show tables from db

查看錶結構

desc table

shell 腳本如何操作MySQL

#!/shell/bash
#mysql.sh

mysql="/user/local/mysql/bin/mysql -uroot -p123"
sql_show_db="show databases"


sql_create_db="create table test.user(
id int unsigned auto_increment primary key,
username varchar(50},
password varchar(50)
)"
sql_show_tab_db="show tables from test"
sql_show_desc_tab="desc user"
sql_select_tab="select * from user"

sql_insert_tab="insert into test.user(username,password) value('user1','123')"
sql_update_tab="update test.user set password='123' where id=5"
sql_delete_tab="delete from test.user where id=5"
sql_drop_tab="drop test.user"
sql_drop_db="drop database test"

$mysql -e "$sql"

實例2 優化

#!/bash/bin
#mysql.sh
conn="/user/local/mysql/bin/mysql -uroot -p123"

case $1 in
    select)
        sql="select * from test.user order by id"
        ;;
    delete)
        sql="delete from test.user where id=$2"
        ;;
    insert)
        sql="insert into test.user(username,password) value('$2','$3')"
        ;;
    update)
        sql="update test.user set username='$3',password='$4' where id=$2"\
        ;;
    *)
        sql="select * from test.user order by id"
        ;;
esac
$conn -e "$sql"

apache 日誌分割

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章