在 bash script 裡,可以用 ${RANDOM} 取亂數,例如
echo "random number: ${RANDOM}"
就會出現一個隨機的數字。
那如果想限制在 20~40 這個範圍內的話,可以怎麼做呢?這時候可以用 bash 的 % ,取餘數的運算子來做,例如
echo "random number(0~10): $((20 + RANDOM % 20))"
Just thinking more…
在 bash script 裡,可以用 ${RANDOM} 取亂數,例如
echo "random number: ${RANDOM}"
就會出現一個隨機的數字。
那如果想限制在 20~40 這個範圍內的話,可以怎麼做呢?這時候可以用 bash 的 % ,取餘數的運算子來做,例如
echo "random number(0~10): $((20 + RANDOM % 20))"
若有需要將整個 repository 從 A 搬到 B ,單純的 git clone 跟 git push 是不夠的,因為還有 branches, tags 等等的。
所以得這樣作。
首先在目的端,例如 github/gitlab ,建立一個空的 repository。
接著要處理來源端的 repository,在 clone 時加上 --mirror
git clone --mirror git@example.com:repo1.git
git clone 完成會有一個 repo1 的資料夾,進入 repo1 的資料夾,執行以下指令把所有 branches, tags 資訊都拉取回來,然後加入新的遠端,並進行推送
git fetch --all
git remote add target git@<新的repository>
git push target --mirror
這樣就大功告成了。
說明一下為什麼會要這樣作。
因為環境關係,DNS protocol 出不去,只有 A 主機可以透過 HTTP 出去。
因此方案如下:
cloudflared 蠻好安裝的,就一個執行檔,下載以後,改個權限就可以執行了 (安裝方式)
那如果要用 systemd 來啟動,也很容易,安裝方式裡就有提供範例:
[Unit]
Description=DNS over HTTPS (DoH) proxy client
Wants=network-online.target nss-lookup.target
Before=nss-lookup.target
[Service]
Environment=http_proxy=http://<proxy>:3128
Environment=https_proxy=http://<proxy>:3128
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
DynamicUser=yes
ExecStart=/usr/local/bin/cloudflared proxy-dns --port 5533
[Install]
WantedBy=multi-user.target
設定好,用 firewall-cmd 設定好防火牆 (TCP 5533) 以後,就可以去調整 BIND 的設定 /etc/named.conf。
修改既有的 forwarder 設定
forwarders { 127.0.0.1 port 5533; };
重新啟動 named 以後,就可以試試看了。
流程大致如下
--[DNS查詢]--> B 主機(53/UDP) ----> B 主機(5533/TCP) --[HTTP]--> A 主機(3128/TCP) --> 外部
資料來源:
整理一下,若遇到刪除不了,一定是有原因。以 Namespace 來說,通常是有些資源刪除不掉,這時候要花點耐心去找。
若不想等,就是加上 --grace-period=0 --force ,強制來做。
Pod 也是類似的作法。
若還是不行,可以把 finalizer 清掉,以下是 pod 的例子,但 namespace 也可以用。
kubectl patch pod <pod>-p '{"metadata":{"finalizers":null}}'
最後一招,終極的作法,是直接存取 etcd ,這個會看是用哪個容器平台而有不同的作法。像 OpenShift ,etcd 是以 pod 形式存在,所以需要進到 etcd 的 pod 裡,用 etcdctl 去查詢跟刪除。
雖然通常都是建議不要,但難免會遇到這種情況,就參考看看。
需求是要找到從昨天到現在有變更的檔案,一時也想不出來怎麼做,利用 Google 找了一下,大多都是利用 find 的 -newer 參數。
find 的 -newer 參數要帶入的是一個檔案,表示會以這個檔案為基準來進行比對。
所以假設是要找 2023-11-11 之後的檔案,就先利用 touch 來建立一個基準檔案,其修改日期為 2023-11-11:
touch --date "2023-11-11" /tmp/base
然後再用
find . -newer /tmp/base -print
就可以找出在 /tmp/base 之後變更的檔案了。
find 也有一個 -newerXY 的參數,這個 XY 可以是以下內容
那要找比 2023-11-11 要新的檔案,就用以下指令
find . -type f -newermt 2023-11-11
要找特定一天的,就用以下指令
find . -type f -newermt 2023-11-11 ! -newermt 2023-11-12
日期是寫 2023/3,但其實是大約 6月~8月間看的。這兩片都是跟媽媽有關係的片子。
動作片,我覺得挺不錯的,打的很過癮。
福順是公司裡的頂尖殺手,但是她有點想退休了,想好好陪女兒,正在猶豫不決。公司高層還想留她,畢竟是公司的招牌。公司大,就有人眼紅,所以就針對她,想取代她。有了這樣的前因,自然就有了打的原因。
有頂尖的新人一起打,其他想拿賞金的人一起打,高層的老闆也是他之前愛的人,也下來一起打,打到後來,福順總算是都打贏了。她的女兒到最後知道了媽媽的身份其實是殺手,媽媽覺得難過,他不想女兒知道自己是殺手,怕他走上同條路。女兒的反應出乎他的意料,居然能接受他。故事就這樣結束了。
媽媽早年去臥底,跟犯罪分子結合、懷孕,她不想孩子變成犯罪分子,所以跟 FBI 合作,拔除了犯罪分子。生下女兒以後,女兒送給人收養,她受到 FBI 保護,隱姓埋名躲到冰天雪地的地方去。
只是她的形蹤還是被發現了,女兒的形蹤也被發現了,因而被綁走。所以她只好出面,要保護女兒。在這場保護女兒的過程中,同時也拉近她跟女兒的關係。
最後當然是壞人死光光,她跟女兒也修復了一定程度的感情,皆大歡喜。
執行 git clone 以後取得的修改時間是當下執行的時間,所以其實是沒辦法去判斷哪個檔案是七天前修改的,或是十天前修改的。
Stackoverflow 上有人問了相同的問題:Git clone changes file modification time – Stack Overflow
有人就回答了,其實 git 裡面沒有保留檔案修改時間的資訊,但可以有個 tricky 的方法,就是透過 git log 的資訊來變更檔案的修改日期:
git ls-tree -r --name-only HEAD | while read filename; do
unixtime=$(git log -1 --format="%at" -- "${filename}")
touchtime=$(date -d @$unixtime +'%Y%m%d%H%M.%S')
touch -t ${touchtime} "${filename}"
done
這邊主要用到幾個指令,說明如下
git ls-tree 是取出檔案名稱git log -1 --format 是取出檔案提交的日期,這邊取出的是 timestamp 值date -d 將 timestamp 值,轉換為日期時間格式。touch -t 依據指定的日期格式去設定檔案的修改日期。這邊要注意,目錄的修改時間不會被更動到。
透過以上的腳本,就可以還原git簽出檔案的修改時間,然後再搭配 find 指令來找出七天前修改的檔案了。
在「基礎架構即程式碼」這本書裡看到 serverspec 這個工具,是 rspec 的延伸,主要是檢查是否合乎規格,但對象換成了主機,而不是程式。
以下安裝都是在 Ubuntu 22.04 上進行,首先要安裝 ruby
sudo apt install ruby bundler
接著要透過 gem 來安裝 serverspec ,使用 gem install 預設是安裝到系統 /usr/local ,但我不想這樣,我希望是安裝到自己使用者目錄下,這時候可以用 –user-install
gem install serverspec --user-install
這樣就安裝完成了。
接下來建立一個目錄,作為工作區,然後初始化 serverspec 專案
mkdir -p work
serverspec-init
這時候會詢問主機的資訊
Select OS type:
1) UN*X
2) Windows
Select number: 1
Select a backend type:
1) SSH
2) Exec (local)
Select number: 1
Vagrant instance y/n: n
Input target host name: www.example.jp
主機規格描述,是放在 spec/www.example.jp/sample_spec.rb
所以就編輯這個檔案就可以。
連線到主機,是使用 SSH,這邊若是不想輸入密碼,就要把 public key 複製過去
ssh-copy-id user@www.example.jp
登入使用者不一樣,是要調整 spec/spec_helper.rb 裡的 user。
要進行測試,就執行
rake spec
這樣就可以對主機進行檢查了。
--check 與 --diff 來做到類似的功能。若是想知道指定的套件會影響哪些套件,這時候可以怎麼做呢?
我第一個是想到可以用 rpm ,用 man rpm 可以查到 rpm 有以下參數
所以就試試看
rpm -q --whatrequires libweb
但結果卻不如預期,上網找到這篇 centos – Why does rpm –whatrequires fail to report dependencies? – Unix & Linux Stack Exchange
才知道正確用法是這樣,要先用 rpm -q --provides libwebp 去查到 libwebp 有提供什麼capability,然後再用 rpm -q --whatrequires <capability> 去找。
例如 libwebp
[root@workstation ~]# rpm -q --provides libwebp
libwebp = 1.0.0-5.el8
libwebp(x86-64) = 1.0.0-5.el8
libwebp.so.7()(64bit)
libwebpdecoder.so.3()(64bit)
libwebpdemux.so.2()(64bit)
libwebpmux.so.3()(64bit)
[root@workstation ~]# rpm -q --whatrequires "libwebp.so.7()(64bit)"
libwebp-1.0.0-5.el8.x86_64
gd-2.2.5-7.el8.x86_64
ImageMagick-libs-6.9.12.50-2.el8.x86_64
這樣就可以找到,但若是如此,就要寫腳本了。因為 libwebp 有提供多個 capability ,需要逐一去查才行。
有沒有更快的方法呢?
centos – Why does rpm –whatrequires fail to report dependencies? – Unix & Linux Stack Exchange 裡面有提到可以用 rpm -e --test ,直接模擬看看移除。
rpm -e --test libwebp 2>&1 | grep needed | awk '{print $6}' | sort | uniq
這樣就可以很快找出來了。
最近想試試看 wireguard,看了文件,都會提到用 ufw/firewalld 來配置網路,就想說,自家的 archlinux 都沒用防火牆,是不是該來用一下比較好。經過找 archlinux 文件以後,發現 archlinux 其實很自由,可以自由選 firewalld 或 ufw。在公司因為用 RHEL8 ,都是用 firewalld ,為了平衡一下還有家裡的其他電腦,決定就用 debian/ubuntu 的 ufw 。
ufw 的全名是 Uncomplicated firewall ,archlinux wiki 裡就有詳細的說明文件:https://wiki.archlinux.org/title/Uncomplicated_Firewall
用 yay 或 pacman 安裝
yay -S ufw
安裝好以後,先不要啟用,要先設定。
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh
這幾行的意思是說,允許出去,禁止進來,只允許 ssh 服務的連線進來。
接著啟用
sudo ufw enable
sudo systemctl enable --now ufw
然後可以用 sudo systemctl status ufw 跟 sudo ufw status 檢查狀態。
接下來因為自己有用 http/https/gitlab/samba/squid 服務,也有使用 docker,所以要額外設置。
先允許 http/https 連線。
sudo ufw allow http
sudo ufw allow https
設置 docker 規則,docker 的部份有人寫好了,所以安裝套件以後再啟用即可。(ufw and docker),啟用以後,docker 容器有 expose 的 port 就會自動 allow。
yay -S ufw-docker
sudo ufw-docker install
再來是 samba,這也是有人寫好套件
yay -S ufw-extras
sudo ufw allow from 192.168.11.0/24 to any app samba
最後是 squid
sudo ufw allow from 192.168.11.0/24 to any port 3128 proto tcp
到這邊就設定完了,沒遇到什麼特別狀況。