當前位置:首頁 » 編程軟體 » 腳本fi

腳本fi

發布時間: 2023-05-19 09:31:24

① Shell腳本編程實戰

做 Java 的肯定都接觸過 linux 系統,那麼很多時候我們在開發的過程中都是把我們項目打成一個jar包,或者是war包的形式,然後通過 Xftp 上傳到我們伺服器的指定目錄,然後運行一端啟動腳本,讓我們的項目變得可以訪問 就像 ./sh service.sh start 然後啟動我們寫好的 sh 的shell腳本。接下來我們就來學習一下關於 Shell 腳本是如何寫出來的。

Shell 腳本是什麼?Shell是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等,也就是說,我們用戶每輸入一條命令,Shell 就會相對應的執行一條命令。當命令或程序語句不在命令行下執行,而是通過一個程序文件來執行時,該程序文件就被稱為Shell腳本。

在我們的 Shell 腳本中,會有各種各樣的內容,賦值,計算,循環等一系列的操作,接下來我們就來看看這個 Shell 腳本怎麼寫吧

1.查看自己當前系統默認的 Shell

echo $SHELL

輸出:/bin/bash

2.查看系統支持的Shell

cat /etc/shells

輸出:

/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash

也就是說,我們的雲伺服器是支持我們在這里給他安排 Shell 腳本的

我們這時候先來安排一下 sh 的文件,創建一個文件夾,然後在其中創建一個 sh 的文件。

mkdir /usr/local/shelltest

touch test.sh

創建完成我們編輯一下內容

vim test.sh

然後我們出來運行一下我們的 Shell 的第一個腳本

bash test.sh

出來的結果是 Hello World Shell

一個及其簡單的腳本出現了,接下我們就分析一波我們寫了點啥?

#!/bin/bash

#! 是一個約定的標記,它告訴系統這個腳本需要什麼解釋器來執行,即使用哪一種 Shell

我們在之前也使用了 echo $SHELL 來查看了自己系統默認的是哪一種 sh 解析器,之前看到的是/bin/bash,所以我們在寫 Shell 腳本的時候,我們在開頭默認的約定中,我們寫了這個是用 /bin/bash 來進行解釋的,

那麼我們如何像之前調用我們的當前目錄中的 Shell 腳本一樣去調用他呢?就像這個樣子的 ./sh service.sh start

1.授權,

我們先不授權試一下看看能通過 ./test.sh 進行調用么

bash: ./test.sh: Permission denied 會提示這個,也就是沒有授權定義,

授權命令:chmod +x test.sh

2.執行 ./test.sh

然後調用就能正常輸出了,就是說,在當前的目錄下執行這個腳本命令。

變數命名實際上很簡單,我們先來試一下

name=yikeji

這時候我們怎麼使用變數呢?實際上只要在前面加上一個符號就可以 $

echo $name

上面的兩種寫法都是可以的,外面的大括弧加和不加區別不大,可以省略,直接就 $name 就可以使用你定義的變數

使用括弧的意義一般在於區別某些變數,比如你寫了一串的內容,可能寫的是 echo $nameismyfriend ,如果連在一起,是不是有點尷尬,這時候就可以使用括弧區別一下, echo ${name}ismyfriend 不使用括弧的時候,他就去找nameismyfriend這個變數了,就無法出來我們要的效果。

unset name

這時候我們就把我們剛才定義的 name=yikeji 這個變數給去掉了,我們可以調用一下我們的變數看是什麼?

echo $name

這是不是就證明我們自己定義的變數已經刪除了

那麼我們需要一個關鍵字,大家肯定能想到是什麼關鍵字 readonly

我們先給name賦值,然後使用 readonly 設置只讀,然後再改變一下試試,

竟然是真的,如果不設置只讀,是不是會重新可以進行賦值,我們測試個年齡,

所以我們就可以肯定,readonly就是設置只讀的關鍵詞,記住了么?

那麼設置只讀的變數可以刪除么?畢竟總有杠精的面試官會提問這個棘手的問題,但是,阿粉試過的所有方式好像都是不行的,阿粉就直接重啟了自己的伺服器,這樣臨時的變數就不存在了!

