vim基本款設定與常用指令、按鍵整理

去客戶那邊的時候,vim 設定一定都要重來過的,如何在最快的時間設定成自己想要的樣子?

目前自己的基本設定

set et
set ts=2
set sw=2
set autoindent
set nu
colorscheme desert

這樣就足夠了,太多也記不住。

再來是常用指令

指令說明
:set wrap超過螢幕寬度就換行
:set nowrap超過螢幕寬度不換行
/\ccopyright
:set ignorecase
搜尋不分大小寫,可參閱 :help ignorecase:help smartcase
:set nu顯示行號
:set nu!隱藏行號
:tabedit filename在新頁籤開啟指定檔案
:tabnew開新頁籤
:ls列出所有開啟的檔案 (buffer)
:b1切到第一個檔案 (buffer)
:set paste設定為貼上,不要管 auto indent
:set nopaste不要設定為貼上,這樣若有 autoindent 時,會自動縮排
:wq最重要的指令,存檔然後離開。若加上 ! 表示強制存檔後離開。
:set mouse= 或 :set mouse=r 或 :set mouse=v 設定不要為 a 就可以使用標準系統的選取、複製模式

常用按鍵

Mode按鍵說明
Normalctrl+w s分割畫面-橫切
Normalctrl+w v分割畫面-直切
Normalctrl+w c關閉當前窗格
Normalctrl+w j / ctrl+w k / ctrl+w h / ctrl+w l移到下面/上面/左邊/右邊的窗格
Normalgt到下個頁籤
NormalgT到上個頁籤
Insertctrl+x ctrl+p表示往前找有輸入過的來作自動完成
Insertctrl+x ctrl+f自動完成檔名

參考資料

更新sudoers檔案內容

一般更新 /etc/sudoers 檔案內容都是使用 visudo 指令進行;若是要管理 sudoer ,Ansible 可以用 community.general.sudoers 模組來管理。

那如果要在腳本裡更新,該怎麼做呢?這時候可以參考 How do I edit /etc/sudoers from a script? 裡的作法來進行。

這作法蠻 tricky 的,主要是利用 EDITOR 環境變數把 visudo 預設的編輯器換為 tee -a ,這樣就不會開啟 vi 編輯器,而會改用 tee 來處理。來看看這行指令

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
  1. | 的左邊是很單純的 echo,這裡可以放置要放進去的設定
  2. | 的右邊就是 sudo 跟 visudo ,這是用 sudo 執行 visudo 指令,並且把編輯器換為 tee -a

這樣組合以後,就可以把設定放到 /etc/sudoers 裏面去了。

另外一種比較單純的作法就是在 /etc/sudoers.d 目錄下去新增檔案,新增以後,因為 /etc/sudoers 裏面有寫 #includedir /etc/sudoers.d ,所以會引用到 /etc/sudoers.d 目錄下的檔案。

如何建立YUM mirror server

在企業裡,因為不會讓所有伺服器都對外,一般會在內部架設一台 YUM mirror server ,定期去 mirror 外部的 RHEL 套件庫。

坦白說,我不知道用哪個名字比較好,知道的名字有

  • Local mirror
  • YUM repository server
  • YUM mirror server

總之,用途都是一致的。

作法

首先這台要作為 mirror 的伺服器必須要對外,接著在伺服器裡,以 subscription-manager 註冊到 RHEL 服務去。

安裝做 mirror 的套件,這邊選用 apache,也可以用 nginx,路徑跟設定調整一下就可以。

yum install yum-utils createrepo httpd

使用 subscription-manager 查看可以下載的 repository

subscription-manager repos --list

接著對需要做 mirror 的 repository 去做 mirror

mkdir -p /var/www/html/{baseos,appstream}
reposync -p /var/www/html/baseos \
        --download-metadata \
        --repo=rhel-8-for-x86_64-baseos-rpms \
        --delete \
        --downloadcomps

reposync -p /var/www/html/appstream \
        --download-metadata \
        --repo=rhel-8-for-x86_64-appstream-rpms \
        --delete \
        --downloadcomps

