Kịch bản của bạn đang cố gắng kết hợp hai phiên dịch viên. Bạn có cả hai #!/bin/bash
và #!/usr/bin/expect
. Điều đó sẽ không làm việc. Bạn chỉ có thể sử dụng một trong hai. Kể từ bash
lần đầu tiên, tập lệnh của bạn đang được chạy dưới dạng tập lệnh bash.
Tuy nhiên, trong tập lệnh của bạn, bạn có expect
các lệnh như spawn
và send
. Vì kịch bản đang được đọc bởi bash
và không phải bởi expect
, điều này thất bại. Bạn có thể khắc phục điều này bằng cách viết các expect
tập lệnh khác nhau và gọi chúng từ bash
tập lệnh của bạn hoặc bằng cách dịch toàn bộ nội dung sang expect
.
Mặc dù vậy, cách tốt nhất và một cách tránh thực tiễn khủng khiếp là có mật khẩu của bạn ở dạng văn bản đơn giản trong một tệp văn bản đơn giản, là thiết lập ssh không mật khẩu thay thế. Theo cách đó, scp
sẽ không cần mật khẩu và bạn không cần expect
:
Đầu tiên, tạo khóa ssh công khai trên máy của bạn:
ssh-keygen -t rsa
Bạn sẽ được yêu cầu nhập cụm mật khẩu mà bạn sẽ được yêu cầu nhập lần đầu tiên khi bạn chạy bất kỳ lệnh ssh nào sau mỗi lần đăng nhập. Điều này có nghĩa là đối với nhiều lệnh ssh hoặc scp, bạn sẽ chỉ phải nhập nó một lần. Để trống cụm mật khẩu để truy cập hoàn toàn không có mật khẩu.
Khi bạn đã tạo khóa công khai của mình, hãy sao chép nó vào từng máy tính trong mạng của bạn:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
Các IPlistfile.txt
phải là một tập tin chứa tên của máy chủ hoặc IP trên mỗi dòng. Ví dụ:
host1
host2
host3
Vì đây là lần đầu tiên bạn thực hiện việc này, bạn sẽ phải nhập mật khẩu thủ công cho từng IP nhưng sau khi thực hiện xong, bạn sẽ có thể sao chép tệp vào bất kỳ máy nào trong số này một cách đơn giản:
scp file user@host1:/path/to/file
Loại bỏ sự mong đợi từ kịch bản của bạn. Bây giờ bạn có quyền truy cập không mật khẩu, bạn có thể sử dụng tập lệnh của mình dưới dạng:
#!/bin/bash
echo "I will fail if you give junk values!!"
echo " "
echo "Enter file name: "
read filePath
echo " "
echo "Where you want to copy?"
echo "Enter"
echo "1. if Host1"
echo "2. if Host2"
echo "3. if Host3"
read choice
echo " "
if [ $choice -eq "1" ]
then
scp filePath uname@host1:/usr/tmp
elif [ $choice -eq "2" ]
then
scp filePath uname@host2:/usr/tmp
elif [ $choice -eq "3" ]
then
scp filePath uname@host3:/usr/tmp
else
echo "Wrong input"
fi