本文分為兩大主題:第一部分詳細說明 Linux 符號連結 (Symbolic Link) 的建立、查詢、刪除等常用操作;第二部分提供 Expect 腳本實現自動化 SCP 檔案傳輸,並搭配 Shell 腳本達成批量部署多台伺服器。
ls -l 輸出權限欄位首字母為 l 表示符號連結,後面顯示 link_name -> target。ln -s /path/to/target /path/to/link_name
# 範例:在家目錄建立指向 /var/www 的 web 連結
ln -s /var/www/ ~/web
# 1. ls 配合 grep/awk 列出當前目錄所有連結
ls -l | grep "^l" | awk '{print $9}'
# 2. find 專門搜尋連結檔案 (含子目錄)
find . -type l -print
# 3. 顯示連結指向的真實路徑
ls -l link_name | awk '{print $11}'
# 或更簡潔的
readlink link_name
rm link_name # 僅刪除連結檔案本身
unlink link_name # 同義
Expect 是自動化互動式程式 (如 ssh, scp, ftp) 的神器,透過「期望字串 → 發送回應」模式處理密碼提示。
#!/usr/bin/expect
set host_ip [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host_ip:$dest_file
expect {
"yes/no" { send "yes\r"; exp_continue } # 首次連線接受金鑰
"password:" { send "$password\r" }
}
expect eof
#!/bin/bash
# 用法: ./batch_scp.sh hosts.list /local/src /remote/dest
list_file=$1
src_file=$2
dest_file=$3
while read -r line; do
# 格式: IP username password
host_ip=$(echo $line | awk '{print $1}')
username=$(echo $line | awk '{print $2}')
password=$(echo $line | awk '{print $3}')
echo "Deploying to $host_ip ..."
./expect_scp "$host_ip" "$username" "$password" "$src_file" "$dest_file"
done < "$list_file"
192.168.1.10 root password123
192.168.1.11 admin my$ecretPass # 特殊字符需轉義或用單引號包裹
expect_scp 有執行權限:chmod +x expect_scp./batch_scp.sh hosts.list /root/app.jar /opt/app/app.jar$, [, ] 等需轉義,建議改用 SSH 金鑰認證徹底解決。yes/no,Expect 腳本已處理;亦可在 ~/.ssh/config 設定 StrictHostKeyChecking no。xargs -P 或 GNU Parallel 平行執行 Expect 腳本。