BASH 腳本的 $ 參數
- $$ #shell 本身 PID
- $! #shell 最後執行的後臺PID
- $? #shell 結束代碼
- $* #參數列表 "$1 $2 ... $n"
- $@ #參數列表 "$1" "$2" ... "$n"
- $# #參數個數
- $0 #shell 腳本名
- $1...$n #shell 位置參數
BASH 字符串處理
#字符串 str 長度
${#str}
expr length "$str"
#子串 substr 出現位置,找不到返回 0
expr index "$str" "$substr"
#子串 substr 開頭匹配,找不到返回 0
expr match "$str" "$substr"
#字符串 str 抽取左起位置 pos 後 長度 len 的子串
${str:$pos}
${str:$pos:$len}
expr substr "$str" $pos $len
#字符串 str 抽取右起位置 pos 前的子串
${str: -pos}
${str:(pos)}
#正則 pat 抽取字符串 str 開頭子串
expr match "$str" "\($pat\)"
expr "$str" : "\($pat\)"
#正則 pat 抽取字符串 str 結尾子串
expr match "$str" ".*\($pat\)"
expr "$str" : ".*\($pat\)"
#刪除字符串 str 開頭的最短子串 sub
${str#$sub}
#刪除字符串 str 開頭的最長子串 sub
${str##$sub}
#刪除字符串 str 結尾的最短子串 sub
${str%$sub}
#刪除字符串 str 結尾的最長子串 sub
${str%%$sub}
#替換字符串 str 第一個子串 sub 爲字符串 rep
${str/"$sub"/"$rep"}
#替換字符串 str 所有子串 sub 爲字符串 rep
${str//"$sub"/"$rep"}
#替換字符串 str 開頭的子串 sub 爲字符串 rep
${str/#"$sub"/"$rep"}
#替換字符串 str 結尾的子串 sub 爲字符串 rep
${str/%"$sub"/"$rep"}
#var爲空或沒有設置,代入word,否則代入var值
${var:-word}
#如果var已經被設置且不爲空,則代入它的值,否則代入word,並且在後面var始終爲word的值。位置參量不能用這種方式賦值。
${variable:=word}
#如果變量var已被設置且值爲非空,代入word值,否則什麼也不代入
${variable:+word}
#如果變量var已被設置值且爲非空,就代入它的值,否則輸出word並從shell中退出,如果有省略了word,就會顯示信息:parameter null or not set.
${var:?word}
BASH 數組
#定義數組
array=()
#打印數組第一個元素
echo ${array[0]}
#打印數組所有元素
echo ${array[@]}
#打印數組所有索引
echo ${!array[@]}
#移除數組中索引爲2的元素
unset array[2]
#添加id爲3的元素
array[3]=""
終端環境變量 PS1 參數
- \d 日期,格式爲weekday month date,例如:"Mon Aug 1"
- \H 完整的主機名稱
- \h 僅取主機的第一個名字
- \t 顯示時間爲24小時格式,如 HH:MM:SS
- \T 顯示時間爲12小時格式
- \A 顯示時間爲24小時格式 HH:MM
- \u 當前用戶的賬號名稱
- \v BASH的版本信息
- \w 完整的工作目錄名稱
- \W 利用basename取得工作目錄名稱,所以只會列出最後一個目錄
- # 下達的第幾個命令
- $ 提示字符,root 下提示符是 #,普通用戶是 $
- \[\e[i;j;km\] \[\e[0m\] 建議PS1使用這種顏色控制字符
終端顏色 \033[F;Bm 控制編碼
- F30 B40 黑色
- F31 B41 紅色
- F32 B42 綠色
- F33 B43 黃色
- F34 B44 藍色
- F35 B45 紫紅色
- F36 B46 青藍色
- F37 B47 白色
終端光標位置
- \033[K 清除從光標到行尾的內容
- \033[s 保存光標位置
- \033[u 恢復光標位置
- \033[0m 關閉所有屬性
- \033[1m 設置高亮度
- \033[4m 下劃線
- \033[5m 閃爍
- \033[7m 反顯
- \033[8m 消隱
- \033[nA 光標上移n行
- \033[nB 光標下移n行
- \033[nC 光標右移n行
- \033[nD 光標左移n行
- \033[2J 清屏
- \033[?25l 隱藏光標
- \033[?25h 顯示光標
- \033[y;xH 設置光標位置
解析迅雷鏈接
expect 自動輸入密碼
expect<-END
spawn ssh $DEST_HOST "REMOTE_COMMAND"
expect {
"*yes/no*" { send "yes\r"; exp_continue }
"*assword*" { send "password\r" }
}
expect eof
END
普通用戶(username)免密 sudo
echo "username ALL = (root) NOPASSWD:ALL" >> /etc/sudoers
或者
echo "cephdeploy ALL = (root) NOPASSWD:ALL" > /etc/sudoers.d/username
chmod 0400 /etc/sudoers.d/username
用戶登陸操作記錄
- 創建日誌共存目錄
mkdir /var/log/user_history -p
chmod 0777 /var/log/user_history -R
- 配置 history 歷史文件 /etc/profile.d/history.sh
#!/bin/bash
#
export HISTSIZE=10000
export HISTTIMEFORMAT="[%F %T] "
#
LOG_DIR=/var/log/user_history
mkdir -p $LOG_DIR/$USER
if [ 0 -eq $? ]; then
SRC_IP="$(who -u am i 2>/dev/null | awk '{print $NF}' | sed 's/[()]//g')"
[ -z "$SRC_IP" ] && SRC_IP='127.0.0.1'
hist_file="$USER/${SRC_IP}_$(date +%Y%m%d-%H%M%S)"
export HISTFILE="$LOG_DIR/$hist_file"
else
echo "本次登陸沒有監管,10秒後自動斷開!"
export TMOUT=10
fi