說真的,Shell腳本的流程式控制制數一般才是yyds,為什麼這么說,因為你在寫大部分的腳本的時候,流程式控制制的地方永遠是最多的,判斷,選擇,等等一系列的函數,當時熟練使用的時候,就發現這東西確實很有意思。

我們先說最簡單的 if else 這也是我們最經常使用的判斷,在寫 Shell 腳本的時候,就不像我們的 Java 中直接寫

Xshell 中的語法就不是這個樣子的, Xshell 語法:

末尾的 fi 就是 if 倒過來拼寫,我們可以寫一個 if 的腳本試一下這個流程能否理解。

這里申明一下,

我們在上面這段腳本中寫就是內容就是,我們給腳本傳入一個值,然後比對這個值和2的大小關系,然後輸出我們指定的內容。

運行後就能看到

$1 表示我們給 Shell 腳本輸入的第一個參數, $0 就是你寫的shell腳本本身的名字,$2 是我們給 Shell 腳本傳的第二個參數

大家在部署某些項目的時候,是不是啟動命令就很簡潔,就是 sh service.sh start 類似這種的,那我們來看看一般這種是怎麼寫的,這就用到了另外一塊的內容,和 if 類似,在 Java 中也有,那就是 Case .

我們先來看看 Case 的語法,

case ... esac 實際上就和 Java 中的 Case 是非常相似的,case 語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令. esac 是一個結束的標志。

光說不練,假把式,我們來搞一下試試寫一個腳本來搞一下。就用我們剛才說的 sh servic.sh start 來進行測試。

我們來看看運行結果

那麼這段 Shell 腳本是什麼意思呢?其實很簡單,匹配我們傳入的第一個字元,和 start 還有 stop 進行比較,如果匹配上之後,輸出命令,最後退出即可。

是不是感覺沒有那麼復雜了呢?

說到流程式控制制,那麼肯定不能不說 for , 畢竟 for 循環在 Java 中那可是重頭戲。

我們先看他的格式

那麼我們有沒有說像是 Java 中那種 for 循環一樣的方式呢?比如說這個 for ((i=1; i<=j; i++))

實際上也是支持這種的,我們來寫一個試試。

執行一下看看

既然有 for 那是不是就有 while 呢?是的,沒錯,確實是有 while ,也是循環的意思,但是寫法有略微不一樣的地方

我們來舉個嘗試列印九九乘法表來看一下

是不是也挺簡單的?

其實 Shell 腳本的編寫一般都是在實際應用中提升,單純的寫測試腳本,也是可以讓自己對知識的掌握比較充分,而我們一般都是寫一些比較簡單的腳本,復雜的不是還有運維么?

② 如何編寫一個shell腳本

新建一個文件shell腳本一般用×.sh作為後綴當然勇氣他的也可以。打開終端輸入touch first.sh 新建一個名為first的shell腳本。
編寫一個簡單的linuxshell腳本
使用vim 編輯first.sh也可以用其他的文本編輯器,推薦使用vim
使用命令 vim first.sh打開,輸入i進入編輯模式。
編寫一個簡單的linuxshell腳本
我們寫入一個簡單的shell腳本,注意第一行的代碼解釋器的指定,這里使用的是/bin/bash/ 解釋器 也可用其他的根據個人情況自己選擇。
腳本解釋:
echo //顯示一串字元並自動換行
read NAME //從屏幕獲取一段字元,並賦予NAME
$NAME //取NAME變數的值
# //只用一個#表示注釋文本
編寫一個簡單的linuxshell腳本
文件寫完後按下esc鍵 退出插入模式,接著輸入:wq 保存文本並退出文本編輯。
編寫一個簡單的linuxshell腳本
輸入sh + 腳本名稱 運行腳本,或給文件可運行許可權 chmod +x 然後輸入./first.sh運行腳本。

③ 如何編寫自己的Linux安全檢查腳本

腳本大致內容: 基本信息統計(IP地址、MAC地址、埠信息、服務信息等)、主機安全檢查(包括等保三級要求主機相關的檢查點)、系統性能統計(暫時未加入分析)、惡意代碼、程序檢查等檢查點。

