Có cách nào để một tệp cấu hình SSH bao gồm một tệp khác không?


131

Trong trường hợp có vấn đề:

  • HĐH: Ubuntu 10.04
  • SSH: OpenSSH_5.3p1 Debian-3ubfox5

Tôi muốn một tệp cấu hình SSH bao gồm một tệp khác. Trường hợp sử dụng sẽ là xác định bất cứ điều gì tôi muốn trong .ssh/configtệp mặc định của mình và sau đó thêm vào một vài điều bổ sung trong một tệp riêng (ví dụ ~/.ssh/foo.config). Tuy nhiên, tôi muốn tệp thứ hai kết hợp tệp thứ nhất, vì vậy tôi không phải sao chép mọi thứ trong tệp đầu tiên. Điều đó có làm được không? Cảm ơn!


2
Câu hỏi tương tự trên serverfault: serverfault.com/questions/375525/ từ
guettli

Câu trả lời:


140

Từ 7.3p1 trở lên, có Includetừ khóa, cho phép bạn bao gồm các tệp cấu hình.

Include

    Bao gồm (các) tệp cấu hình được 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 toàn cầu (3) và, đối với cấu hình người dùng, các tham chiếu giống như vỏ sò ~ ~ đến các thư mục nhà của người dùng. Các tệp không có đường dẫn tuyệt đối được giả sử là ~/.sshnằm trong tệp cấu hình người dùng hoặc /etc/sshnếu được bao gồm từ tệp cấu hình hệ thống.  Includelệnh có 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.
Nguồn: ssh_config (5) .

Ví dụ: bạn có thể có trong ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

và trong ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

Từ các ý kiến, sử dụng dưới đây để bao gồm tất cả các tệp trong config.dthư mục:

