之前已經用 certbot 申請 letsencrypt 了,現在若想增加一個子網域的話,該怎麼做呢?
這時候可以用 --expand
:How can I add subdomains to letsencrypt using certbots?
像是這樣
certbot --expand -d mysite.com,imap.mysite.com,smtp.mysite.com
執行以後,會輸出結果,若是用自動的話,執行完就可以了。
若是手動的話,就依照指示進行即可。
Just thinking more…
之前已經用 certbot 申請 letsencrypt 了,現在若想增加一個子網域的話,該怎麼做呢?
這時候可以用 --expand
:How can I add subdomains to letsencrypt using certbots?
像是這樣
certbot --expand -d mysite.com,imap.mysite.com,smtp.mysite.com
執行以後,會輸出結果,若是用自動的話,執行完就可以了。
若是手動的話,就依照指示進行即可。
來源:Avoid running out of ephemeral storage space on your Kubernetes worker Nodes
Kubernetes 裡用 emptyDir 的 volume 的話,就是用 ephemeral storage,這塊空間就是 node 上的磁碟空間。所以用完的話,表示 node 上也沒空間了,其他 pod 在使用上可能就會有狀況。
node 上的位置可能會因發行版而有差異,文章裡提供的位置是:/var/lib/kubelet/pods//volumes/kubernetes.io~empty-dir//…
避免的方法有兩種。
第1種是在掛載 volume 時,設定 sizeLimit ,例如
volumes:
- name: www-content
emptyDir:
sizeLimit: 2Mi
缺點是當超過這限制時,kubernetes 會把這個 pod evict 掉。
第二種是設定 ResourceQuotas/LimitRange,先新增以下 YAML,然後 apply
apiVersion: v1
kind: ResourceQuota
metadata:
name: default-resource-quotas
namespace: my-application-namespace
spec:
hard:
limits.cpu: "2"
limits.memory: 8Gi
limits.ephemeral-storage: 2Gi
requests.cpu: "1"
requests.memory: 4Gi
requests.ephemeral-storage: 1Gi
---
apiVersion: v1
kind: LimitRange
metadata:
name: default-limit-ranges
namespace: my-application-namespace
spec:
limits:
- default:
cpu: 100m
memory: 128Mi
ephemeral-storage: "2Mi"
defaultRequest:
cpu: 25m
memory: 64Mi
ephemeral-storage: "1Mi"
type: Container
再來在 deployment/statefulset 裡增加 resource 指定,例如
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-deployment-3
spec:
selector:
matchLabels:
app.kubernetes.io/name: helloworld-deployment-3
replicas: 2
template:
metadata:
labels:
app.kubernetes.io/name: helloworld-deployment-3
spec:
volumes:
- name: www-content
emptyDir: {}
containers:
- name: hello-world
image: helloworld:1.0
volumeMounts:
- mountPath: /www
name: www-content
resources:
requests:
ephemeral-storage: "1Mi"
limits:
ephemeral-storage: "2Mi"
在 Kubernetes 裡雖然可以很容易擴充,但不表示資源無限,反而更應該去管控好,避免浪費。
因為好奇怎麼去查,就找到這篇:How to check if an RHEL system is vulnerable to a CVE ,文章裡面提到兩個方法。
第一個方法是用 rpm -q --changelog <套件> | grep <CVE_number>
舉個例子
rpm -q --changelog openssl | grep CVE-2021-3450
第二個方法是用 yum updateinfo info --cve <CVE_number>
舉個例子
yum updateinfo info --cve CVE-2021-3445
最後,想調查這台 RHEL 有受到哪些 Errata 影響,可以用
yum updateinfo info --summary
yum updateinfo info --list
若要帶入 CVE 資訊,可以用這兩個指令
yum updateinfo info --summary --with-cve
yum updateinfo info --list --with-cve
Red Hat 也有一篇 KB ,方法相似:https://access.redhat.com/solutions/3628301
不太一樣的地方是,指令是查看 rpm 的,所以是用
rpm -qp kernel-3.10.0-862.11.6.el7.x86_64.rpm --changelog | grep CVE-2017-12190
或者是用 yum list
–cve <CVE_number>
yum list --cve CVE-2017-12190 | grep kernel.x86_64
之前很方便,自己寫個應用程式,去 listen 指定 port ,用瀏覽器存取,都沒什麼問題。
但現在瀏覽器守備範圍變寬了,怕你危險,所以當使用奇怪的 port 時,就會出現 unsafe port 的訊息。
每種瀏覽器有不同的解除限制方式。
啟動 google chrome 時,加入參數
--explicitly-allowed-ports=xxx
例如
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --explicitly-allowed-ports=6666
我想使用 Chrome 引擎的幾個瀏覽器應該也都適用,例如 Brave、Edge …
firefox 處理方式比較簡單,開個新分頁,網址列輸入
about:config
然後輸入
network.security.ports.banned.override
然後填入
87,88,89,1050
或是範圍
10000-19999
完成以後,會立刻生效。
開發上,還是會需要使用到這些不安全的 port 來開發,所以知道怎麼繞過去會蠻有用的。
在 Hackin9 看到這篇:Hash Buster – Why crack hashes when you can bust them?
這篇主要是在說 md5/sha1 是不安全的,透過目前電腦的強大能力,已經是可逆的了。用 Hash-Buster 這工具可以很快逆向取得雜湊前的結果。
方法1
git clone https://github.com/s0md3v/Hash-Buster.git
cd Hash-Buster
make install
方法2
wget https://raw.githubusercontent.com/s0md3v/Hash-Buster/master/hash.py -O /usr/local/bin/buster && chmod +x /usr/local/bin/buster
把雜湊值當參數
buster -s "5e8ff9bf55ba3508199d22e984129be6"
把內有雜湊值的檔案當參數
buster -f with_hashed.txt
找目錄下所有內含有雜湊值的檔案
buster -d /somedir
import hashlib
print(hashlib.md5('sample'.encode('utf-8')).hexdigest())
這工具蠻方便的,而且很小,但使用時必須要注意的一件事情,裡面的程式主要是使用外部的服務,所以是把雜湊值上傳到外部網站,然後取得結果。若是因為不小心遺忘密碼,那麼在取得結果後,要趕緊進行變更,以防萬一。
這個需求在 linux 用 find 寫,很方便
find /tmp/location -type f -mtime +15 -delete
在 Windows Powershell 的話,可以參考這篇 Delete files older than 15 days using PowerShell
$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"
# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force
# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
這是使用 Get-ChildItem -Path $path
,搭配 Where-Object ,Where-Object 裏面是做判斷, $_
是每個項目,用每個項目的 CreationTime 去判斷,然後用 Remove-Item 去刪除。
想找到指定位置下的目錄,但不要再深入。指定位置下的目錄是這樣的
/tmp/location
+-- dir1
+ dir11
+-- dir2
+ dir21
foo.txt
我預期是只看到 dir1 跟 dir2,所以我用 find
find /tmp/location -type d -print
結果我找到的是
/tmp/location
/tmp/location/dir2
/tmp/location/dir2/dir21
/tmp/location/dir1
/tmp/location/dir1/dir11
find 的輸出跟我預期的不相符啊,我又不想用 ls 處理,後來找到 -maxdepth -mindepth 這兩個參數,搭配起來使用就可以了。
find /tmp/location -maxdepth 1 -mindepth 1 -type d -print
這樣就會是我需要的 dir1 跟 dir2
/tmp/location/dir2
/tmp/location/dir1
又學到一課,謝謝你 find
。
之前使用 enscript 來將文字檔轉為 pdf,但實測發現,若文字檔裡面是中文,那麼轉出來是亂碼。
只好找其他的方案,找到的是 paps: https://github.com/dov/paps
paps 比較麻煩的是需要自己安裝,安裝說明可以參考:https://github.com/dov/paps/blob/master/INSTALL.md
我的環境是 Ubuntu 20.04
第一個是需要 meson,這個直接用 apt-get 安裝就可以
sudo apt install meson
第二個是 fmtlib ,Ubuntu 20.04 內的 fmtlib 版本過舊,這邊需要借助 backports
sudo add-apt-repository ppa:savoury1/backports
sudo apt install libfmt-dev
最後就是編譯
https://github.com/dov/paps.git
cd paps
meson build
cd build && ninja
sudo ninja install
這樣就可以得到 paps 了。
這兩部電影拍的都很有味道,邊看電影的同時,邊讓人享受推理的樂趣。
這部電影的故事,印象中有看過,記得是跟陪死者的看護有關係,但我始終找不到之前在哪裡看過。
死者是富裕的小說家,家裡的女兒、兒子都有些狀況,父親不想留財產給他們。小說家在某天早上就被發現死了,這下就糟了,沒多久,所有家人都到齊,知名的偵探也來了。於是展開了調查,在偵探檢視了所有人的動機以及現場留下的線索以後,案情陷入撲朔迷離的狀態,但在偵探慢慢調查跟排除不可能的動機之後,終於找到凶手。
其實在整個過程下來,可以猜出來誰是凶手的,就是這種抽絲剝繭的魔力,讓人對推理小說愛不釋手。
這部電影的故事同樣跟富翁有關係。
這富翁當初在創業初期時,有把其中一個人以法律方式,趕出了團隊。在創業初期若沒有處理好股權的部份,很容易發生這種事情。之後這人一直想爭取回自己應有的權益,只是始終未果。
這富翁的個性有點偏差,愛炫燿,把謎題寄給之前一起的人,算是創業伙伴或投資伙伴吧,你得解開謎題,才會知道在什麼時間地點集合,才能到富翁的島上渡假。偵探受到某人的委託,幫忙解開了謎題,也一同跟著過去。
到了島上以後,跟前集一樣,看似融洽的關係,其實暗潮洶湧。果不其然,就有人死了,大家都很害怕,但臨時有暴風雨,無法離開島上,很多事情就開始爆出來。同樣,偵探這時取得大家同意以後,開始進行調查跟推理。
跟上集有點不同的地方是,這集偵探其實早在要到島上前,就已經知道有古怪,所以跟委託人講好怎麼調查,開始設局了。最終,當然有找到凶手,富翁的公司也受到事件的影響而下市。
路徑太長,想要縮短到 80 個字元以內,又要可以辨識,唯一找到的工具是 https://github.com/chrissound/SodiumSierraStrawberry
但這工具執行起來有問題,想要重新編譯,對 haskell 又不熟,只好放棄。
好在找到這篇:Path shortener for GUI application ,裏面提到可以用 Python3 的 pathlib 來做,於是就順手改了一下,做出自己要的工具
#!/usr/bin/env python3
import argparse
import sys
import pathlib
def cut_path(path, limit):
if len(path)>limit:
parts = list(pathlib.PurePath(path).parts)
# print(parts)
#if len(parts) >= 4:
# parts [2:-1] = ['...']
new_parts = []
for part in parts[:-1]:
if len(part)>4:
new_parts.append(part[:4] + "..")
else:
new_parts.append(part)
new_parts.append(parts[-1])
#print(new_parts)
new_path = str(pathlib.PurePath(*new_parts))
#print(len(new_path))
if len(new_path) > limit:
parts[2:-1] = ['...']
return pathlib.PurePath(*parts)
return new_path
else:
return path
def main():
parser = argparse.ArgumentParser(
prog=sys.argv[0],
)
parser.add_argument('-l', '--limit', type=int, default=76)
parser.add_argument('filename')
args = parser.parse_args()
print(cut_path(args.filename, args.limit))
if __name__ == "__main__":
main()
基本運作是這樣
結果大約會是這樣
/home/user1/aaa.txt
coll../ansi../gov/twgc../role../veri../task../main.yml
collection/ansible_collections/.../main.yml
能夠這樣用 Python3 快速的弄出個小工具,真的是蠻開心的,Python3 真的自帶很多好東西可用。