腳本內容涉及到:

1、查看系統密碼文件修改時間

2、查看是否開啟了ssh服務

3、查看系統SSH遠程訪問設置策略(host.deny拒絕列表)

4、查看shell是否設置超時鎖定策略

5、查看syslog日誌審計服務是否開啟

6、查看syslog日誌是否開啟外發

7、查看passwd文件中有哪些特權用戶

8、查看系統中是否存在空口令賬戶

9、PHP、JSP、perl、Python、HTML、以及linux下可執行文件內容的檢查

裡面列舉了一些常見webshell、提權EXP、以及Python掃描工具、嗅探工具的特徵,如果發現此類相關的文件,則會顯示出來,或者拷貝一份到/tmp/目錄下

例如:能掃描到的linux下提權工具:

一共是172個文件。都可以掃描的到。。。。

其實整個腳本相對起來比較簡單,主要用到的命令為

find / -type

if語句

awk命令

more

egrep

等命令組成。

比如說awk命令,我們用more或cat命令,讀取某個文件內容,然後通過awk進行篩選和輸出,來顯示我們想要看的東西

例如:
more /etc/login.defs | grep -E "PASS_MAX_DAYS" | grep -v "#" |awk -F' ' '{if($2!=90){print "/etc/login.defs裡面的"$1 "設置的是"$2"天,請管理員改成90天。"}}'

從這里我們可以看到,通過more來打開/etc/login.defs文件,並查找關鍵字 「PASS_MAX_DAYS」, 用awk命令,篩選以」為分隔符的內容,用作判斷,如果$2第二個分隔符位置的內容不等於90,則輸出該內容。

同理,任意針對文件內容做篩選的結果,都可以通過這樣的方式去顯示我們想要顯示的內容。

又例如:
echo "查看系統中存在哪些非系統默認用戶"
echo "root:x:「該值大於500為新創建用戶,小於或等於500為系統初始用戶」"
more /etc/passwd |awk -F ":" '{if($3>500){print "/etc/passwd裡面的"$1 "的值為"$3",請管理員確認該賬戶是否正常。"}}'
echo ------------------------------------------------------------------------

if語句相關:
echo --------------------------------------------------------------------------
echo "檢查系統文件完整性2(MD5檢查)"
echo "該項會獲取部分關鍵文件的MD5值並入庫,默認保存在/etc/md5db中"
echo "如果第一次執行,則會提示md5sum: /sbin/portmap: 沒有那個文件或目錄"
echo "第二次重復檢查時,則會對MD5DB中的MD5值進行匹配,來判斷文件是否被更改過"
file="/etc/md5db"
if [ -e "$file" ]; then md5sum -c /etc/md5db 2>&1;
else
md5sum /etc/passwd >>/etc/md5db
md5sum /etc/shadow >>/etc/md5db
md5sum /etc/group >>/etc/md5db
md5sum /usr/bin/passwd >>/etc/md5db
md5sum /sbin/portmap>>/etc/md5db
md5sum /bin/login >>/etc/md5db
md5sum /bin/ls >>/etc/md5db
md5sum /bin/ps >>/etc/md5db
md5sum /usr/bin/top >>/etc/md5db;
fi
echo ----------------------------------------------------------------------

這里呢,對部分敏感文件的MD5值做了下驗證,大致思路是,先檢查 /etc/md5db 是否存在,如果不存在的話,則將所涉及文件的MD5值入庫,並保存到 /etc/md5db文件中,當我們第二次對伺服器進行檢查時,則會對比兩次的MD5值,如果MD5值發生變化,則會進行提醒。

