Chạy ssh-agent từ tập lệnh shell


19

Tôi đang cố gắng tạo một tập lệnh shell, trong số những thứ khác, khởi động ssh-agent và thêm một khóa riêng cho tác nhân. Thí dụ:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

Vấn đề với điều này là ssh-agent dường như khởi động một trường hợp khác của $ SHELL (trong trường hợp của tôi là bash) và theo quan điểm của kịch bản, nó đã thực thi mọi thứ và ssh-add và mọi thứ bên dưới nó không bao giờ chạy.

Làm cách nào tôi có thể chạy ssh-agent từ tập lệnh shell của mình và giữ cho nó di chuyển xuống danh sách các lệnh?

Câu trả lời:


8

ssh-agent được cho là bắt đầu một phiên và khi nó kết thúc phiên người dùng kết thúc. Vì vậy, bất kỳ lệnh nào sau ssh-agent có thể sẽ được thực thi sau khi đăng xuất.

Những gì bạn muốn là một session-scriptchứa các lệnh phiên của bạn như thế này:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Sau đó bắt đầu ssh-agent session-script.


Cảm ơn! Tạo một tập lệnh riêng biệt và kết thúc tập lệnh bằng exitthủ thuật.
Dan

2
một kịch bản phiên là gì?
Alexander Mill

15

Đặt phần sau vào đầu tập lệnh của bạn:

eval `ssh-agent`

Kịch bản của bạn sẽ trông như thế này:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

Giải trình

Các backticks xung quanh ssh-agentthu thập đầu ra của nó. evalthu thập đầu ra đó, nối nó thành một lệnh duy nhất và sau đó thực thi lệnh đó. Sau đó, bạn có thể sử dụng ssh-addđể cung cấp thông tin quan trọng của bạn.


9
Đây chính xác là những gì tôi cần, cảm ơn, mặc dù đáng để chỉ ra rằng backticks đang trên đường ra. Trong hình thức bash mới, nó phải làeval $(ssh-agent)
sibaz

Giải pháp này không hiệu quả với tôi cho đến khi tôi đặt bash -iphần cuối của kịch bản.
Adolfo Correa

6

Tôi có xu hướng làm một cái gì đó như thế này trong các kịch bản yêu cầu một tác nhân.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

Về cơ bản, điều đầu tiên kịch bản kiểm tra xem một tác nhân có đang chạy hay không. Nếu nó không thực thi được sử dụng để bắt đầu một quy trình mới thay cho tập lệnh. Tác nhân được bắt đầu, các khóa được thêm vào và cuối cùng, đoạn script được gọi lại (xem phần $0).


Nhưng điều đó sẽ không bảo tồn bất kỳ tham số kịch bản. Và nếu bất kỳ tham số nào có khoảng trắng, sẽ không dễ dàng vượt qua chúng.
Denilson Sá Maia

3
Bạn có thể sử dụng .. "ssh-add ; $0 $*", hoặc .. "ssh-add ; $0 $@"thay vào đó, có thể làm việc. Điều này sẽ không hoàn hảo, nhưng chắc chắn sẽ hoạt động trong nhiều trường hợp. Giải pháp tốt nhất là hầu như luôn luôn có đại lý của bạn chạy trước mọi thứ khác, đây chỉ là một cái gì đó có thể hữu ích trong các trường hợp tối nghĩa.
Zoredache

6

Tôi tìm thấy điều này làm việc cho tôi.

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

Tôi tạo quy trình ssh-agent, thêm khóa, làm những gì tôi cần làm, sau đó giết nó. Không cần kiểm tra nếu nó chạy sau.


4

Tốt hơn là sử dụng móc khóa trong trường hợp này

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Thêm vào .bashrc của bạn như sau:

eval `keychain --eval id_rsa`

Tốt hơn? Tại sao nó tốt hơn?
JFlo

@JFlo "Tốt hơn" trong đó, nó sẽ lưu các biến env thành $ HOME / .keychain / <file>. Chạy lệnh đó một lần nữa sẽ chọn một ssh-agent hiện có nếu nó vẫn đang chạy. Sau đó, nó có thể được sử dụng lại giữa shell / script. Trong một số trường hợp không an toàn, vì vậy bạn phải thực hiện cuộc gọi đó. Đối với tôi, đó là một cải tiến so với một số kịch bản mà tôi đã viết để hoàn thành nhiệm vụ tương tự
Scott Carlson

2

Tôi đã tìm thấy với giải pháp của Zoredache, khóa sẽ có sẵn cho bất kỳ shell nào xảy ra để chia sẻ cùng một tác nhân ssh như shell được gọi là script. Tôi muốn tránh điều này trong một tập lệnh yêu cầu quyền truy cập root vào một máy từ xa, vì lý do bảo mật rõ ràng.

Tôi đã tìm thấy đặt shebang sau vào đầu kịch bản hoạt động:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

Tôi đã thử và rất nhiều và giải pháp cuối cùng có hiệu quả là thay thế cụm mật khẩu của tôi bằng một chuỗi trống.

ssh-keygen -p

Đây là một thực hành rất không an toàn. Tại sao phải sử dụng ssh cả? Nếu bạn không bảo vệ khóa riêng của mình, bạn cũng có thể nói chuyện bằng văn bản rõ ràng.
JFlo

@JFlo: không phải nếu hệ thống máy khách của bạn đủ an toàn, có thể là như vậy. Đặc biệt là nếu bạn (có thể và làm) thêm ACL, SELinux hoặc tương tự, điều này dễ dàng với một tệp tĩnh nhưng ít hơn với ổ cắm ngẫu nhiên của ssh-agent. Điều đó nói rằng tôi thường không đề nghị nó là lựa chọn đầu tiên.
dave_thndry_085

Mặc dù đó là một quy trình rất hữu ích mà bạn cung cấp, tôi không nghĩ nó trả lời bất cứ điều gì về câu hỏi của OP.
Alexander Bird
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.