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
)