하나의 SSH 구성 파일에 다른 SSH 구성 파일을 포함시키는 방법이 있습니까?


131

중요한 경우 :

  • 운영체제 : Ubuntu 10.04
  • SSH : OpenSSH_5.3p1 데비안 -3 우분투 5

하나의 SSH 구성 파일에 다른 SSH 구성 파일을 포함시키고 싶습니다. 유스 케이스는 기본 .ssh/config파일 에서 원하는 것을 정의 하고 별도의 파일 (예 :)에 몇 가지 추가 항목을 미리 추가하는 것입니다 ~/.ssh/foo.config. 그러나 두 번째 파일이 첫 번째 파일을 통합하기를 원하므로 첫 번째 파일의 모든 것을 복제 할 필요는 없습니다. 그게 가능합니까? 감사!


2
serverfault와 동일한 질문 : serverfault.com/questions/375525/…
guettli

답변:


140

7.3p1부터 Include구성 파일을 포함 할 수 있는 키워드 가 있습니다.

Include

    지정된 구성 파일을 포함하십시오. 여러 경로 이름을 지정할 수 있으며 각 경로 이름에는 glob (3) 와일드 카드와 사용자 구성의 경우 사용자 홈 디렉토리에 대한 쉘과 유사한 "~"참조가 포함될 수 있습니다. 절대 경로가없는 파일 ~/.ssh은 사용자 구성 파일에 /etc/ssh포함 되거나 시스템 구성 파일에 포함 된 것으로 간주 됩니다.  Include지시문은 조건부 포함을 수행하기 위해 Match또는 Host블록 안에 나타날 수 있습니다 .
출처 : ssh_config를 (5) .

예를 들어 다음과 같이 할 수 있습니다 ~/.ssh/config.

Include config.d/home

Host github.com
    HostName github.com
    User git

그리고 ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

주석에서 아래를 사용하여 config.d디렉토리의 모든 파일을 포함하십시오 .