腳本本身沒什麼復雜的東西,我先貼出部分內容,供大家參考下。
#!/bin/bash
echo " (__)"
echo " (oo)"
echo " /------\/ "
echo " / | || "
echo " * /\---/\ "
echo " ~~ ~~ "
echo "...."Are You Ready?"..."
read key
echo "警告:本腳本只是一個檢查的操作,未對伺服器做任何修改,管理員可以根據此報告進行相應的設置。"
echo ---------------------------------------主機安全檢查-----------------------
echo "系統版本"
uname -a
echo --------------------------------------------------------------------------
echo "本機的ip地址是:"
ifconfig | grep --color "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"
echo --------------------------------------------------------------------------
awk -F":" '{if($2!~/^!|^*/){print "("$1")" " 是一個未被鎖定的賬戶,請管理員檢查是否需要鎖定它或者刪除它。"}}' /etc/shadow
echo --------------------------------------------------------------------------
more /etc/login.defs | grep -E "PASS_MAX_DAYS" | grep -v "#" |awk -F' ' '{if($2!=90){print "/etc/login.defs裡面的"$1 "設置的是"$2"天,請管理員改成90天。"}}'
echo --------------------------------------------------------------------------
more /etc/login.defs | grep -E "PASS_MIN_LEN" | grep -v "#" |awk -F' ' '{if($2!=6){print "/etc/login.defs裡面的"$1 "設置的是"$2"個字元,請管理員改成6個字元。"}}'
echo --------------------------------------------------------------------------
more /etc/login.defs | grep -E "PASS_WARN_AGE" | grep -v "#" |awk -F' ' '{if($2!=10){print "/etc/login.defs裡面的"$1 "設置的是"$2"天,請管理員將口令到期警告天數改成10天。"}}'
echo --------------------------------------------------------------------------
grep TMOUT /etc/profile /etc/bashrc > /dev/null|| echo "未設置登錄超時限制,請設置之,設置方法:在/etc/profile或者/etc/bashrc裡面添加TMOUT=600參數"
echo --------------------------------------------------------------------------
if ps -elf |grep xinet |grep -v "grep xinet";then
echo "xinetd 服務正在運行,請檢查是否可以把xinnetd服務關閉"
else
echo "xinetd 服務未開啟"
fi
echo --------------------------------------------------------------------------
echo "查看系統密碼文件修改時間"
ls -ltr /etc/passwd
echo --------------------------------------------------------------------------
echo "查看是否開啟了ssh服務"
if service sshd status | grep -E "listening on|active \(running\)"; then
echo "SSH服務已開啟"
else
echo "SSH服務未開啟"
fi
echo --------------------------------------------------------------------------
echo "查看是否開啟了TELNET服務"
if more /etc/xinetd.d/telnetd 2>&1|grep -E "disable=no"; then
echo "TELNET服務已開啟 "
else
echo "TELNET服務未開啟 "
fi
echo --------------------------------------------------------------------------
echo "查看系統SSH遠程訪問設置策略(host.deny拒絕列表)"
if more /etc/hosts.deny | grep -E "sshd: ";more /etc/hosts.deny | grep -E "sshd"; then
echo "遠程訪問策略已設置 "
else
echo "遠程訪問策略未設置 "
fi
echo --------------------------------------------------------------------------

④ Linux裡面shell裡面fi是什麼意思

shell中的fi表示一個if語句的結尾,例如:
if [ command ];then
符合該條件執行的語句
elif [ command ];then
符合該條件執行的語句
else
符合該條件執行的語句
fi

⑤ Shell 腳本 if 判斷後,怎麼終止當前腳本但不退出 shell

代碼如下:

if list then
do something here
elif list then
do another thing here
else
do something else here
fi

EX1:

復制代碼代碼如下:

#!/bin/sh
SYSTEM=`uname -s` #獲取操作系統類型,我本地是linux
if [ $SYSTEM = "Linux" ] ; then #如果是linux的話列印linux字元串
echo "Linux"
elif [ $SYSTEM = "FreeBSD" ] ; then
echo "FreeBSD"
elif [ $SYSTEM = "Solaris" ] ; then
echo "Solaris"
else
echo "What?"
fi #ifend

基本上和其他腳本語言一樣。沒有太大區別。不過值得注意的是。[]裡面的條件判斷。

⑥ 創建一個script,Linux shell腳本

