나는 그것을 사용하고 있다
ControlMaster auto
ControlPath ~/.ssh/tmp/%l_%r@%h:%p
내에서는 ~/.ssh/config
SSH를 통해 호스트에 액세스할 때 동일한 연결을 사용하여 여러 세션이 열립니다.
이는 대부분의 사용 사례에서 잘 작동하지만 IPv4와 IPv6를 통해 동시에 동일한 호스트 이름에 연결할 수는 없습니다. 다른 모든 연결은 IPv4와 IPv6를 ControlPath
구별 할 수 없기 때문에 첫 번째 연결에서 생성된 제어 소켓을 사용합니다. IPv6 연결.
IPv4 및 IPv6 연결에 대해 별도의 제어 소켓을 제공하는 방법이 있습니까(아마도 소켓 경로에서 원격 호스트 이름 대신 원격 IP를 사용하는 방법을 찾는 것)?
편집 #1
Match
방금 및 파일에서 사용할 수 있는 옵션을 기억 하고 다음을 시도했습니다.ssh_config
sshd_config
Match AddressFamily inet
ControlPath ~/.ssh/tmp/%l_%r@%h:%p.inet
Match AddressFamily inet6
ControlPath ~/.ssh/tmp/%l_%r@%h:%p.inet6
불행히도 이것은 실패합니다."일치 속성 AddressFamily는 지원되지 않습니다."호스트에 연결하려고 하면 다시 원점으로 돌아가게 됩니다...
답변1
이는 일반적인 사용 사례가 아니므로 이를 수행할 수 있는 직접적인 방법은 없습니다. 그러나 너무 많은 원격 호스트가 필요하지 않은 경우 사용자 프로필을 사용하여 이 문제를 해결할 수 있습니다.
Host hostname-4
Hostname hostname
AddressFamily inet
ControlPath ~/.ssh/master4-%l%h%p%r
Host hostname-6
Hostname hostname
AddressFamily inet6
ControlPath ~/.ssh/master6-%l%h%p%r
답변2
"래퍼" 및 "패치" 방법을 개별적으로 찬성/반대 투표할 수 있도록 내 답변을 두 개의 개별 답변으로 나누었습니다.
해결 방법 1: 래퍼 함수 작성
ssh ()
{
controlpath=""
for argument in $@
do
if [[ "$argument" = "-"*"4"* ]]
then
controlpath="~/.ssh/tmp/%l_%r@%h:%p.inet"
fi
if [[ "$argument" = "-"*"6"* ]]
then
controlpath="~/.ssh/tmp/%l_%r@%h:%p.inet6"
fi
done
if [ -n "$controlpath" ]
then
/usr/bin/ssh -o "ControlPath=$controlpath" $@
else
/usr/bin/ssh $@
fi
}
ssh
이 래퍼 함수는 , 및 에 대해 별도의 제어 소켓을 생성하도록 지시합니다 . 이와 같은 내용을 올바르게 구문 분석하지 못할 수도 있지만(기술적으로 허용되는 경우에도) 간단한 시나리오에 대한 가장 간단한 해결 방법이어야 합니다.ssh host
ssh -4 host
ssh -6 host
ssh -464466 host
답변3
"래퍼" 및 "패치" 방법을 개별적으로 찬성/반대 투표할 수 있도록 내 답변을 두 개의 개별 답변으로 나누었습니다.
해결 방법 2:출처를 이용하세요, 루크!
내 답변 업데이트에서 언급했듯이 OpenSSH는 Match AddressFamily
—하지만. 구문 분석 시
해당 절을 추가하는 것은 매우 쉽습니다.Match
conf.c 읽기. 내 개념 증명 패치는 작동하지만 하드코딩된 문자열이 많이 포함되어 있으므로 고려를 위해 OpenSSH 유지 관리 담당자에게 제출하기 전에 확실히 더 많은 작업이 필요합니다.
%a
ControlPath
예를 들어 계산 결과를 any
, 또는 으로 정의하기 위해 다른 자리 표시자를 추가할 수 없다면 사용된 주소 계열에 따라 inet
살펴볼 가치가 있을 수도 있습니다 . 그러나 옵션이 평가되고 저장되는 순서에 inet6
따라 문제가 발생할 수 있으므로 이 기능이 작동하려면 상당히 광범위한 변경이 필요할 수 있습니다.
플레이스홀더를 연결에 사용되는 실제 주소 계열로 확장하려는 나의 원래 아이디어에도 동일한 문제가 적용됩니다. 주소 계열은 적합한 제어 소켓이 존재할 때에도 발생하지 않는 호출에 의존합니다.AddressFamily
ControlPath
gethostbyname()