Thay vì nhập mật khẩu của bạn nhiều lần, bạn có thể sử dụng pssh
và -A
chuyển đổi mật khẩu để nhắc nhập một lần, sau đó cung cấp mật khẩu cho tất cả các máy chủ trong danh sách.
LƯU Ý:ssh-copy-id
Tuy nhiên, sử dụng phương pháp này không cho phép bạn sử dụng , do đó, bạn sẽ cần cuộn phương thức của riêng mình để nối thêm tệp khóa pub pub vào tệp tài khoản từ xa ~/.ssh/authorized_keys
.
Thí dụ
Đây là một ví dụ thực hiện công việc:
$ cat ~/.ssh/my_id_rsa.pub \
| pssh -h ips.txt -l remoteuser -A -I -i \
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7
Kịch bản trên thường có cấu trúc như vậy:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
pssh
Chi tiết cấp cao
cat <pubkey>
xuất tệp khóa công khai sang pssh
pssh
sử dụng -I
chuyển đổi để nhập dữ liệu qua STDIN
-l <remote user>
là tài khoản của máy chủ từ xa (chúng tôi giả sử bạn có cùng tên người dùng trên các máy chủ trong tệp IP)
-A
nói pssh
để yêu cầu mật khẩu của bạn và sau đó tái sử dụng nó cho tất cả các máy chủ mà nó kết nối tới
-i
yêu pssh
cầu gửi bất kỳ đầu ra nào đến STDOUT thay vì lưu trữ nó trong các tệp (hành vi mặc định của nó)
'...cmds to add pubkey...'
- đây là phần khó nhất trong những gì đang diễn ra, vì vậy tôi sẽ tự mình giải quyết vấn đề này (xem bên dưới)
Các lệnh đang được chạy trên các máy chủ từ xa
Đây là các lệnh pssh
sẽ chạy trên mỗi máy chủ:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
Theo thứ tự:
đặt ô của người dùng từ xa thành 077, điều này là để bất kỳ thư mục hoặc tệp nào chúng tôi sẽ tạo, sẽ có quyền của họ được đặt tương ứng như vậy:
$ ls -ld ~/.ssh ~/.ssh/authorized_keys
drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
-rw------- 1 remoteuser remoteuser 771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
tạo thư mục ~/.ssh
và bỏ qua cảnh báo chúng tôi nếu nó đã ở đó
- đặt một biến,
$afile
với đường dẫn đến tệp ủy quyền
cat - >> $afile
- lấy đầu vào từ STDIN và nối vào tệp ủy quyền
sort -u $afile -o $afile
- sắp xếp duy nhất tệp ủy quyền_key và lưu nó
LƯU Ý: Bit cuối cùng đó là để xử lý trường hợp bạn chạy nhiều lần trên các máy chủ tương tự. Điều này sẽ loại bỏ pubkey của bạn khỏi bị nối thêm nhiều lần.
Chú ý các dấu hiệu đơn!
Cũng đặc biệt chú ý đến thực tế là tất cả các lệnh này được lồng bên trong các dấu ngoặc đơn. Điều đó rất quan trọng, vì chúng tôi không muốn $afile
được đánh giá cho đến khi nó thực thi trên máy chủ từ xa.
' \
..cmds... \
'
Tôi đã mở rộng ở trên để dễ đọc hơn ở đây, nhưng tôi thường chạy tất cả trên một dòng như vậy:
$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'
Tài liệu khen thưởng
Bằng cách sử dụng, pssh
bạn có thể từ bỏ việc xây dựng các tệp và cung cấp nội dung động bằng cách sử dụng -h <(...some command...)
hoặc bạn có thể tạo danh sách IP bằng pssh
các công tắc khác , -H "ip1 ip2 ip3"
.
Ví dụ:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
Ở trên có thể được sử dụng để trích xuất một danh sách IP từ ~/.ssh/config
tệp của tôi . Tất nhiên bạn cũng có thể sử dụng printf
để tạo nội dung động:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
Ví dụ:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
Bạn cũng có thể sử dụng seq
để tạo các chuỗi số được định dạng quá!
Tài liệu tham khảo & công cụ tương tự pssh
Nếu bạn không muốn sử dụng pssh
như tôi đã làm ở trên, có một số tùy chọn khác có sẵn.