Bạn có thể có nhiều hơn một tập tin ~ / .ssh / config không?


82

Chúng tôi có một máy chủ pháo đài mà chúng tôi sử dụng để kết nối với nhiều máy chủ và .ssh / config của chúng tôi đã tăng lên hơn một nghìn dòng (chúng tôi có hàng trăm máy chủ mà chúng tôi kết nối). Điều này bắt đầu hơi khó sử dụng và tôi muốn biết liệu có cách nào để chia tập tin .ssh / config thành nhiều tập tin hay không. Lý tưởng nhất, chúng tôi sẽ chỉ định ở đâu đó rằng các tệp khác sẽ được coi là tệp .ssh / config, có thể như:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

Tôi đã đọc tài liệu về ssh / config và tôi không thấy rằng điều này là có thể. Nhưng có lẽ ai đó đã có một vấn đề tương tự và đã tìm ra giải pháp.


Yêu cầu mỗi người dùng đăng nhập vào máy chủ pháo đài với tên người dùng của riêng họ. Ngoài ra, những gì bạn đang đưa vào tập tin cấu hình yêu cầu một mục nhập cho mỗi máy chủ? Bạn không thể đặt một số mặc định phổ biến?
Jed Daniels

1
Câu hỏi tương tự trên superuser.com: superuser.com/questions/247564/ từ
guettli

1
Ngay sau đó, trong OpenSSH 7.3 sẽ có thể. bugzilla.mindrot.org/show_orms.cgi?id=1585#c25
azmeuk

Câu trả lời:


51

Các ~/.ssh/configtập tin không có một chỉ thị cho bao gồm các file khác, có thể liên quan đến kiểm tra SSH cho phép tập tin.

Các đề xuất xung quanh điều này có thể bao gồm một tập lệnh để xử lý một số thay đổi cùng nhau trên hệ thống hoặc thông qua các móc kiểm tra trên kho lưu trữ. Người ta cũng có thể nhìn vào các công cụ như Con rối hoặc Augeas.

Tuy nhiên, bạn tiếp cận nó, tuy nhiên, bạn sẽ phải ghép các tệp riêng lẻ thành một tệp duy nhất từ ​​bên ngoài tệp.

$ cat ~/.ssh/config_* >> ~/.ssh/config

lưu ý: ghi đè: > vs phụ lục:>>

Cập nhật tháng 12 năm 2017:

Từ 7.3p1 trở lên, có tùy chọn Bao gồm. Cho phép bạn bao gồm các tập tin cấu hình.

Include
    Include the specified configuration file(s).  Mul‐
    tiple pathnames may be specified and each pathname
    may contain glob(3) wildcards and, for user config‐
    urations, shell-like “~” references to user home
    directories.  Files without absolute paths are
    assumed to be in ~/.ssh if included in a user con‐
    figuration file or /etc/ssh if included from the
    system configuration file.  Include directive may
    appear inside a Match or Host block to perform con‐
    ditional inclusion.

Cảm ơn Jeff, đây là một ý tưởng tốt. Tôi không biết quá nhiều về Puppet hoặc Augeas, vì vậy để giữ mọi thứ đơn giản nhất có thể, giải pháp của bạn có vẻ tốt nhất. Tôi có thể chia cấu hình thành nhiều cấu hình và tạo một tập lệnh đơn giản để tạo lại tệp .ssh / config bất cứ khi nào một trong các tệp được sửa đổi. Tôi không biết làm thế nào sạch của một giải pháp này, nhưng nó dường như thực hiện các mẹo và hoạt động cho mục đích của tôi.
wrangler

52

Bạn có thể chỉ định tệp cấu hình hiện tại để sử dụng trong tùy chọn ssh như thế này:

ssh -F /path/to/configfile

Có vẻ đó là cách duy nhất.

Ngoài ra có ngay bây giờ để bao gồm một cấu hình vào một cấu hình khác.


