Lệnh xóa khóa ủy quyền ssh trên máy chủ


30

Có một lệnh (hoặc một lớp lót) để loại bỏ khóa ssh trên máy chủ không? Một cái gì đó giống như đối diện của ssh-copy-id?


2
Một số phần mềm máy chủ SSH hỗ trợ giao thức RFC 4819 để quản lý các khóa SSH được ủy quyền, nhưng rất hiếm khi nó gần như không có trên Linux :(
grawity

3
Câu hỏi tuyệt vời, đây thực sự là thiếu chức năng đối với ssh-copy-id để tạo điều kiện xoay vòng phím.
Zabuzzman

1
Đáng chú ý là ssh-keygennó cung cấp -Rtùy chọn để loại bỏ các phím khỏi known_hosts, nhưng thật đáng buồn là ssh-keygen -R <HOSTNAME> -f ~/.ssh/authorized_keysnó không hoạt động. Tôi sẽ sử dụng sedtùy chọn dưới đây, thay vào đó.
Chấn thương kỹ thuật số

Câu trả lời:


10

Như Ignatio đề nghị điều này có thể được thực hiện với grep -v.

Dưới đây là một ví dụ loại bỏ khóa chứa some unique stringhoặc chỉ xóa authorized_keystệp khi không còn khóa nào khác.

if test -f $HOME/.ssh/authorized_keys; then
  if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then
    cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  else
    rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  fi;
fi

Thay thế some unique stringbằng một cái gì đó chỉ tồn tại trong khóa bạn muốn loại bỏ.

Là một oneliner trên ssh, điều này trở thành

ssh hostname 'if test -f $HOME/.ssh/authorized_keys; then if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; else rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; fi; fi'

Đã thử nghiệm trên Linux (SLES) và HP-UX.


2
xem câu trả lời dưới đây: sedtốt hơn khi làm điều này
woohoo

25

sed cung cấp một giải pháp nhỏ gọn:

sed -i.bak '/REGEX_MATCHING_KEY/d' ~/.ssh/authorized_keys

Điều này sẽ lưu bản gốc authorized_keystrong authorized_keys.bak. Nếu bạn không muốn sao lưu thì chỉ cần thay đổi -i.bakthành -i.

Bạn thậm chí có thể loại bỏ nhiều khóa:

sed -i.bak '/REGEX1/d; /REGEX2/d' ~/.ssh/authorized_keys

Một mẹo nhỏ duy nhất ở đây là các ký tự đặc biệt trong regex cần phải được thoát .


Nếu bạn chỉ sử dụng các ký tự base64 trong tệp khóa công khai (ví dụ awk '{print $2}' ~/.ssh/id_rsa.pub:), thì bạn không cần phải lo lắng về việc thoát bất kỳ ký tự đặc biệt nào.
Juan

7

Không. Bạn sẽ cần SSH và sử dụng sedhoặc grepxóa khóa khỏi tệp.


Cảm ơn bạn. Tôi sẽ giữ câu hỏi mở lâu hơn một chút để xem ai đó cũng có thể cung cấp một tập lệnh ngược lại với ssh-copy-id
grm

@grm: Tôi khuyên bạn nên giữ câu hỏi mở mãi mãi hoặc ít nhất là cho đến khi ssh-undo-copy-id được triển khai! ;-)
Max L.

0

Phil đã trả lời câu hỏi này nhưng tôi muốn làm thêm và giúp bạn dễ dàng hơn. Và vì bạn đang hỏi ngược lại ssh-copy-id, tôi giả sử bạn muốn chạy nó trên máy được ủy quyền.

Các khóa ssh chỉ chứa các ký tự base64 . Vì vậy, bạn có thể sử dụng một char như dấu phân cách sed mà không có trong danh sách đó. Hãy để chúng tôi sử dụng '#'.

ssh root@<hostname> -o PasswordAuthentication=no "sed -i.bak 's#`cat ~/.ssh/id_rsa.pub`##' ~/.ssh/authorized_keys"

Thay thế tên máy chủ bằng IP máy chủ.

Tùy chọn Mật khẩu xác thực sẽ khiến ssh thất bại nếu nó hỏi mật khẩu


'Nhận xét' trong khóa pub có thể không có ký tự base64. Nếu nó có "#", thì ví dụ của bạn sẽ bị hỏng. Có thể sử dụng awk '{print $2}' ~/.ssh/id_rsa.pubvới một số sedhoặc grep -vthay vào đó.
Juan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.