和C語言類似,在Shell中用if、then、elif、else、fi這幾條命令實現分支控制。這種流程式控制制語句本質上也是由若干條Shell命令組成的,例如先前講過的
if [ -f ~/.bashrc ]; then
~/.bashrc
fi
其實是三條命令,if [ -f ~/.bashrc
]是第一條,then .
~/.bashrc是第二條,fi是第三條。如果兩條命令寫在同一行則需要用;號隔開,一行只寫一條命令就不需要寫;號了,另外,then後面有換行,但這條命令沒寫完,Shell會自動續行,把下一行接在then後面當作一條命令處理。和[命令一樣,要注意命令和各參數之間必須用空格隔開。if命令的參數組成一條子命令,如果該子命令的Exit Status為0(表示真),則執行then後面的子命令,如果Exit Status非0(表示假),則執行elif、else或者fi後面的子命令。if後面的子命令通常是測試命令,但也可以是其它命令。Shell腳本沒有{}括弧,所以用fi表示if語句塊的結束。見下例:
#! /bin/sh
if [ -f /bin/bash ]
then echo "/bin/bash is a file"
else echo "/bin/bash is NOT a file"
fi
if :; then echo "always true"; fi
:是一個特殊的命令,稱為空命令,該命令不做任何事,但Exit Status總是真。此外,也可以執行/bin/true或/bin/false得到真或假的Exit Status。再看一個例子:
#! /bin/sh
echo "Is it morning? Please answer yes or no."
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ]; then
echo "Good afternoon!"
else
echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
exit 1
fi
exit 0
上例中的read命令的作用是等待用戶輸入一行字元串,將該字元串存到一個Shell變數中。
此外,Shell還提供了&&和||語法,和C語言類似,具有Short-circuit特性,很多Shell腳本喜歡寫成這樣:
test "$(whoami)" != 'root' && (echo you are using a non-privileged account; exit 1)

&&相當於「if...then...」,而||相當於「if not...then...」。&&和||用於連接兩個命令,而上面講的-a和-o僅用於在測試表達式中連接兩個測試條件,要注意它們的區別,例如,
test "$VAR" -gt 1 -a "$VAR" -lt 3

和以下寫法是等價的
test "$VAR" -gt 1 && test "$VAR" -lt 3

⑦ shell腳本if then else的問題

問題出在echo("true")或者echo("false")這一句,ftp裡面不支持,你手動執行一下就知道了。

ftp>echo("true")
?Invalidcommand
ftp>help
Commandsmaybeabbreviated.Commandsare:

! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cp image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send

⑧ shell腳本怎麼吧if判斷進行循環

#!/鬧返舉bin/bash
arr=(10 11 30)
for a in ${arr[*]}
do
ouput_s=$((ouput_s+a))
sum=$((sum+1))
done
echo "$ouput_s"
echo "$sum"

輸出液碧:世余
51
3

⑨ Linux裡面shell裡面fi命令作用是什麼

fi 是if語句的固定格式,shell裡面有各種循環,都有固定的格式,個人理解是告訴計算機,這個循環語句到此,類似case循環一esac結尾一樣。

⑩ linux shell 腳本中if語句的用法 在腳本中使用if if[! -w 「$logfile」 ] 為什

if[!-w"$logfile"]
thenecho"notwriteable"
echo"notwriteableagain"
fi

注意空格,shell裡面有的地方必須有空格,有的地方必須沒有空格。[ ]前後都要有空格

熱點內容
率土之濱太守車怎麼配置軍團 發布:2025-07-16 07:14:36 瀏覽:696
k2的演算法 發布:2025-07-16 07:14:35 瀏覽:251
精雕編程員 發布:2025-07-16 07:13:58 瀏覽:268
二級c語言題庫下載 發布:2025-07-16 06:22:19 瀏覽:970
40台光纖監控如何配置 發布:2025-07-16 06:13:00 瀏覽:28
蘭博的腳本是什麼 發布:2025-07-16 06:11:16 瀏覽:715
sql導出存儲過程 發布:2025-07-16 06:10:41 瀏覽:971
c語言txt換行 發布:2025-07-16 06:00:25 瀏覽:280
騰訊視頻如何緩存加快 發布:2025-07-16 05:58:49 瀏覽:719
android頁面跳轉傳值 發布:2025-07-16 05:56:43 瀏覽:39