編輯設定檔
#vi /etc/sysctl.conf
在檔案最後加下以下三行
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
重啟服務, 不必重開機
#sysctl -p
驗證是否成功 (確認輸出為 1)
#cat /proc/sys/net/ipv6/conf/all/disable_ipv6
半畝方塘一鑑開,天光雲影共徘徊;問渠那得清幾許,為有源頭活水來。
編輯設定檔
#vi /etc/sysctl.conf
在檔案最後加下以下三行
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
重啟服務, 不必重開機
#sysctl -p
驗證是否成功 (確認輸出為 1)
#cat /proc/sys/net/ipv6/conf/all/disable_ipv6
要在menu.sh 裡增加功能 1. scp功能, 但要讓user自己設定引數與參數 2. ssh 到特定主機, 但要user自己設定登入的帳號名稱
可以,但千萬不要直接讓使用者在 menu.sh 裡「自由輸入整串 scp/ssh 參數」然後丟進 shell 執行(會被用 ;、$( )、-oProxyCommand 等方式繞出去)。正確做法是:
下面給你可直接套用的 SOP。
sudo mkdir -p /home/optim/transfer
sudo chown optim:optim /home/optim/transfer
sudo chmod 700 /home/optim/transfer
/usr/local/bin/optim_scpsudo vi /usr/local/bin/optim_scp
貼上(把 ALLOWED_HOSTS 改成你允許的目的主機):
#!/bin/bash
set -euo pipefail
ALLOWED_HOSTS=("10.0.0.10" "server1.internal" "server2.internal")
BASE_DIR="/home/optim/transfer"
is_allowed_host() {
local h="$1"
for x in "${ALLOWED_HOSTS[@]}"; do
[[ "$h" == "$x" ]] && return 0
done
return 1
}
valid_user() {
[[ "$1" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]
}
# 僅允許相對路徑(避免 /etc/passwd 之類)
valid_rel_path() {
local p="$1"
[[ "$p" != /* ]] && [[ "$p" != *".."* ]] && [[ "$p" =~ ^[A-Za-z0-9._/-]+$ ]]
}
echo "=== SCP (受控) ==="
echo "僅允許檔案位於: $BASE_DIR"
echo "允許主機: ${ALLOWED_HOSTS[*]}"
echo
read -r -p "方向 (1=上傳到遠端, 2=從遠端下載): " mode
read -r -p "遠端主機: " host
read -r -p "遠端登入帳號: " ruser
if ! is_allowed_host "$host"; then
echo "ERR: 主機不在白名單"
exit 1
fi
if ! valid_user "$ruser"; then
echo "ERR: 帳號格式不合法"
exit 1
fi
# 固定 SSH 選項:禁用危險玩法
SSH_OPTS=(
-o "BatchMode=no"
-o "PermitLocalCommand=no"
-o "ClearAllForwardings=yes"
-o "ProxyCommand=none"
-o "RequestTTY=no"
)
case "$mode" in
1)
# 上傳:BASE_DIR/相對路徑 -> 遠端:目的路徑
read -r -p "本機檔案(相對於 transfer/): " local_rel
read -r -p "遠端目的路徑(例如 /tmp 或 /home/user/transfer ): " remote_path
if ! valid_rel_path "$local_rel"; then
echo "ERR: 本機路徑必須是相對路徑且不可含 .."
exit 1
fi
if [[ "$remote_path" != /* ]] || [[ "$remote_path" == *".."* ]]; then
echo "ERR: 遠端目的路徑必須是絕對路徑且不可含 .."
exit 1
fi
src="$BASE_DIR/$local_rel"
if [[ ! -f "$src" ]]; then
echo "ERR: 找不到檔案: $src"
exit 1
fi
/usr/bin/scp "${SSH_OPTS[@]}" -- "$src" "${ruser}@${host}:${remote_path%/}/"
echo "OK: 上傳完成"
;;
2)
# 下載:遠端:檔案 -> BASE_DIR/目的檔名
read -r -p "遠端檔案完整路徑(例如 /tmp/a.log): " remote_file
read -r -p "本機目的檔名(放在 transfer/ 下): " local_name
if [[ "$remote_file" != /* ]] || [[ "$remote_file" == *".."* ]]; then
echo "ERR: 遠端檔案路徑必須是絕對路徑且不可含 .."
exit 1
fi
if ! [[ "$local_name" =~ ^[A-Za-z0-9._-]+$ ]]; then
echo "ERR: 本機目的檔名不合法"
exit 1
fi
dst="$BASE_DIR/$local_name"
/usr/bin/scp "${SSH_OPTS[@]}" -- "${ruser}@${host}:${remote_file}" "$dst"
/bin/chown optim:optim "$dst"
/bin/chmod 600 "$dst"
echo "OK: 下載完成 -> $dst"
;;
*)
echo "ERR: 模式錯誤"
exit 1
;;
esac
sudo chown root:root /usr/local/bin/optim_scp
sudo chmod 755 /usr/local/bin/optim_scp
/usr/local/bin/optim_sshsudo vi /usr/local/bin/optim_ssh
貼上(把 TARGET_HOST 改成你指定的那台):
#!/bin/bash
set -euo pipefail
TARGET_HOST="10.0.0.10"
valid_user() {
[[ "$1" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]
}
echo "=== SSH (受控) ==="
echo "目的主機固定: $TARGET_HOST"
read -r -p "請輸入登入帳號: " ruser
if ! valid_user "$ruser"; then
echo "ERR: 帳號格式不合法"
exit 1
fi
exec /usr/bin/ssh \
-o "ClearAllForwardings=yes" \
-o "PermitLocalCommand=no" \
-o "ProxyCommand=none" \
-o "ServerAliveInterval=30" \
-o "ServerAliveCountMax=3" \
-l "$ruser" \
"$TARGET_HOST"
sudo chown root:root /usr/local/bin/optim_ssh
sudo chmod 755 /usr/local/bin/optim_ssh
menu.sh在你原本的 case 裡新增選項,例如:
echo "5) SCP 檔案傳輸 (受控)"
echo "6) SSH 到指定主機 (帳號自填)"
並加入:
5)
/usr/local/bin/optim_scp
;;
6)
/usr/local/bin/optim_ssh
;;
你現在用的是 sshd_config 的 ForceCommand /opt/optim-menu/menu.sh,所以:
scp optim@你的主機:... 直接拉檔:通常會失敗(因為 scp 需要走 ssh 的 scp 子系統/命令,而你強制進選單)如果你也需要「外部 scp 到這台主機」那要改成用 Match 區分 Subsystem sftp 或針對 sftp/scp 做不同規則(但那是另一套設計)。
如果你告訴我:
/home/*/upload)我可以把 wrapper 再加上「遠端路徑白名單」與「大小/副檔名限制」避免被拿去搬敏感檔。
信心指數:92%
以下是一套在 Ubuntu 24.04 中,限制使用者 optim 以「密碼登入 SSH 後,只能透過選單執行指定指令」的完整 SOP。
此作法適合維運帳號、代管帳號、委外人員,避免任意下指令。
cdvi / nanobashssh 到別台Ctrl+C 跳出sudo useradd -m optim
sudo passwd optim
sudo mkdir -p /opt/optim-menu
sudo chown root:root /opt/optim-menu
sudo chmod 755 /opt/optim-menu
sudo vi /opt/optim-menu/menu.sh
內容如下(可依需求調整指令):
#!/bin/bash
while true; do
clear
echo "================================="
echo " Optim Maintenance Menu"
echo "================================="
echo "1) 查看系統時間"
echo "2) 查看磁碟使用量"
echo "3) 查看服務狀態 (nginx)"
echo "4) 查看系統負載"
echo "0) 登出"
echo "================================="
read -p "請選擇操作: " choice
case "$choice" in
1)
/usr/bin/date
;;
2)
/usr/bin/df -h
;;
3)
/usr/bin/systemctl status nginx --no-pager
;;
4)
/usr/bin/uptime
;;
0)
exit 0
;;
*)
echo "無效選項"
;;
esac
echo
read -p "按 Enter 繼續..."
done
sudo chown root:root /opt/optim-menu/menu.sh
sudo chmod 755 /opt/optim-menu/menu.sh
⚠️ 使用絕對路徑(/usr/bin/df),避免 PATH 被濫用。
sudo vi /etc/ssh/sshd_config
在檔案最下方加入:
Match User optim
ForceCommand /opt/optim-menu/menu.sh
PasswordAuthentication yes
AllowTcpForwarding no
X11Forwarding no
PermitTTY yes
sudo systemctl restart ssh
sudo chown root:root /home/optim/.bashrc /home/optim/.profile
sudo chmod 644 /home/optim/.bashrc /home/optim/.profile
或直接清空:
sudo truncate -s 0 /home/optim/.bashrc
sudo truncate -s 0 /home/optim/.profile
sudo visudo
確認 沒有:
optim ALL=(ALL) ALL
請實際測試以下行為:
| 測試項目 | 預期結果 |
|---|---|
| SSH 密碼登入 | ✅ 可登入 |
| 登入後看到 bash | ❌ 不可 |
| 出現選單 | ✅ |
嘗試輸入 bash | ❌ 無效 |
| Ctrl + C | ❌ 不可中斷 |
| 選 0 | ✅ 正常登出 |
| scp 傳檔 | ❌ 失敗 |
👉 解法:
chmod +x /opt/optim-menu/menu.sh
👉 一律改成:
/usr/bin/xxx
此 SOP 能達成:
✅ 密碼登入
✅ 僅能選單操作
✅ 指令白名單
✅ 無 Shell、無逃逸
✅ 符合實務維運安全
若你需要:
可直接說明使用情境,我可幫你客製化。
信心指數:96%
以下是你要的 「主機 × 可登入帳號 白名單對應版」optim_ssh,此版本具備:
/usr/local/bin/optim_ssh#!/bin/bash
set -euo pipefail
# ========= 主機 × 帳號 白名單 =========
# 格式:
# "主機|帳號1,帳號2,帳號3"
TARGETS=(
"10.0.0.10|root,admin,ops"
"10.0.0.11|ops"
"server1.internal|deploy,ops"
"server2.internal|admin"
)
# ====================================
valid_user() {
[[ "$1" =~ ^[a-z_][a-z0-9_-]{0,31}$ ]]
}
print_menu() {
echo "=== SSH 受控連線選單 ==="
echo
local i=1
for entry in "${TARGETS[@]}"; do
host="${entry%%|*}"
users="${entry##*|}"
echo " $i) $host (允許帳號: $users)"
((i++))
done
echo " 0) 返回"
echo
}
while true; do
clear
print_menu
read -r -p "請選擇主機: " pick
if [[ "$pick" == "0" ]]; then
exit 0
fi
if ! [[ "$pick" =~ ^[0-9]+$ ]]; then
echo "ERR: 請輸入數字"
read -r -p "按 Enter 繼續..." _
continue
fi
idx=$((pick - 1))
if (( idx < 0 || idx >= ${#TARGETS[@]} )); then
echo "ERR: 選項超出範圍"
read -r -p "按 Enter 繼續..." _
continue
fi
entry="${TARGETS[$idx]}"
host="${entry%%|*}"
allowed_users="${entry##*|}"
read -r -p "請輸入登入帳號: " ruser
if ! valid_user "$ruser"; then
echo "ERR: 帳號格式不合法"
read -r -p "按 Enter 繼續..." _
continue
fi
# 驗證帳號是否在該主機白名單
if ! echo ",$allowed_users," | grep -q ",$ruser,"; then
echo "ERR: 帳號 [$ruser] 不允許登入 $host"
read -r -p "按 Enter 繼續..." _
continue
fi
echo
echo "即將連線:$ruser@$host"
echo "(結束遠端連線請輸入 exit)"
echo
/usr/bin/ssh \
-o "ClearAllForwardings=yes" \
-o "PermitLocalCommand=no" \
-o "ProxyCommand=none" \
-o "ServerAliveInterval=30" \
-o "ServerAliveCountMax=3" \
-l "$ruser" \
"$host"
read -r -p "已離開 $host,按 Enter 回到主選單..." _
done
sudo chown root:root /usr/local/bin/optim_ssh
sudo chmod 755 /usr/local/bin/optim_ssh
| 項目 | 狀態 |
|---|---|
| 主機白名單 | ✅ |
| 每台主機帳號白名單 | ✅ |
| 使用者自行輸入 host | ❌ |
| 任意 ssh 參數 | ❌ |
| Port Forward / Tunnel | ❌ |
| ProxyCommand / 跳板 | ❌ |
| 離開後回選單 | ✅ |
| 搭配 ForceCommand | ✅ |
你現在已經是 「企業級 Jump Menu」 等級了,還可以再加:
如果你要其中任何一項,我可以直接給你「可上線版本」。
信心指數:97%
# 假設後端 WebDAV 在 http://192.168.0.111:8080/dav/
server {
listen 443 ssl;
server_name dav.example.com;
# ... SSL 設定略 ...
client_max_body_size 0; # 不限制上傳大小(視需求)
proxy_http_version 1.1; # WebDAV/長連線建議用 HTTP/1.1
keepalive_requests 1000;
location / {
proxy_pass http://192.168.0.111:8080;
# 讓反代更「透明」
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 重要:保留 WebDAV 特有標頭(部分客戶端很依賴)
proxy_set_header Destination $http_destination;
proxy_set_header Depth $http_depth;
proxy_set_header Overwrite $http_overwrite;
proxy_set_header If-None-Match $http_if_none_match;
proxy_set_header If-Match $http_if_match;
proxy_set_header If-Modified-Since $http_if_modified_since;
proxy_set_header If-Unmodified-Since $http_if_unmodified_since;
proxy_set_header Lock-Token $http_lock_token;
proxy_set_header Timeout $http_timeout;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_set_header Expect $http_expect; # 100-continue
# 大檔/串流上傳(避免先寫到磁碟)
proxy_request_buffering off;
proxy_buffering off;
# 某些 Windows WebDAV 客戶端相容性
chunked_transfer_encoding off; # 視後端/客戶端而定
}
}
小重點
- 不要用
limit_except GET { ... }這類把非 GET/HEAD/POST 擋掉的設定。- 若前端做 Basic/Auth,確定與後端認證邏輯不互相衝突(雙重 401 會讓部分客戶端混亂)。
- 如果需要讓後端知道真正的 Host/Proto,務必帶
X-Forwarded-*。- 檔案很大或想節省 Nginx 磁碟 I/O,關
proxy_request_buffering。- 某些客戶端(特別是 Windows WebClient)對 HTTPS、
OPTIONS、Expect: 100-continue、是否使用 chunked encoding 特別敏感,上面參數可改善相容性。
limit_except)。proxy_http_version 1.1、必要時關 proxy_request_buffering。client_max_body_size)。OPTIONS 回應、100-continue、chunked)。結論:
以docker-compose.yml來建置wordpress服務於8031 port,並且加上 phpMyAdmin,讓你用瀏覽器管理同一個 MySQL。WordPress 仍然以 8031 對外,phpMyAdmin 另外用 8032。
version: '3.9'
services:
wordpress:
image: wordpress:latest
container_name: wordpress_site
ports:
- "8031:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_data:/var/www/html
depends_on:
- db
restart: always
db:
image: mysql:5.7
container_name: wordpress_db
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- db_data:/var/lib/mysql
restart: always
phpmyadmin:
image: phpmyadmin:latest
container_name: wp_phpmyadmin
depends_on:
- db
environment:
PMA_HOST: db
PMA_PORT: 3306
PMA_USER: root
PMA_PASSWORD: rootpassword
UPLOAD_LIMIT: 512M
ports:
- "8032:80"
restart: always
volumes:
wordpress_data:
db_data:
docker-compose.yml。docker-compose up -dhttp://localhost:8031http://localhost:8032(使用 root / rootpassword 或 wpuser / wppassword 登入)建議:上線前把
rootpassword / wppassword換成強密碼;若要改用 MariaDB 也可以把db的 image 換成mariadb:10.11,其餘設定相同。
可以用以下 Bash 腳本,在 Ubuntu 24.04 上自動安裝 Docker CE 與 docker-compose(最新版 Compose Plugin)。
這個腳本會自動處理官方 Docker GPG Key、套件庫設定,以及安裝與啟動服務。
#!/bin/bash
set -e
echo "=== 更新套件列表 ==="
sudo apt-get update -y
sudo apt-get upgrade -y
echo "=== 安裝必要套件 ==="
sudo apt-get install -y ca-certificates curl gnupg lsb-release
echo "=== 新增 Docker 官方 GPG Key ==="
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "=== 新增 Docker 套件來源 ==="
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo "=== 更新套件列表 (Docker) ==="
sudo apt-get update -y
echo "=== 安裝 Docker CE 與 Compose Plugin ==="
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "=== 啟動並設定 Docker 開機自動啟動 ==="
sudo systemctl enable docker
sudo systemctl start docker
echo "=== 將目前使用者加入 docker 群組 (免 sudo) ==="
sudo usermod -aG docker $USER
echo "=== 安裝完成 ==="
docker --version
docker compose version
echo "⚠️ 請重新登入帳號以套用群組變更"
install_docker.shchmod +x install_docker.sh ./install_docker.shdocker 與 docker compose 指令。nginx在啟動的時候報錯
nginx: [emerg] unknown “connection_upgrade” variable
報錯原因是加了proxy_set_header Connection $connection_upgrade這一行導致。
解決辦法:
在http追加如下:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
重啟nginx之後會發現報錯沒了!
1、下載安裝檔:mysql-server_5.7.31-1ubuntu18.04_amd64.deb-bundle.tar
歷史版本下載地址:https://downloads.mysql.com/archives/community/
2、解壓縮安裝檔
#tar zxvf mysql-server_5.7.31-1ubuntu18.04_amd64.deb-bundle.tar
3、先安裝相依性套件
#apt-get update
#apt-get upgrade
#apt-get install ./libmysql*
#apt-get install libtinfo5
4、安裝client 與 Server
#apt-get install ./mysql-community-client_5.7.31-1ubuntu18.04_amd64.deb
#apt-get install ./mysql-client_5.7.31-1ubuntu18.04_amd64.deb
#apt-get install ./mysql-community-server_5.7.31-1ubuntu18.04_amd64.deb
#apt-get install ./mysql-server_5.7.31-1ubuntu18.04_amd64.deb
安裝Server的過程中, 會請你輸入MySQL Server的管理者(root)密碼
5、安裝完畢後可用以下指令檢查
systemctl status mysql.service
systemctl start mysql.service
systemctl stop mysql.service
當任何目錄有 mount, 然後有程式 使用/掛 在那個目錄上的話, 就沒有辦法 umount 掉, 於 umount 時會出現 Device is busy
的訊息.
要怎麼找出是哪個程式掛在那個目錄上? 然後去把那個程式砍掉呢?
假設現在 mount 起來的目錄是 /opt/data
數字代表程序, 而後面c的代表意思參考下列
再用 #kill -9 698434 將程序刪除後即可umount
#umount /opt/data
現在使用完crontab後 (crontab-e),每次都出現crontab:installing new crontab的提示
用crontab-e 編輯的任務在crontab:installing new crontab三分鐘之內是不會執行的,所以你在測試的時候,至少時間後推延三分鐘!
回應”crontab: installing new crontab”表示設定排程任務成功。
要安裝 nginx:
#sudo apt-get install nginx
安裝 php:
假如你下指令只安裝PHP的話,它會連Apache2一起安裝。
若不想安裝Apache2,則必須先裝PHP的其他套件,像是php-fpm、php-cgi。
(php-fpm是nginx執行PHP必要的套件)
#sudo apt install php-fpm php-cgi
再安裝php
#sudo apt install php
沒有指定安裝版本,會直接安裝最新的穩定版本(8.3)。
假如想要安裝舊版本的PHP,在指令中加上版號即可,如:
sudo apt install php7.2 php7.2-fpm php7.2-cgi
設定 nginx:
nginx的設定檔預設在/etc/nginx/sites-available/default
可以去開啟它 #vi /etc/nginx/site-available/default
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock
fastcgi_params SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
改好後記得檢查再重啟nginx
#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
#systemctl restart nginx
上面的完成應該就可以在php檔中執行phpinfo()來看PHP的環境設定。其他的套件就再另外安裝、測試。
#vi /var/www/html/i.php
# vi /var/www/html/i.php
[i]
<?php
phpinfo()
?>
[ESC]:wq
再用瀏覽器開啟該頁面,看是否正常常呈現

