🔑 Sử Dụng SSHPass
📋 Giới Thiệu
SSHPass là một công cụ dòng lệnh cung cấp mật khẩu cho SSH một cách tự động. Nó giải quyết vấn đề nhập mật khẩu thủ công khi:
- Kết nối SSH
- Sử dụng SCP để copy file
- Sử dụng SFTP để truyền file
- Thực thi lệnh từ xa qua SSH
Ưu Điểm
- ✅ Tự động hóa kết nối SSH không cần nhập mật khẩu
- ✅ Tích hợp dễ dàng vào script
- ✅ Hỗ trợ nhiều phương thức cung cấp mật khẩu
- ✅ Có thể kết hợp với các công cụ khác như rsync, scp
Nhược Điểm
- ⚠️ Rủi ro bảo mật khi lưu mật khẩu trong file hoặc script
- ⚠️ Không an toàn bằng SSH key authentication
- ⚠️ Mật khẩu có thể bị lộ trong process list
Các Trường Hợp Sử Dụng
-
Tự Động Hóa Backup
- Backup database tự động
- Sao lưu file tự động
- Đồng bộ dữ liệu giữa các server
-
Quản Trị Hệ Thống
- Cập nhật nhiều server cùng lúc
- Triển khai ứng dụng tự động
- Thu thập log và monitoring
-
CI/CD Pipeline
- Tự động triển khai code
- Cập nhật cấu hình
- Khởi động lại service
-
Giám Sát Hệ Thống
- Thu thập metrics
- Kiểm tra trạng thái server
- Gửi cảnh báo tự động
⚠️ Cảnh Báo Bảo Mật
Lưu ý quan trọng
SSHPass có thể tiện lợi nhưng tiềm ẩn rủi ro bảo mật (rò rỉ mật khẩu). Hãy cân nhắc kỹ trước khi sử dụng trong môi trường production.
📦 Cài Đặt
# Cài đặt SSHPass
sudo apt -y install sshpass
🛠️ Cách Sử Dụng
1. Sử Dụng Trực Tiếp với Mật Khẩu
# Cú pháp: -p [mật khẩu]
# Thêm StrictHostKeyChecking=no cho lần kết nối đầu tiên
sshpass -p 'your_password' ssh -o StrictHostKeyChecking=no [email protected] hostname
tip
Thay your_password
bằng mật khẩu thực tế và 192.168.1.100
bằng địa chỉ server của bạn
2. Sử Dụng File Chứa Mật Khẩu
# Tạo file chứa mật khẩu
echo 'your_password' > ~/.ssh/pass.txt
# Đặt quyền phù hợp cho file
chmod 600 ~/.ssh/pass.txt
# Sử dụng file mật khẩu (-f)
sshpass -f ~/.ssh/pass.txt ssh [email protected] hostname
3. Sử Dụng Biến Môi Trường
# Đặt biến môi trường
export SSHPASS='your_password'
# Sử dụng biến môi trường (-e)
sshpass -e ssh [email protected] hostname
🔄 Ví Dụ Thực Tế
1. Script Tự Động Backup
#!/bin/bash
# Backup script sử dụng SSHPass
REMOTE_HOST="192.168.1.100"
REMOTE_USER="backup_user"
REMOTE_PASS="your_backup_password"
BACKUP_DIR="/path/to/backup"
sshpass -p "$REMOTE_PASS" rsync -avz \
-e "ssh -o StrictHostKeyChecking=no" \
$REMOTE_USER@$REMOTE_HOST:$BACKUP_DIR ./backup/
2. Thực Thi Lệnh từ xa
# Thực thi nhiều lệnh
sshpass -p 'your_password' ssh [email protected] '
df -h
free -m
uptime
'
📱 Ứng Dụng Thực Tế
1. Tự Động Hóa Backup Database
#!/bin/bash
# Script backup database tự động
DB_HOST="192.168.1.100"
DB_USER="db_admin"
DB_PASS="your_db_password"
BACKUP_PATH="/backup/mysql"
DATE=$(date +%Y%m%d)
# Backup database và copy qua server backup
mysqldump -h $DB_HOST -u $DB_USER -p$DB_PASS --all-databases | gzip > /tmp/db_$DATE.sql.gz
sshpass -p 'backup_server_pass' scp /tmp/db_$DATE.sql.gz [email protected]:$BACKUP_PATH/
# Xóa file tạm
rm /tmp/db_$DATE.sql.gz
2. Giám Sát Hệ Thống Tự Động
#!/bin/bash
# Script kiểm tra hệ thống nhiều server
# Danh sách server cần kiểm tra
declare -A servers=(
["web01"]="192.168.1.101"
["web02"]="192.168.1.102"
["db01"]="192.168.1.103"
)
# Mật khẩu SSH
SSH_PASS="your_monitor_password"
# Kiểm tra từng server
for server in "${!servers[@]}"; do
echo "Checking $server (${servers[$server]})..."
sshpass -p "$SSH_PASS" ssh -o StrictHostKeyChecking=no \
monitor@${servers[$server]} '
echo "Memory Usage:"
free -h
echo "Disk Usage:"
df -h
echo "Load Average:"
uptime
echo "-------------------"
'
done
3. Triển Khai Ứng Dụng Tự Động
#!/bin/bash
# Script triển khai code tự động
APP_PATH="/var/www/app"
DEPLOY_USER="deployer"
DEPLOY_PASS="your_deploy_password"
# Danh sách server web
WEB_SERVERS=(
"192.168.1.201"
"192.168.1.202"
"192.168.1.203"
)
# Triển khai code lên các server
for server in "${WEB_SERVERS[@]}"; do
echo "Deploying to $server..."
# Copy code mới
sshpass -p "$DEPLOY_PASS" rsync -avz -e "ssh -o StrictHostKeyChecking=no" \
./dist/ $DEPLOY_USER@$server:$APP_PATH/
# Khởi động lại service
sshpass -p "$DEPLOY_PASS" ssh $DEPLOY_USER@$server \
"sudo systemctl restart nginx php-fpm"
done
4. Tự Động Hóa Cập Nhật Hệ Thống
#!/bin/bash
# Script cập nhật hệ thống tự động
SERVER_LIST="/path/to/server_list.txt"
ADMIN_PASS="your_admin_password"
# Đọc danh sách server và thực hiện cập nhật
while IFS= read -r server; do
echo "Updating $server..."
sshpass -p "$ADMIN_PASS" ssh -o StrictHostKeyChecking=no \
admin@$server '
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt upgrade -y
sudo apt autoremove -y
if [ -f /var/run/reboot-required ]; then
echo "Reboot required on $HOSTNAME"
fi
'
done < "$SERVER_LIST"
Lưu ý về Bảo Mật
- Luôn mã hóa các file chứa mật khẩu
- Sử dụng user với quyền hạn tối thiểu cần thiết
- Giám sát log để phát hiện sử dụng trái phép
- Cân nhắc sử dụng SSH key thay vì mật khẩu khi có thể
⚙️ Tùy Chọn Bổ Sung
Tùy Chọn | Mô Tả |
---|---|
-p | Chỉ định mật khẩu trực tiếp |
-f | Đọc mật khẩu từ file |
-e | Đọc mật khẩu từ biến môi trường SSHPASS |
-P | Chuỗi prompt để nhận dạng yêu cầu mật khẩu |
🔒 Các Biện Pháp Bảo Mật
- Quyền File:
# Đặt quyền chặt chẽ cho file chứa mật khẩu
chmod 600 ~/.ssh/pass.txt
- Mã Hóa:
- Cân nhắc mã hóa file chứa mật khẩu
- Sử dụng vault hoặc secret management system
- Giới Hạn Truy Cập:
- Hạn chế quyền thực thi script
- Giám sát log sử dụng