Você não pode conseguir isso em ~/.ssh/config
ao usar endereços IP como nomes de host. Uma complicação adicional é introduzida pelo fato de que você não está apenas se conectando a endereços IP diferentes, mas também a portas diferentes, já que isso praticamente impede qualquer ajuste no seu resolvedor de DNS.
Eu corrijo - você pode usar a combinação Match originalhost ... exec ...
em ~/.ssh/config
- veja resposta do @ MichałPolitowski . No entanto, embora funcione perfeitamente para o OpenSSH, você pode não necessariamente encontrar uma funcionalidade semelhante em outros clientes SSH.
Você pode contornar o problema usando um invólucro simples (uma função de shell ou um script, se precisar usá-lo de vários shells) para ssh
, que verificará em qual rede você está e usará o% co_de apropriado. % de entrada. A grande questão é como detectar de forma confiável em que rede você está. O endereço IP local vem à mente, mas não é confiável, pois você também pode se conectar a partir de uma LAN que usa a mesma sub-rede de sua rede de trabalho.
Se você pode ter a mesma porta para redes locais e remotas, você pode editar seu Host
dependendo da rede em que estiver - obviamente teria que ser feito automaticamente (provavelmente a partir de um script de gancho de seu cliente DHCP). Ou - melhor - execute o servidor de nomes local (por exemplo, /etc/resolv.conf
) e forneça a configuração apropriada. Isso vai além do escopo desta questão.
Outra opção - se você só precisa se conectar de forma interativa - é usar a conclusão de comando que faria a varredura de dnsmasq
. Isso pouparia um pouco de digitação (especialmente se você tiver variados o suficiente em ~/.ssh/config
entradas). Algo parecido com isto (para Host
initialisation):
# 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
A primeira função cria uma lista a partir da qual os hosts são concluídos (geralmente é suficiente para executá-la uma vez em cada shell), o segundo realiza a conclusão real, embora de forma um pouco desajeitada - só completa o nome do host quando é o último token na linha de comando.
Tudo isso dito, o caminho certo para abordar este problema é conectar-se à rede de trabalho através de uma VPN e, portanto, ter o endereço IP local de trabalho acessível como se você estivesse no escritório. Você pode vincular o endereço em qualquer camada que preferir: bash
, ~/.ssh/config
ou (melhor opção) servidor de nomes do escritório.