Một tùy chọn thú vị khi sử dụng Mô-đun Net :: OpenSSH của Perl (ví dụ: đối với nhiều tệp khóa riêng.), Trong đó mô-đun không cung cấp tất cả các khả năng.
Jimmy Koerting

36

Bắt đầu với ssh 7.3 (phát hành vào ngày 1 tháng 8 năm 2016), một lệnh Includecó sẵn.

Bao gồm : Bao gồm (các) tệp cấu hình đã chỉ định. Nhiều tên đường dẫn có thể được chỉ định và mỗi tên đường dẫn có thể chứa các ký tự đại diện chung và các tham chiếu "~" giống như vỏ cho các thư mục gốc của người dùng. Các tập tin không có đường dẫn tuyệt đối được giả sử là trong ~/.ssh. Một lệnh Includecó thể xuất hiện bên trong một Matchhoặc một Hostkhối để thực hiện bao gồm có điều kiện.

(Đây là liên kết đến báo cáo lỗi đã được giải quyết, cũng bao gồm bản vá: https://ormszilla.mindrot.org/show_orms.cgi?id=1585#c24 )


2
Điều đó thật tuyệt. Mong chờ điều này. Cuối cùng nó cũng sẽ giải quyết vấn đề này đúng cách :)
wrangler

2
Chỉ cần thêm lệnh Bao gồm ở đầu configtệp. Tôi không thể hiểu tại sao nó không hoạt động ở phía dưới.
pylover

17

Cá nhân tôi sử dụng các lệnh đó để biên dịch cấu hình ssh:

alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)

hoặc là:

alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)

bởi vì:

alias ssh='ssh -F <(cat .ssh/*.config)'

không làm việc cho tôi, trở lại:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

Hy vọng điều này sẽ được giúp đỡ.


ssh -F <(cat .ssh/*.config)sẽ là lý tưởng Tôi cũng nghĩ ra điều này, nhưng tôi cũng gặp lỗi tương tự. Bất cứ ai cũng biết vấn đề ở đây là gì?
ốm

2
ssh kiểm tra quyền của tập tin, tôi nghĩ loại chuyển hướng này không hỗ trợ kiểm tra đó.
Camden Narzt

2

Tôi cũng sẽ sử dụng cat config_* > configđể tạo toàn bộ cấu hình. Nhưng tôi sẽ không sử dụng con rối / cengine vv cho việc này, nếu chúng chưa được sử dụng (BTW: tại sao không sử dụng hệ thống quản lý cấu hình ???).

Tôi sẽ tạo ra một gói (deb, vòng / phút) và đặt nó vào một kho lưu trữ cục bộ. Và trong kịch bản postinst, con mèo tạo ra cấu hình của bạn. Có lẽ bạn cũng bao gồm một thư mục cục bộ ... Ưu điểm là, các cập nhật ssh / config kích hoạt trên cơ sở hàng ngày trong khi cron-apt & Co chạy.


0

Bạn có thể sử dụng Makefile trong ~/.ssh:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in

Sau đó di chuyển hiện tại của bạn configđến config.invà chạy makeđể tạo config.


0

Tôi đã chơi với khái niệm config.dthư mục để tổ chức cấu hình của tôi. Vì vậy, để thêm vào đống tùy chọn ở trên, đây là những gì đang làm việc cho tôi.

Cấu trúc thư mục giống như

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

Hàm xây dựng ~ / .ssh / config và nằm trong run-config của shell của tôi như sau

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}

Tùy chọn thêm sshMakeConfigvào dưới cùng của cấu hình run của bạn nếu bạn muốn đảm bảo một cấu hình mới trên mỗi phiên shell

Bất cứ khi nào tôi cần biên dịch lại ~ / .ssh / config, tôi sẽ làm như vậy bằng cách chạy sshMakeConfigở một số dạng (trực tiếp, tìm nguồn cung cấp cấu hình chạy của tôi hoặc bắt đầu một trình bao mới)

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.