Include config.d/* 

13
$ ssh -V로 버전 확인
Pieter

7
Include config.d/*모든 항목을 포함시키는 데 사용 합니다 config.d.
Simon Woodside

17
Ftr : 파일 상단에 있어야하며 Host항목 목록에 추가 할 수 없습니다 .
dtk

2
우분투 16.04에서 시도했습니다. 그러나 작동하지만 자동 완성 기능이 손상 되어 유용성이 떨어집니다. 당신이 우분투에 SSH를 업그레이드하려면이 링크를 확인 gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu

@dtk 감사합니다. 그것이 저를 뒤죽박죽이었던 것입니다
Adam Keenan

28

아니요, 내 지식으로는 불가능합니다.

해당 오픈 기능 요청 / 버그 티켓에 대한 링크는 다음과 같습니다.

https://bugzilla.mindrot.org/show_bug.cgi?id=1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495


2
또한 데비안에 관한이 버그 : bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís

8
세상에 더운 것입니다. 2016-04-15 13:01:08 EST : Slightly modified patch applied, this will be in openssh-7.3
oschrenk

이 답변은 당시에는 정확했지만 지금은 구식입니다.
Mark Stosberg

25

ssh 클라이언트를 시작하려면 bash에서 다음을 수행하십시오.

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

그런 다음 ssh를 정상적으로 사용하면 두 파일을 순서대로 읽습니다.

서버 데몬의 sshd경우 동일한 작업을 수행 할 수 있습니다. -f대신 -F데몬을 직접 시작하는 위치에 대신 사용 하십시오. 별칭이 필요하지 않습니다.

매뉴얼 페이지에 따른 두 번째 가능성은 시스템 전체 구성을 /etc/ssh/ssh_config사용자 에게 배치하는 것입니다 ~/.ssh/config.

업데이트 일부 bash 버전과 장치 생성 방법에 약간의 문제가 있습니다. ( http://bugs.alpinelinux.org/issues/1465 참조 )

이것은 해결 방법입니다 (제 의견으로는 추악하지만).

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

따라서 원하는 경우 함수 또는 스크립트로 함수를 만들 수 있습니다.

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
슬프게도 이것은 OSX의 ssh에서 작동하지 않습니다 : 사용자 구성 파일을 열 수 없습니다 / dev / fd / 63 : 잘못된 파일 설명자
Ash Berlin-Taylor

위의 @AshBerlin과 동일한 오류를 발생시키는 (Ubuntu 11.10) Linux에서도 작동하지 않습니다.
Szymon Jeż

@AshBerlin 당신도 그것을 시도 할 수 있습니다, 이것은 버그가 수정 될 때까지 OSX에서도 작동합니다
estani

ssh가 1. 명령 행, 2. ~/.ssh/config, 3.의 세 곳을 검사하면 명령 행 /etc/ssh/ssh_config을 전달할 필요도 없습니다 ~/.ssh/config. 그냥 alias ssh='ssh -F ~/.ssh/foo.config'하고 ~/.ssh/config그 후 발탁한다. foo.config먼저로드 하는 것이 마음 에 들지 않으면 위의 해결 방법보다 깨끗해야합니다.
jim

1
@ jim no 그렇게 작동하지 않습니다. 처음 발견 된 것이 사용됩니다. 사용해 보셨습니까? 맨 페이지 "-F configfile : 사용자 별 대체 구성 파일을 지정 합니다. 구성 파일이 명령 줄에 제공되면 시스템 전체 구성 파일 (/ etc / ssh / ssh_config)이 무시됩니다."
estani

17

ssh 7.3 (2016 년 8 월 1 일 릴리스)부터 Include지시문을 사용할 수 있습니다.

포함 : 지정된 구성 파일을 포함시킵니다. 여러 경로 이름을 지정할 수 있으며 각 경로 이름에는 glob 와일드 카드 및 사용자 홈 디렉토리에 대한 쉘과 유사한 "~"참조가 포함될 수 있습니다. 절대 경로가없는 파일은에 있다고 가정합니다 ~/.ssh. Include지시문은 내부 나타나는 Match또는 Host조건을 포함하는 블록을 수행.

(여기에 해결 된 버그 보고서에 대한 링크가 있으며 여기에는 해당 패치가 포함됩니다 : https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


14

다른 '추한'과 마찬가지로 여기 하나의 라이너가 있습니다.

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

sftp명령은 구성 재 계산을 트리거하지 않습니다.
VasyaNovikov

2
( "config.d /"를 사용하고 매우 단순하기 때문에 여전히 답을 좋아합니다.)
VasyaNovikov

2
간단하고 우아한 아직 해키
code_monk

6

글쎄, 나는 이것을하기를 속이는 것입니다. 내 bash .profile-ish 파일에는 로그인 할 때 다양한 홈 디렉토리를 대체하는 블록이 있으므로 매번 새 디렉토리를 생성합니다. 예:

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

또한 호스트 A 또는 B에 있지만 내 홈 시스템에는없는 경우에만 ssh 구성 파일에 구성 블록 추가와 같은 작업을 수행 할 수 있습니다.

이제 누군가가 로그인하면 이로 인해 속도가 너무 느려질 수 있지만 실제로는 전혀 눈치 채지 못했습니다. 그리고 이것을 스크립트에 넣고 cron을 통해 실행할 수 있다고 확신합니다.


3

개인적으로 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.)

또는:

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)

때문에:

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

나를 위해 작동하지 않습니다.

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

이것이 도움이되기를 바랍니다.


한 단계 더 나아가 파일 변경에 대한 자동 컴파일을 위해 이것을 fswatch와 결합 할 수 있습니다
cavalcade

3

다른 FUSE 기반 솔루션 (자체 테스트하지 않은) :

https://github.com/markhellewell/sshconfigfs

"하나의 큰 파일을 계속 관리 할 필요없이 [...] 대신 많은 작은 논리적 청크에서 동적으로 구성"파일 "을 빌드합니다."

나는 또한 FIFO를 통해 이것을하는 기사를 찾았습니다 : http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


1
나는 주석 내용이 충분히 설명 적이라는 것을 알았습니다. "FUSE"라고 말합니다 (약어를 확장하는 것이 좋습니다). 링크는 단지 구현에 대한 것입니다.
aviv

1
짧은 답변 문제를 알지 못하고 답변이 확장되었습니다. 이메일 알림이없는 상태에서 때때로 내 답변을 사이트에서 다시 확인해야 할 것 같습니다. 의견 주셔서 감사합니다.
amontero

2

이 별칭 솔루션 중 어느 것도 git또는 이외의 다른 프로그램에서 작동하지 않습니다 ssh.

나는 더러워지고 더러워졌지만 개선하고 싶을 수도 있습니다.

이것을 당신의 ~/.bashrc

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

세션을 시작할 때마다의 모든 파일이 병합됩니다 ~/.ssh/config.d. (라인 3)

이 버전의 단점은 ~/.ssh/config다음 세션 을 변경하면 변경 사항이 열리므로 기존 파일을 .bak 파일로 이동하지 못하게한다는 것입니다. 문제는 잠시 후 많은 .bak 파일을 갖게 될 것입니다.


일부 is_anything_changed조건 을 추가하면 우수함
vp_arth

1

Yakkety에서 패키지를 설치하여 Ubuntu의 SSH 버전을 v7.3 (Ubuntu Xenial 16.04에서 테스트)으로 쉽게 업그레이드 할 수 있습니다.

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

SSH 버전 확인

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

~ / .ssh / config.d 디렉토리의 include를 사용하도록 SSH 구성

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

0

내 멍청한 대답 :

  • Xenial (16.04)에서 OpenSSH> 7.3을 설치하려고했습니다.
  • 그것이 만든 혼란을 좋아하지 않았다

그래서 나는 이것을 해결했다.

  • 별도의 OpenSSH 구성 파일을 ~/.ssh/config.d/
  • 하나를 바꾸면 cat ~/.ssh/config.d/* > ~/.ssh/config
  • 영광스러운 날에는 OpenSSH 7.3p1 이상이 포함 된 배포 버전으로 업그레이드하는 대신 다음을 포함하는 파일을 만들 수 있습니다

Include config.d/*


0

컴퓨터에서도 SSH를 업그레이드 할 수 없습니다.

필요한 경우에만 GNU make를 사용하여 ssh 구성 파일을 생성했습니다 .

# 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)

그런 다음 ssh는

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

그것은 매력처럼 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.