Tôi nghĩ những gì bạn yêu cầu không dễ thực hiện, thậm chí có thể là không thể với kịch bản bash cơ bản.
Do đó, những điều sau đây không thực sự trả lời câu hỏi của bạn mà cung cấp một cách tiếp cận khác cho vấn đề của bạn.
Thay vì sử dụng sshpass
, bạn có thể sử dụng scp
lệnh đơn giản với xác thực khóa công khai mà không cần mật khẩu. Xem [1] nếu bạn không biết nó là gì.
Nếu bạn có ý định sử dụng scp trong các tập lệnh để sử dụng cục bộ , thì đây là cách IMO:
- tạo khóa công khai không có mật khẩu
- sử dụng
ssh-copy-id
để thêm khóa công khai của bạn vào máy chủ
Điều đó đã đủ để có thể chạy lệnh của bạn mà không cần bất kỳ lời nhắc nào:
scp -r me8@host.ca:/cmshome/me/file /home/me/Desktop
Đối với các tập lệnh mà bạn muốn phân phối , sshpass có mật khẩu rõ ràng chắc chắn không phải là ý hay, ít nhất bạn nên sử dụng cờ "-e" của sshpass và để người dùng cung cấp mật khẩu làm biến môi trường để bảo mật tốt hơn.
Trong trường hợp đó, cách tiếp cận khóa công khai ít thuận tiện hơn nhưng vẫn có thể. Nếu bạn không đủ khả năng yêu cầu người dùng tập lệnh tạo khóa công khai, bạn có thể tạo khóa công khai nhanh chóng, sao chép nó trên máy chủ và thực hiện scp
mà không cần bất kỳ lời nhắc nào:
#!/bin/bash
KEY="$HOME/.ssh/id_rsa_example"
if [ ! -e "$KEY" ]; then
ssh-keygen -t rsa -N "" -f "$KEY"
sshpass -e ssh-copy-id -i "${KEY}.pub" me8@host.ca
fi
scp -r me8@host.ca:/cmshome/me/file /home/me/Desktop
Cuối cùng, vẫn có khả năng sử dụng rsync
để tạo thanh tiến trình thay thế:
$ rsync -P --rsh="sshpass -p $PASSWORD ssh -l me8" host.ca:/cmshome/me/file /home/me/Desktop
[1] https://help.ubfox.com/community/SSH/OpenSSH/Keys