Include config.d/* 

13
kiểm tra phiên bản với $ ssh -V
Pieter

7
Sử dụng Include config.d/*để bao gồm tất cả các mục trong config.d.
Simon Woodside

17
Ftr: cái này phải nằm ở đầu tập tin và không thể chỉ được thêm vào danh sách các Hostmục.
dtk

2
đã thử trên Ubuntu 16.04. Mặc dù, nó hoạt động, nhưng tự động hoàn thành bị hỏng khiến nó ít hữu ích hơn. Nếu bạn muốn nâng cấp ssh trên Ubuntu, hãy kiểm tra liên kết này gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu

@dtk cảm ơn vì điều đó. Đó là những gì đã ném tôi
Adam Keenan

28

Không, theo hiểu biết của tôi điều này là không thể.

Dưới đây là các liên kết đến các yêu cầu tính năng mở / vé lỗi:

https://ormszilla.mindrot.org/show_orms.cgi?id=1585

https://bugs.launchpad.net/ubfox/+source/openssh/+orms/739495


2
Ngoài ra lỗi này trên Debian: bug.debian.org/cgi-bin/ormsreport.cgi?orms=631189
Lluís

8
CHÚA ƠI. Nó đang hap. Từ 2016-04-15 13:01:08 EST: Slightly modified patch applied, this will be in openssh-7.3
oschrenk

Câu trả lời này là chính xác tại thời điểm đó, nhưng đã lỗi thời.
Mark Stosberg

25

Nếu bạn muốn bắt đầu một ứng dụng khách ssh, bạn có thể làm điều này trong bash:

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'

sau đó bạn sử dụng ssh bình thường và nó sẽ có cả hai tệp được đọc theo thứ tự đó.

Đối với daemon máy chủ, sshdbạn có thể làm tương tự, chỉ cần sử dụng -fthay vì -Fvà viết nó xuống nơi bạn khởi động daemon trực tiếp. bạn không cần bí danh.

Khả năng thứ hai theo trang man là đưa cấu hình toàn hệ thống vào /etc/ssh/ssh_configvà người dùng vào ~/.ssh/config.

Cập nhật Rõ ràng có một số vấn đề với một số phiên bản bash và cách các thiết bị được tạo. (xem http://bugs.alpinelinux.org/issues/1465 )

Đây là một cách giải quyết (mặc dù theo tôi là xấu xí):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo

vì vậy nếu bạn muốn, bạn có thể tạo một hàm từ nó (hoặc một tập lệnh):

ssh() {
    tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
    mkfifo "$tmp_fifo" 
    cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & 
    /usr/bin/ssh -F "$tmp_fifo" "$@"
    rm "$tmp_fifo"
}

1
Đáng buồn là điều này không hoạt động trên ssh của OSX: Không thể mở tệp cấu hình người dùng / dev / fd / 63: Mô tả tệp xấu
Ash Berlin-Taylor

Nó cũng không hoạt động đối với tôi trên (Ubuntu 11.10) Linux gây ra lỗi tương tự như @AshBerlin đã đăng ở trên.
Szymon Jeż

@AshBerlin bạn cũng có thể dùng thử, điều này cũng hoạt động với OSX, cho đến khi lỗi được khắc phục
estani

Cho ssh kiểm tra ba vị trí, 1. dòng lệnh, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, bạn cũng không cần phải truyền ~/.ssh/configvào dòng lệnh. Chỉ alias ssh='ssh -F ~/.ssh/foo.config'~/.ssh/confignên được chọn sau đó. Miễn là bạn không bận tâm đến foo.configviệc tải trước tiên nên sạch hơn cách giải quyết ở trên.
jim

1
@jim không nó không hoạt động như vậy. Cái đầu tiên được tìm thấy được sử dụng. Bạn đã thử chưa? từ trang man "-F configfile: Chỉ định tệp cấu hình cho mỗi người dùng thay thế . Nếu tệp cấu hình được cung cấp trên dòng lệnh, tệp cấu hình trên toàn hệ thống (/ etc / ssh / ssh_config) sẽ bị bỏ qua."
estani

17

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.

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


14

Tương tự như cái 'xấu xí' khác ở đây là của tôi:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"

Lưu ý rằng sftplệnh sẽ không kích hoạt tính toán lại cấu hình.
VasyaNovikov

2
(Tôi vẫn thích câu trả lời vì nó sử dụng "config.d /" và rất đơn giản.)
VasyaNovikov 13/03/2015

2
đơn giản, thanh lịch, nhưng hacky
code_monk

6

Vâng, tôi hơi gian lận để làm điều này. Trong các tệp bash .profile-ish của tôi, tôi có một khối thay thế các phần khác nhau của thư mục chính của tôi khi đăng nhập, vì vậy tôi chỉ tạo một tệp mới mỗi lần. Thí dụ:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config

Điều này cũng cho phép tôi thực hiện những việc như thêm khối cấu hình vào tệp cấu hình ssh chỉ khi tôi ở trên máy chủ A hoặc B, nhưng không phải trên hệ thống nhà của tôi.

Bây giờ tôi biết, ai đó sẽ hiểu rằng nếu bạn đăng nhập nhiều thì điều này có thể gây ra sự chậm chạp quá mức, nhưng trong thực tế tôi chưa bao giờ thực sự nhận thấy điều đó. Và tôi chắc chắn rằng bạn có thể đặt nó trong một kịch bản và phát nó qua cron.


3

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 đỡ.


Bạn có thể tiến thêm một bước và kết hợp điều này với fswatch, để biên dịch tự động khi thay đổi tệp
cavalcade

3

Một giải pháp khác, dựa trên FUSE (không tự kiểm tra):

https://github.com/markhellewell/sshconfigfs

"Thay vì phải tiếp tục quản lý một tệp lớn, [...] thay vào đó hãy xây dựng một tệp" cấu hình "một cách linh hoạt từ nhiều khối logic nhỏ hơn."

Tôi cũng đã tìm thấy một bài viết thực hiện điều này thông qua FIFOs: http://www.linuxsysadmintutorials.com/multipl-ssh-client-configuration-files/


1
Tôi thấy nội dung bình luận đủ để mô tả - nó nói "FUSE" (Có lẽ mở rộng từ viết tắt sẽ tốt hơn); Các liên kết chỉ là để thực hiện.
aviv

1
Không nhận thức được vấn đề câu trả lời ngắn, câu trả lời mở rộng. Có vẻ như tôi sẽ phải kiểm tra lại trang web để biết câu trả lời của mình theo thời gian, không có thông báo qua email :) Đã học cách sử dụng favs, ngay bây giờ. Cảm ơn các ý kiến.
amontero

2

Không có giải pháp bí danh nào hoạt động cho githoặc các chương trình khác ngoài ssh.

Tôi đã tát vào nhau một cách nhanh chóng và bẩn thỉu, nhưng bạn có thể muốn cải thiện nó.

Thêm cái này vào ~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config

Mỗi khi bạn bắt đầu một phiên, nó sẽ hợp nhất tất cả các tệp trong đó ~/.ssh/config.d. (dòng 3)

Nhược điểm của phiên bản này là nếu bạn thay đổi ~/.ssh/configphiên tiếp theo, bạn mở các thay đổi của mình sẽ bị mất, vì vậy để ngăn chặn việc tôi chuyển tệp hiện có sang tệp .bak. (dòng 2) Vấn đề là bạn sẽ có rất nhiều tệp .bak sau một thời gian.


Tuyệt vời với việc thêm một số is_anything_changedđiều kiện
vp_arth 04/07/2015

1

Bạn có thể dễ dàng nâng cấp phiên bản SSH trên Ubuntu lên v7.3 (đã thử nghiệm trên Ubuntu Xenial 16.04) bằng cách cài đặt các gói từ Yakkety:

echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update

Kiểm tra phiên bản SSH

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016

Định cấu hình SSH để sử dụng bao gồm từ thư mục ~ / .ssh / config.d

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config

0

Câu trả lời ngu ngốc của tôi:

  • Đã thử cài đặt OpenSSH> 7.3 trên Xenial (16.04)
  • Không thích sự lộn xộn mà nó tạo ra

Vì vậy, tôi giải quyết cho điều này:

  • Giữ các tệp cấu hình OpenSSH riêng biệt của bạn trong ~/.ssh/config.d/
  • Khi bạn thay đổi một, làm cat ~/.ssh/config.d/* > ~/.ssh/config
  • Vào ngày vinh quang bạn nâng cấp lên phiên bản phân phối có OpenSSH 7.3p1 hoặc mới hơn, thay vào đó bạn có thể tạo một tệp chứa

Include config.d/*


0

Tôi cũng không thể nâng cấp SSH trên máy của mình.

Tôi đã sử dụng GNU make để tạo tệp cấu hình ssh chỉ khi cần :

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

Sau đó ssh được đặt bí danh là

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

Nó hoạt động như một say mê.

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.