~ / .ssh / config 파일을 두 개 이상 가질 수 있습니까?


82

우리는 여러 호스트에 연결하는 데 사용되는 요새 서버가 있으며 .ssh / config는 수천 줄 이상으로 커졌습니다 (수백 개의 호스트가 연결되어 있습니다). 이것은 다루기 어려워지기 시작했으며 .ssh / config 파일을 여러 파일로 나눌 수있는 방법이 있는지 알고 싶습니다. 이상적으로는 다른 파일을 다음과 같이 .ssh / config 파일로 취급하도록 지정합니다.

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

ssh / config에 대한 설명서를 읽었으며 이것이 가능하다는 것을 알지 못합니다. 그러나 다른 사람이 비슷한 문제를 겪고 해결책을 찾았습니다.


각 사용자가 자신의 사용자 이름으로 요새 호스트에 로그인하도록합니다. 또한 각 호스트에 대한 항목이 필요한 구성 파일에 무엇을 넣습니까? 일반적인 일부 기본값을 설정할 수 없습니까?
Jed Daniels

1
superuser.com에서 동일한 질문 : superuser.com/questions/247564/…
guettli

1
곧 OpenSSH 7.3에서는 가능할 것입니다. bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

답변:


51

~/.ssh/config설정 파일은 파일 권한에 대한 SSH 수표와 관련된 다른 파일을 포함하기위한 지침이 없습니다.

이에 대한 제안에는 시스템에서 또는 저장소의 체크인 후크를 통해 여러 변경 사항을 함께 제공하는 스크립트가 포함될 수 있습니다. Puppet 또는 Augeas와 같은 도구를 살펴볼 수도 있습니다.

그러나 접근하면 개별 파일을 파일 외부에서 단일 파일로 연결해야합니다.

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

참고 : 덮어 쓰기 : > vs 추가 :>>

2017 년 12 월 업데이트 :

7.3p1부터 Include 옵션이 있습니다. 구성 파일을 포함시킬 수 있습니다.

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.

고마워 제프, 이것은 좋은 생각입니다. Puppet 또는 Augeas에 대해 너무 많이 알지 못하므로 가능한 한 간단하게 유지하기 위해 솔루션이 가장 좋습니다. 구성을 여러 구성으로 나누고 파일 중 하나가 수정 될 때마다 .ssh / config 파일을 다시 만드는 간단한 스크립트를 만들 수 있습니다. 솔루션이 얼마나 깨끗한 지 잘 모르겠지만 트릭을 수행하고 내 목적에 효과가있는 것 같습니다.
커맨더

52

다음과 같이 ssh 옵션에서 사용할 현재 구성 파일을 지정할 수 있습니다.

ssh -F /path/to/configfile

그것이 유일한 방법 인 것 같습니다.

또한 하나의 구성을 다른 구성에 포함시킬 수 없습니다.


Perl의 Net :: OpenSSH 모듈 (예 : 여러 개인 키 파일 등)을 사용할 때 옵션이있는 것이 좋습니다. 여기서 모듈은 모든 가능성을 제공하지 않습니다.
Jimmy Koerting

36

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

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

(여기서 또한 패치가 포함되어 해결 된 버그 리포트에 대한 링크는 다음과 같습니다 https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


2
너무 멋지다. 이것을 기대하십시오. 마지막으로이 문제를 올바르게 해결해야합니다. :)
wrangler

2
config파일 맨 위에 Include 지시문을 추가 하십시오. 왜 바닥에서 작동하지 않는지 알 수 없습니다.
pylover

17

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

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


ssh -F <(cat .ssh/*.config)이상적입니다. 나는 이것도 생각해 냈지만 같은 오류가 발생합니다. 여기에 무엇이 문제인지 아는 사람이 있습니까?
sickill

2
ssh는 파일 권한을 확인합니다.이 종류의 리디렉션은 해당 확인을 지원하지 않는다고 생각합니다.
Camden Narzt

2

또한 cat config_* > config전체 구성을 생성하는 데 사용 합니다. 그러나 아직 배치되지 않은 경우 꼭두각시 / cfengine 등을 사용하지 않습니다 (BTW : 구성 관리 시스템을 사용하지 않는 이유는 무엇입니까 ???).

패키지 (deb, rpm)를 생성하여 로컬 리포지토리에 넣습니다. 그리고 postinst 스크립트에서 고양이는 설정을 생성합니다. 아마도 당신은 또한 로컬 폴더를 포함 할 것입니다 ... 장점은 ssh / config 업데이트가 cron-apt & Co run 동안 매일베이스에서 활성화된다는 것입니다.


0

다음에서 Makefile을 사용할 수 있습니다 ~/.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

그런 다음 기존 config으로 이동 config.in하고를 실행 make하여 생성하십시오 config.


0

config.d구성 구성 을위한 디렉토리 개념을 가지고 놀고 있습니다. 위의 옵션 더미에 추가하려면 다음과 같이하십시오.

디렉토리 구조는

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

~ / .ssh / config를 빌드하고 쉘의 run-config에있는 기능은 다음과 같습니다.

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
}

sshMakeConfig각 셸 세션에서 새로운 구성을 유지하려면 선택적으로 run-config의 맨 아래에 추가 하십시오.

~ / .ssh / config를 다시 컴파일해야 할 때마다 sshMakeConfig어떤 형식으로 (직접 실행 구성 소싱 또는 새 셸 시작) 실행합니다.

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