Como verificar se uma conexão SSH está aberta ou não?

5

Estou tentando conectar-me ao site public.sigmadesigns.com . Na verdade, eu estava autorizado para esse servidor enviando minha chave RSA Public para ele. Mas agora, quando tento fazer repo , recebo:

Getting manifest ...
   from [email protected]:mipsandroid/platform/manifest.git
ssh: connect to host public.mipsandroid.com port 22: Connection refused
ssh: connect to host public.mipsandroid.com port 22: Connection refused
fatal: The remote end hung up unexpectedly
fatal: cannot obtain manifest [email protected]:mipsandroid/platform/manifest.git

Como estou dentro de uma rede proxy corporativa, gostaria de saber se meu acesso a esse IP está aberto ou não. Como posso verificar isso?

    
por Sen 27.06.2011 / 13:41

2 respostas

2

Uma versão simplificada de algumas funções do meu ~ / .bashrc e ~ / .zshrc (totalmente compatível com POSIX, pronto para seus scripts de shell):

# true if we have the given command(s)
we_have() { type "$@" >/dev/null 2>&1; }

# Usage: probe SERVER PORT|SERVICE
# returns true when SERVER has PORT opened (and responds within one second)
if we_have nc
  then probe() { nc -zw1 "$@" >/dev/null 2>&1; }
  else probe() { echo X |telnet -e X "$@" >/dev/null 2>&1; }
fi

# Usage: poke SERVER [PORT|SERVICE]
# As probe.  Also: PORT defaults to 80 (http) and reports the result
poke() {
  local RETVAL STATUS
  probe "$1" "${2:-80}"
  RETVAL=$?
  if [ $RETVAL != 0 ]; then
    STATUS=" not"
  fi
  echo "could$STATUS connect to port ${2:-80} on host '$1'"
  return $RETVAL
}

Isso suporta números de porta e qualquer nome de serviço indexado por /etc/services . (Tenha cuidado para testar isso; se seu teste falhar devido a um nome de serviço ruim, você não saberá.)

Alguns testes de exemplo:

$ poke localhost ssh
could connect to port ssh on host 'localhost'
$ poke localhost 12345
could not connect to port 12345 on host 'localhost'

Use probe se você quiser criar scripts com apenas o valor de retorno, por exemplo,

if probe localhost ssh; then
  echo something contingent on hosting ssh goes here
fi

Se você tiver nmap versão 5+ instalado, poderá usar ncat --send-only --recv-only -w 334ms $1 $2 em vez do comando nc . Isso falha mais rápido (resolvi em 334ms. O nc só permite resolução de segundos, então você fica preso esperando um segundo inteiro).

Observe que isso não verifica o que está sendo hospedado, apenas que a porta está aberta. 99% do tempo, isso é bom o suficiente. Se você precisar de mais do que isso, tente algo assim:

nmap -sV -p ssh localhost |grep -qi 'open.*ssh.*ssh[^?]'

Isso dirá que nmap verificará a porta ssh (22) no servidor localhost e determinará as informações de serviço / versão. No meu sistema, sem o grep, ele informa:

Starting Nmap 6.40 ( http://nmap.org ) at 2014-02-14 17:01 PST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000048s latency).
Other addresses for localhost (not scanned): 127.0.0.1
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.4p1 Debian 2 (protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 0.24 seconds

Portanto, o comando grep está olhando para além da primeira instância do SSH (que meramente indica o mapeamento em / etc / services) para o servidor de hospedagem e informações de versão, que devem corresponder a "ssh" (sem distinção entre maiúsculas e minúsculas). O sinalizador -q simplesmente suprime a saída (portanto, isso pode substituir probe ). Se o nmap não puder descobrir qual é o serviço, ele dirá ssh? , então o regex do grep evita corresponder a isso.

Vamos combiná-los para torná-lo rápido, mas ainda assim verificar se o SSH está sendo realmente exibido:

# Usage: vet_ssh SERVER [PORT|SERVICE]
# True when SERVER has PORT (default=22) both opened and serving SSH
vet_ssh() {
  probe $1 ${2:-22} && nmap -sV -p ${2:-22} $1 |grep -qiE 'open.....*ssh[^?]'
}

Agora você pode usar vet_ssh no lugar de probe na sua função poke . Isso será quase tão rápido quanto a minha função poke original: é a mesma velocidade quando a porta não está aberta, é um pouco mais lenta quando a porta está aberta e servindo SSH, e é decentemente mais lenta quando aberta e servindo algo. reconhecer rapidamente (ou em todos). O regex do grep aqui é um pouco diferente para acomodar portas alternativas.

No caso de eu ter interpretado sua pergunta completamente de forma errada ... se você quiser saber se já está conectado a este servidor (em vez de saber se você pode ), use netstat de uma maneira como esta:

# Usage: am_i_sshed_to SERVER [PORT|SERVICE]
# True when you have an established connection to SERVER on PORT (default=22)
am_i_sshed_to() {
  local IP_QUERY='host "$1" |awk -v port="${2:-22}" '
    $2 != "mail" { printf "-e %s:%s ", $NF, port }
  ''
  netstat -tn |grep -w $IP_QUERY |grep -wq ESTABLISHED
}

Em seguida, você pode usar am_i_sshed_to da mesma maneira que probe ou vet_ssh .

(Explicação: netstat leva muito tempo para pesquisar cada endereço. Precisamos apenas de uma pesquisa para o servidor que queremos verificar, por isso, armazenamos o cache na primeira linha. O comando awk diz qualquer linha que não esteja discutindo a entrega de mensagens deve terminar ( $NF ) no IP. Faça uma consulta grep para nossa próxima chamada netstat, então 1.2.3.4 se torna, por exemplo, -e 1.2.3.4:22 e podemos ter vários IPs (até algumas centenas antes nós atingimos os limites de tamanho de linha de comando), então rodamos o netstat, olhando apenas para conexões TCP e não mapeando nada para um nome.Getamos palavras (não combina com "11.2.3.4:22" ou "1.2.3.4:2234 ") contra nossa consulta em cache (observe a falta intencional de citações, não precisamos delas e elas mudariam a estrutura do argumento!) e, em seguida, certifique-se de que a conexão ainda esteja estabelecida. Novamente, grep -q não tem saída. é um substituto substituto para probe , mas não para poke )

    
por 15.02.2014 / 02:12
0

Você pode apenas testar fazendo um ssh para sdf.org. Acabei de fazer e pediu autenticação. Caso contrário, você terá que pedir ao departamento de TI para abrir a porta 22.

    
por 27.06.2011 / 14:09