這邊可以寫成一個腳本,然後設定 cron,定期去執行 mirror。

一般會再多寫一個 repo 檔案,放在 /var/www/html ,後續到其他主機時,可以直接下載這個 repo 檔案,放到 /etc/yum.repos.d 裡面,就可以直接 yum update 。

[baseos]
name=baseos
baseurl=http://<ip>/rhel-8-for-x86_64-baseos-rpms/
enabled=1
gpgcheck=0

[appstream]
name=appstream
baseurl=http://<ip>/rhel-8-for-x86_64-appstream-rpms/
enabled=1
gpgcheck=0

最後啟用 httpd,就大功告成了。

systemctl enable --now httpd

限制

使用這個方法,基本上一台主機就是對應一個版本,例如 7.9, 8, 8.5, 8.6 這樣,沒辦法有多個版本,若需要有多個版本,建議使用 Foreman 或是 Satellite 會比較方便。

參考資料

bash arguments cheatsheet

記錄關於 bash argument 的幾則常用語法。

argument 一般翻譯為引數或參數,帶有 — 的,會被稱為選項。

prog arg1 arg2 arg3
prog --output option1 arg1

arg1, arg2, arg3 就是引數;–output option1 就是選項。

寫 shell script 時,是不管 — 的,在 prog 之後的,都叫做引數。以下用法均以 prog arg1 arg2 arg3 作為範例

