Có ssh-add để yên lặng nếu khóa đã có


16

Tôi muốn đặt lên ssh-add /path/to/special_keyhàng đầu của một kịch bản. Điều này hoạt động tốt, nhưng nó luôn luôn nhắc cho cụm mật khẩu. Điều này thật lạ, và hơi khó chịu, vì nó vẫn yêu cầu cụm mật khẩu ngay cả khi ssh-add -lhiển thị khóa đã được thêm.

Có cách nào để nói với nó: "thêm khóa này và hỏi cụm mật khẩu nếu chưa được thêm, nếu không thì không làm gì cả"?


Câu hỏi tương tự tại superuser.com/q/325662
Darren Cook

Câu trả lời:


20

Tôi không thấy bất kỳ tùy chọn nào để ssh-add giúp đạt được kết quả mong muốn của bạn, nhưng thật dễ dàng để giải quyết vấn đề này, đặc biệt là bạn quan tâm đến một khóa cụ thể.

Đầu tiên, lấy dấu vân tay cho Special_key của bạn:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

Giả sử dấu vân tay này trông giống như 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Sau đó, ở đầu tập lệnh của bạn, hãy sử dụng ssh-add -lđể kiểm tra xem khóa đó đã được tải chưa, trước khi nhắc thêm nó:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

Bạn có thể gấp tất cả lại thành một dòng nếu bạn muốn:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key

Một lớp lót đang hoạt động độc đáo, cảm ơn!
Darren Cook

1
Tôi thấy phần mềm đơn giản này dễ hiểu hơn một chút và tốt hơn vì nó tránh được ssh-keygen(sau tất cả, tôi không muốn tạo bất kỳ khóa nào), thay vào đó sử dụng đường dẫn chính:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus

1
ssh-keygentrong câu trả lời không tạo ra khóa - giống như ssh-add -ltrong ví dụ của bạn không thực sự thêm bất cứ thứ gì. Cờ sửa đổi hành vi của các lệnh để nó không khớp chính xác với tên. Lưu ý rằng các phiên bản này có chức năng khác nhau - nếu kiểm tra theo đường dẫn và khóa tại đường dẫn đó thay đổi, phiên bản của bạn sẽ không nhận được. Phiên bản trong câu trả lời cũng sẽ phát hiện khóa hiện tại bất kể nó được tải từ đâu.
Richlv

5

Không có cách trực tiếp để kiểm tra bằng cách sử dụng ssh-addnhưng bạn có thể sử dụng ssh-keygenvà một số kịch bản để kiểm tra.

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

Ở trên sẽ in yesnếu dấu vân tay được biểu thị bằng tệp /path/to/special_keycó trong ssh-add -lđầu ra của.

Thí dụ

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

Trường hợp nội dung đầu ra ssh-keygen -lf /path/to/special_keytrông như thế này:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

Và chúng tôi đang sử dụng `awk '{print $ 2}' để chỉ chọn cột thứ 2 chứa dấu vân tay, tức là:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

Người giới thiệu


3

Bạn có thể có lý do cụ thể để sử dụng ssh-addmột cách rõ ràng, nhưng nếu bạn chỉ muốn "Tôi muốn được nhắc nhập cụm mật khẩu của mình ngay lần đầu tiên tôi sử dụng khóa, nhưng không phải sau đó," openssh có một giải pháp đơn giản hơn:

Đặt AddKeysToAgent yestrong .ssh/configtập tin của bạn .


Cảm ơn. Điều đó rõ ràng đã được thêm vào trong ssh 7.2 (Ubuntu 18 dường như là trên phiên bản 7.6).
Darren Cook

Yup, "AddKeysToAgent không được hỗ trợ bởi phiên bản openssh của tôi" là một lý do chính đáng để sử dụng ssh-add một cách rõ ràng ;-)
Nate

0

ssh-add -K FILElàm việc tốt cho tôi trên Mac.
Nó vẫn hiển thị dòng "Nhận dạng đã thêm:" nhưng không yêu cầu cụm mật khẩu.

Từ trang nam:

-K Khi thêm danh tính, mỗi cụm mật khẩu cũng sẽ được lưu trong móc khóa của người dùng. Khi xóa danh tính bằng -d, mỗi cụm mật khẩu sẽ bị xóa khỏi nó.

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.