~ / .ssh / config 파일을 두 개 이상 가질 수 있습니까? 요새 서버가 있으며 .ssh / config는 수천

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

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

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



답변

~/.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.


답변

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

ssh -F /path/to/configfile

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

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


답변

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

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

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


답변

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

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


답변

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

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


답변

다음에서 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.


답변

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어떤 형식으로 (직접 실행 구성 소싱 또는 새 셸 시작) 실행합니다.