用法說明結果
$#取得引數個數3
$@所有引數arg1 arg2 arg3
myArray=(“$@”)轉為 Array 會印出 arg1,要遍訪,需用 for:
myArray=(“$@”)
echo “${myArray}”
只印出Array第一個元素arg1
for arg in “${myArray[@]}”; do echo -n “${arg},”; done遍訪Array所有元素arg1,arg2,arg3,
myArray=( “$@” )
arraylength=${#myArray[@]}
for (( i=0; i<${arraylength}; i++ ));
do
echo “${myArray[$i]}”
done
遍訪Array所有元素的另一個作法,用索引方式。arg1
arg2
arg3
if ["$#" -eq 0]; then echo "no argument"; fi判斷是有否引數若無引數,印出 “no argument”
B=(“${myArray[@]:1:2}”)
echo “${B[@]}”
做slicearg2 arg3
version=4.7.1
A=( ${version//./ } )
echo “${A[@]}”
split4 7 1
a=”HELLO WORLD”
echo "${a,,}"
echo “${a,,[AEIUO]}”
轉小寫hello world
HeLLo WoRLD
a=”hello world”
echo "${a^^}"
轉大寫HELLO WORLD

參考資料

atuin

atuin 可以把指令歷史改放到 sqlite db 裡,提供了 fancy 的畫面跟功能,還蠻酷的。它在雲端有提供 sync 伺服器,可以把指令同步上去,我本來在想這會有安全疑慮吧,畢竟有些時候指令就會帶密碼。不過,atuin 已經有做加密了,放上去是安全的。

atuin sync 伺服器也可以自行架設,除了可以同步之外, sync 伺服器還有提供一個類似 github graph 的功能,可以看到活動圖,蠻有趣的。

安裝

bash <(curl https://raw.githubusercontent.com/ellie/atuin/main/install.sh)

如果想試試預設的 sync 伺服器,就先用 atuin register 來註冊

atuin register -u <USERNAME> -e <EMAIL> -p <PASSWORD>

若不需要,就匯入目前的 history

atuin import auto

設定

如果是使用 bash ,就用以下指令,把設定放到 .bashrc

curl https://raw.githubusercontent.com/rcaloras/bash-preexec/master/bash-preexec.sh -o ~/.bash-preexec.sh
echo '[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh' >> ~/.bashrc
echo 'eval "$(atuin init bash)"' >> ~/.bashrc

若是 zsh ,就改用以下指令,把設定放到 .zshrc 裡

echo 'eval "$(atuin init zsh)"' >> ~/.zshrc

設定好,就關掉終端機,開新的終端機,或者是登出,重新再登入,設定就生效了。

使用

使用很簡單,按下 ctrl+r 或是按上,就會看到 atuin 的畫面,輸入字母,上方就會篩選出相關的指令。

那也可以打指令去找,例如找昨天下午3點以前的 ls 指令

atuin search --exit 0 --after "yesterday 3pm" ls

相當簡單。

架設 sync 伺服器的部份有空再來試好了,目前就先都以本機使用為主。

想法

其實就現在來說,使用 ctrl+r 就已經很方便,而且也不需要安裝,直接就能使用。未來會有需要集中管理指令歷史功能的強烈需求嗎?我想可能是沒有,就先用一陣子試試看好了,一周以後再來評估是否要繼續使用。

HAProxy

去年因為需要建置 OpenShift 容器平台而接觸到了 HAProxy,才知道為什麼 AWS 上會有分 Application Load balancer 等不同類型的負載平衡器。

簡單的說,HAProxy 的負載平衡模式分為兩種,一種是 HTTP mode,一種是 TCP mode;也就是 Layer 7 跟 Layer 4。建置 OpenShift 容器平台時,是使用 TCP mode ,Layer 4 的模式,當 HAProxy 收到連線請求時,是直接看哪一個 backend node 可以用,就直接左手給右手,連線到該台 backend node。那 HAProxy 也可以設定為 HTTP mode ,在這種模式下,就像是 nginx/apache 的 reverse proxy ,可以在 frontend 加上憑證跟做 VirtualHost。

安裝很簡單,Ubuntu 跟 RHEL 都有提供

sudo apt install -y haproxy
sudo yum install -y haproxy

安裝以後,設定檔位置是在 /etc/haproxy.cfg

主要需要調整的是 frontend 跟 backend

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 10s
        timeout client  60s
        timeout server  60s
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

frontend http_bind
        bind *:80
        mode tcp
        option tcplog
        default_backend router_http


frontend https_bind
        bind *:443
        mode tcp
        option tcplog
        default_backend router_https

backend router_http
        mode tcp
        server router_server router:80

backend router_https
        mode tcp
        server router_server router:443

frontend 決定 haproxy 要 listen 哪一個 port,backend 決定是由哪個 node 來處理連線,很容易理解。(聽同事說,這跟 F5 的設定也很接近。)

在 RHEL 會比較容易遇到 HAProxy 有問題,主因是 SELinux ,在啟動 HAProxy 前,需要先使用 setsebool 來設定:

getsebool -a | grep haproxy_connect_any
setsebool haproxy_connect_any on

跟 HAProxy 相關的 SELinux 設定可以用 man 8 haproxy_selinux 來查詢。

參考資料

讓 curl 在狀態碼非2XX時,回傳錯誤

一般在使用 curl 去存取某個網路資源時,只要可以連上並存取,curl 的 exit code 就會是 0。

可是很常見的情境是會想要加上 HTTP 狀態碼的判斷,例如 404 表示 not found,這時候就只能用 -I(即 -X HEAD) 再加上 -v 去取得 HTTP 請求回應標頭裡的狀態碼,再來判斷。

curlf() {
  OUTPUT_FILE=$(mktemp)
  HTTP_CODE=$(curl --silent --output $OUTPUT_FILE --write-out "%{http_code}" "$@")
  if [[ ${HTTP_CODE} -lt 200 || ${HTTP_CODE} -gt 299 ]] ; then
    >&2 cat $OUTPUT_FILE
    return 22
  fi
  cat $OUTPUT_FILE
  rm $OUTPUT_FILE
}

還好,在 curl 7.76 以後的版本加入了 --fail-with-body/–fail ,使用這個參數就可以不用那麼複雜的判斷,當 HTTP 狀態碼不是 2XX ,exit code 就不會是 0 了,而會是 22,22 表示 。

curl -sI --fail-with-body http://example.com/not-found/
echo $?
22

這樣以後就不需要解析請求回應標頭裡的狀態碼了。

參考資料

電影流水帳(2022/07/01~2022/07/31)

Elizabeth Olsen & Paul Bettany
Elizabeth Olsen
  • Doctor Strange in the Multiverse of Madness (IMDB, Wikipedia),台譯:奇異博士2-失控多重宇宙。
  • Spider-Man: No Way Home (IMDB, Wikipedia),台譯:蜘蛛人3-無家日。

Doctor Strange in the Multiverse of Madness

看這部之前,最好先看「蜘蛛人3-無家日」跟「汪達與幻視」,會比較好理解為什麼奇異博士會提到多重宇宙,還有為什麼汪達會失控。簡單的說,都是對愛的執著,一個是對前女友的愛,一個是對孩子跟幻視的愛。

一開始就單刀直入地深入奇異博士的夢境,艾美莉卡被怪物追殺,奇異博士拯救她,隨即夢就醒了。持續發生這樣的夢,讓奇異博士感到困擾。這天奇異博士在真實世界處理事情時,怪物與艾美莉卡就出現了,奇異博士隨即施展法術拯救了艾美莉卡。事後,艾美莉卡跟奇異博士說明來龍去脈,原來艾美莉卡有穿越時空的能力,在某次事件後,他一直被怪物追著跑。奇異博士沒有頭緒,他決定去找汪達求助。

在跟汪達聊時,奇異博士感到不對勁,明明還沒說明來意,汪達就知道是艾美莉卡。奇異博士隨即想通了事情經過,原來就是汪達派怪物追著艾美莉卡跑,想要取得艾美莉卡的能力,以跳躍到另外一個宇宙去跟自己的孩子相會。奇異博士要守護艾美莉卡,汪達想活捉艾美莉卡,兩方就打了起來。奇異博士打不過汪達,跟著艾美莉卡的能力跳躍到另外一個宇宙去了。汪達無法跳躍到另外一個宇宙,就藉由黑暗魔力持續的追殺著奇異博士跟艾美莉卡。打打逃逃的,奇異博士遇到了許多其他宇宙的奇異博士,每個宇宙的奇異博士個性都不一樣,但同樣都為了愛而有所偏差。奇異博士跟艾美莉卡在這樣的歷程裡,心態慢慢的改變,放下了對克莉絲汀那份執著的愛。

最後奇異博士跟艾美莉卡說服了汪達,告訴他到另外一個宇宙,是會導致那個宇宙的汪達失去孩子的,你應該要放下。汪達接受了失去孩子跟幻視的事實,也捨棄了黑暗魔力。奇異博士跟艾美莉卡回歸到原來的宇宙,故事到這邊結束。

Spider-Man: No Way Home

湯姆弟的蜘蛛人第三集,故事加入多重宇宙把之前的兩個蜘蛛人串接起來,收尾的不錯。

Peter 因為上集的關係,身份曝光,有些人相信神祕法師是好人,蜘蛛人殺了他,這樣的誤會造成輿論譁然。Peter 跟好友每天被跟拍,日子開始變得不好過,再加上三人都沒被麻省理工學院錄取,Peter 很難過,覺得都是自己害的,就跑去找奇異博士,想請他幫忙。奇異博士很同情 Peter ,再加上之前曾經患難與共,決定幫他一把。奇異博士隨即念起咒語,要施展魔法讓大家忘記 Peter 是蜘蛛人的事情。但施展過程中,Peter 更動了三次,讓奇異博士的魔法出了狀況。

是的,奇異博士的魔法把其他宇宙的蜘蛛人對手都召喚過來了,像是綠惡魔、八爪博士、沙人、電人、蜥蜴人等等的。奇異博士很生氣,要 Peter 想辦法把這些人捉過來,他再用魔法把他們變回去。Peter 只好協同好友,把這些人找回來。梅嬸發現這些人都有些缺憾,就跟 Peter 說,你應該要幫幫他們。但好心被雷親,綠惡魔殺了梅嬸,Peter 非常自責,也很消沉。沒多久,奈德用王留下的手環打開了傳送門,找來了同樣被魔法召喚來的兩個蜘蛛人。兩人以自身遭遇鼓舞 Peter,經過一番轉折,Peter 決定要遵循梅嬸遺願,幫助這些人,3個 Peter 隨即合作開發解藥。

最後三人一同幫助了這些人,奇異博士隨即釋放了被禁錮的魔法,但奇異博士無法控制魔法,Peter 見狀,決定讓所有人都遺忘 Peter ,奇異博士才得以控制魔法,所有人都回到原來的宇宙去。Peter 付出的代價也很大,包括好友,都忘了 Peter,他只能重新開始人生,以蜘蛛人跟 Peter 的雙重身份繼續下去。

visidata

很酷的工具,個人覺得是終端機的神器。

一般在終端機要察看 csv / json / yaml 等檔案,就是用 less 或 vim 來看,然後自己腦補進行閱讀。visidata 就是用來解決這個痛點,他會自動解析資料內容,然後以表格方式呈現,這在閱讀上就帶來很大的便利。

安裝很簡單,像 ArchLinux 或 Ubuntu 都已經有了,所以只要用套件管理工具安裝 visidata 就可以。在 RHEL8 ,就需要用 pip3 來安裝。其他發行版的安裝可以參考 Install VisiData | VisiData

安裝

ArchLinux

pacman -S visidata

Ubuntu

sudo apt install visidata

RHEL8

sudo yum install python3-pip
sudo pip3 install visidata

使用

安裝完成以後,就可以用了。

visidata <your_json_file>
visidata <your_csv_file>
visidata <your_yaml_file>

我有試著用在 Ansible playbook 或是 Kubernetes YAML 上,在這類型的 YAML 檔,欄位型態常有 dict 的情況。如果該欄位型態是 dict,按下 Enter ,會再展開,讓你一層一層進去,意外的發現 visidata 挺方便的。

剛剛看了一下 “–help” ,發現挺多選項的,之後再來持續挖掘吧。

電影流水帳(2022/05/16~2022/06/30)

Zoe Saldana
Zoe Saldana

The losers

The losers 是一組特別的小隊,一開始就去玻利維亞出任務,要從毒梟身上取得東西,但毒梟不肯透露,The losers 的領隊者,Clay 只好殺了他。在這裡他們發現了許多孩童,為了這些孩子,他們決定將目標改為救孩子,就帶著孩子逃了出去。到了接應地點,直昇機接走孩子後,直昇機卻發生爆炸。The losers 發現這事不對勁,好像早就設計好,他們要被滅口了,於是小隊離開了玻利維亞。

匆匆經過一段時間,他們遇到了 Aisha,聲稱可以幫他們回到美國,只要幫她幹掉 Max。於是 The losers 經過一番討論後,決定出手。Max 處事很小心,形蹤很隱密,The loser 跟 Aisha 花一番功夫,才追查到。但 Max 也發現了他們的企圖,準備了反制。此時 The losers 也發現 Aisha 是之前毒梟的女兒,還有 Roque 是叛徒,眼見就要全團被滅了。最後,The losers 仍然殺出一條生路,幹掉 Max,順利解決事件。

會看這片是因為看到有 Chris Evans, Zoey Saldana, Idris Elba 這些演員,看完之後,覺得普普通通,蠻適合打發時間的。

The Suicide Squad

延續上次故事架構,Amanda Waller 再次召集了一堆罪犯,組合兩個團隊前往科托馬爾他,要摧毀地下實驗室「約頓海姆」。本來也不打算這樣做的,主要是因為科托馬爾他發生了政變,原來聽命於美國的總統被推翻,新的領袖不聽話,為了避免實驗室「約頓海姆」裡的祕密被利用來對抗美國,只好出這次任務。

第一個團隊是當作誘餌,第二個團隊是真正執行任務者,所以第一個團隊幾乎是全滅,第二個團隊則順利潛入科托馬爾他。整個潛入過程蠻有趣的,再加上僥倖逃出的小丑女在科托馬爾他所發生的事情,讓人莞爾。最後是發現了實驗室裡的祕密是外星來的巨大海星,原本 Amanda Waller 要發射核彈毀滅整個島的,但 Amanda Waller 被撂倒,自殺突擊隊扛起了事,一起對抗巨大的海星,將其消滅。

這片蠻好看的,節奏流暢,每次看這系列電影都是在看小丑女的不按常理。