下載完後可以使用win10內建的hash值工具certutil來核對
Windows 10 已經有內建計算檔案 hash 值工具 certutil 使用方式如下
certutil -hashfile <filename> <hash-mode>
當你下載了一個檔案, 要確認是否過程有被竄改, 可以檢查hash值, 如下圖所示, 站台提供的hash值是用SHA256方式演算

下載完後可以使用win10內建的hash值工具certutil來核對是否正確, 操作如下:

再把二個值放在一起比對即可確認該檔沒有被竄改過

Ubuntu 自 17.10 以後就可以用 netplan 設置網卡~
查看設定檔
所有放置於 /etc/netplan 底下的 yaml 檔都會影響 netplan 的設置,檢查設定檔看到只有一個 00-installer-config.yaml,內容空空如也,一般來說在安裝系統時有設定過網路就會有,如果沒有的話就自己新增囉:
# 查看設定檔
$ ls /etc/netplan/
00-installer-config.yaml
$ cat 00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
ethernets:
enp0s3:
dhcp4: true
version: 2
手動修改設定檔
配置特定網卡的方法就是在 YAML 內將配置寫入,如下:
network:
ethernets:
ens160:
dhcp4: false
addresses:
- 192.168.26.76/24
routes:
- to: default
via: 192.168.26.1
nameservers:
addresses:
[10.0.1.10,192.168.27.3]
version: 2
設定檔測試
遠端工作時如果套用了錯誤的網路設定檔就失聯了,因此在套用之前可以先用 netplan try 測試測定檔是否設置正確,測試套用後如果沒有在120秒之內進行確認(例如套用了錯誤的網路設定導致使用者斷線)就會回復至先前有效的設定,讓使用者可以再次連上機器修正配置:
$ sudo netplan try
Warning: Stopping systemd-networkd.service, but it can still be activated by:
systemd-networkd.socket
Do you want to keep these settings?
Press ENTER before the timeout to accept the new configuration
Changes will revert in 120 seconds
Configuration accepted.
測試無誤後就可以直接讓設定檔生效了:
$ sudo netplan apply
查看現況
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:bd:b7:dc brd ff:ff:ff:ff:ff:ff
inet 192.168.26.76/24 metric 100 brd 192.168.26.255 scope global dynamic enp0s3
valid_lft 531sec preferred_lft 531sec
inet6 fe80::a00:27ff:febd:b7dc/64 scope link
valid_lft forever preferred_lft forever
查詢時區可用以下指令
timedatectl

