Trong chuỗi bài viết liên quan đến lập trình Shell Script, chúng ta sẽ tiếp tục học cách viết một script đơn giản để thực hiện kết nối đến một máy chủ Linux từ xa và thực hiện các lệnh trên đó. Để bắt đầu quá trình kết nối đến máy chủ, bước đầu tiên là thiết lập một SSH Key để không cần phải nhập mật khẩu khi sử dụng lệnh SSH. Bạn có thể tham khảo bài viết sau để biết cách thực hiện: “Tạo và Kết nối đến Máy Chủ bằng SSH Keys”. Tạo và kết nối tới Server sử dụng SSH Keys.
Kết nối SSH và chạy command
Đoạn script bên dưới, thực hiện kết nối ssh tới remote server chạy lệnh “uptime“.
#!/usr/bin/env bash # Define variables HOST=vinasupport.com USER=root PORT=22 COMMAND="uptime" # SSH connect output=$(ssh -o StrictHostKeyChecking=no ${USER}@${HOST} -p ${PORT} ${COMMAND}) echo $output
Tham số -o để tự động thêm host vào file known_hosts trong trường hợp kết nối đầu tiên các bạn sẽ gặp phải message như sau:
The authenticity of host ‘[vinasupport.com]’ can’t be established.
ECDSA key fingerprint is SHA256:Ge8ttoZq6AjZqQ4vWAk2gGOz9U1Vxx1123456677
Are you sure you want to continue connecting (yes/no)?
Kết nối SSH và chạy nhiều command
Giờ chúng ta update lại code để có thể chạy 1 danh sách các command trên remote server
#!/usr/bin/env bash # Define variables HOST=vinasupport.com USER=root PORT=22 IFS='' read -r -d '' COMMAND <<'EOF' cd /tmp echo 'We are vinasupport team' > test.txt cat test.txt EOF echo "$COMMAND" # SSH connect output=$(ssh -o StrictHostKeyChecking=no ${USER}@${HOST} -p ${PORT} "$COMMAND") echo $output
Kết quả:
Kết nối SSH với password
Hai ví dụ ở trên cho thấy chúng ta đã tạo SSH Keys để thiết lập kết nối mà không cần phải nhập mật khẩu. Tuy nhiên, nếu bạn muốn sử dụng mật khẩu để xác thực SSH, bạn có thể cài đặt một package có tên gọi là “sshpass”.
Cài đặt sshpass
# On Ubuntu/Debian sudo apt-get install sshpass # On Redhat/CentOS sudo yum install sshpass
Sau đó update lại script như sau:
#!/usr/bin/env bash # Define variables HOST=vinasupport.com USER=root PASSWORD=123456 PORT=22 IFS='' read -r -d '' COMMAND <<'EOF' cd /tmp echo 'We are vinasupport team' > test.txt cat test.txt EOF echo "$COMMAND" # SSH connect output=$( sshpass -p '${PASSWORD}' ssh -o StrictHostKeyChecking=no ${USER}@${HOST} -p ${PORT} "$COMMAND") echo $output
Trong đó:
- sshpass với tham số -p: Sử dụng password ở dạng plan text
- sshpass với tham số -f: Sử dụng password trong 1 file, chúng ta cần tạo 1 file lưu password
- sshpass với tham số -3: Sử dụng password của 1 biến môi trường
Nếu có khó khăn gì thì các bạn vui lòng để lại comment bên dưới nhé!