~/.ssh/config
IP 주소를 호스트 이름으로 사용하면 이를 달성 할 수 없습니다 . 사실은 다른 IP 주소뿐만 아니라 다른 포트에도 연결하고 있다는 사실에 의해 추가 문제가 발생합니다. 왜냐하면 DNS 확인 자의 조정이 거의 없기 때문입니다.
나는 정정했다-당신은 Match originalhost ... exec ...
콤보를 사용할 수 있습니다 ~/.ssh/config
- @ MichałPolitowski의 대답을 참조하십시오 . 그러나 OpenSSH에서는 완벽하게 작동하지만 다른 SSH 클라이언트에서 유사한 기능을 찾을 필요는 없습니다.
에 대한 간단한 래퍼 (쉘 함수 또는 다양한 쉘에서 사용해야하는 경우 스크립트)를 사용하여 문제를 해결할 수 있습니다. 그러면 현재 사용중인 ssh
네트워크를 확인하고 적절한 Host
항목을 사용할 수 있습니다 . 가장 큰 문제는 현재 사용중인 네트워크를 안정적으로 감지하는 방법입니다. 로컬 IP 주소를 염두에두고 있지만 회사 네트워크와 동일한 서브넷을 사용하는 LAN에서 연결할 수도 있으므로 신뢰할 수 없습니다.
로컬 및 원격 네트워크 모두에 대해 동일한 포트를 사용할 수있는 경우 사용 /etc/resolv.conf
중인 네트워크에 따라 편집 할 수 있습니다. 분명히 자동으로 수행되어야합니다 (대부분 DHCP 클라이언트의 후크 스크립트에서 가능). 또는 로컬 이름 서버 (예 : 등 dnsmasq
)를 더 잘 실행 하고 적절한 구성을 제공하십시오. 그것은이 질문의 범위를 넘어선 다.
대화식으로 만 연결해야하는 다른 옵션은 스캔 할 명령 완료를 사용하는 것 ~/.ssh/config
입니다. 이렇게하면 타이핑이 줄어 듭니다 (특히 충분한 Host
항목이있는 경우). 이와 같은 것 ( bash
초기화) :
# complete session names for ssh
declare -g _ssh_complete_hostlist 2> /dev/null
function _ssh_complete_init () {
_ssh_complete_hostlist=$( \
sed -nr '/^\s*Host\s*=/{s/^[^=]+= *//;s/ /\n/g;p}' ~/.ssh/config \
| sort )
}
_ssh_complete_init
function _ssh_complete () {
local match=${COMP_WORDS[${COMP_CWORD}]}
local hosts=
local default=
for h in $_ssh_complete_hostlist; do
if [[ $h =~ ^$match ]]; then
hosts="$hosts $h"
fi
done
if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
fi
COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh
첫 번째 함수는 호스트가 완료되는 목록을 작성합니다 (일반적으로 모든 쉘에서 한 번만 실행하면 충분 함). 두 번째 함수는 약간 어색한 방식으로 실제 완료를 수행합니다. 명령 행의 마지막 토큰
이 문제에 접근하는 올바른 방법은 VPN을 통해 회사 네트워크에 연결하는 것이므로 사무실에있는 것처럼 로컬 회사 IP 주소에 액세스 할 수 있습니다. 당신은 당신이 원하는 어느 계층이든에 다음 하드 와이어 주소를 할 수 있습니다 ~/.ssh/config
, /etc/resolv.conf
또는 (이럴 최선의 선택) 사무실 이름 서버.
/etc/hosts
이것을 달성하기 위해 바이올린 구성 파일이나 SSH 구성 파일을 사용할 수 있는지 여부입니다 . 아니면 현재 어떤 LAN을 "감지"할 수 있습니까?