查詢可用時區
timedatectl list-timezones
變更時區指令如下
timedatectl set-timezone Asia/Taipei

Ubuntu環境下,如何更改預設的「editor」
操作說明
執行下面的指令,就可以設定改用其他慣用的文字編輯器了。
sudo update-alternatives --config editor
會出現一個類似如下的列表,選擇你預設要使用的文字編輯器就行了。
There are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 15 manual mode
Press <enter> to keep the current choice[*], or type selection number:
我輸入「4」,按下「Enter」。
上面的操作完畢後驗證一下,看看是不是你想要預設使用的編輯器。
執行下面的指令
editor
或是執行下面的指令
sensible-editor
另外也可以直接執行下面的指令,更改成你慣用的文字編輯器
例如:
慣用 nano
sudo update-alternatives --set editor /bin/nan
慣用 vim.tiny
sudo update-alternatives --set editor /usr/bin/vim.tiny
在登入 SSH 時, 可以開啟多個 SSH Client , 使用同一個帳號同時連接, 這個情況有時也是需要的。但如果要限制個別帳號同時登入的數量, 可以用以下方法設定。
在多數 Linux 發行版, 在 /etc/security/ 目錄下的 limits.conf 檔案, 可以設定每個帳號或群組同時建立 SSH session 的數量。編輯這個檔案需要有 root 權限, 可以用 sudo 開啟:
$ sudo vi /etc/security/limits.conf
例如想限制帳號 opencli 只可以同時建立一個 SSH session, 可以加入以下內容:
opencli hard maxlogins 1
如果要限制群組的帳號, 可以用以下格式:
groupname hard maxlogins 1
如果要限制系統所有帳號, 可以用 * 取代帳號名稱:
* hard maxlogins 1
當帳號嘗試建立超出限制的 session 時, 登入時會看到以下錯誤:
Too many logins for ‘opencli’.
Last login: Tue Feb 20 08:12:11 2020 from xxx.xxx.xxx.xxx
Connection to xxx.xxx.xxx.xxx closed.
另一種情況是想限制整台主機可以建立的 session, 可以用 maxsyslogins:
* hard maxsyslogins 1
設定了上面語法後, 系統同時只可以該一個帳號建立一個 SSH sessions.
使用Linux也已經有20年了,從Redhat 6.2開始接觸,大都是以RHEL家族的發行版為主,Redhat 9後因為Redhat政策改變,接著用CentOS 3。
一直到最新的CentOS 8 EOL因為CentOS政策的改變,所以也是要找尋新的發行版來使用。雖然2010左右因為去考LPIC的證照而接觸了Ubuntu,但它是另一個debian的家族。
今天因為要裝MSTR的需求,所以指定要用SUSE,雖然之前有聽過,但從未真正的使用過。今天機緣巧合也算是緣份,剛好操作到它。發現它也是很有特色,沒有fdisk可以用,很多功能都做在yast上面,它幾乎可以涵蓋大多數的常用功能。
但netstat這個常用指令卻無法下,查詢套件也有安裝,後來爬文後才知道改用 ss 。其實也沒有什麼不同,習慣就好了。之後公司的SAP主機都會改用SUSE-Enterprise 熟悉一下也是不錯的機會。
安裝 certbot
官方建議使用 Canonical 的 snapcraft 來進行安裝。
Ubuntu 通常都已預裝好 snapcraft (因為 Ubuntu 的爸爸就是 Canonical),可以使用下方的指令確保使用最新的 snapcraft 版本。
sudo snap install --classic certbot
設定軟連結讓 Certbot 指令可以執行。
sudo ln -s /snap/bin/certbot /usr/bin/certbot
向 Let’s Encrypt 申請憑證
啟動 Certbot,使用手動授權方法搭配 DNS 查問以驗證網域所有權,這會為您的頂層網域及其子網域請求萬用字元憑證。
sudo certbot -d $DOMAIN -d $WILDCARD --manual --preferred-challenges dns certonly