Como posso testar se a conexão com o host / porta fornecido é estabelecida no Bash?

3

Atualmente estou usando o netstat para isso:

if netstat -an | grep ESTABLISHED | grep $address:$port > /dev/null; then
    # command
fi  

Existe uma solução mais elegante?

    
por Eugene Yarmash 19.09.2011 / 16:12

5 respostas

3

No que diz respeito à elegância, eu modificaria duas coisas em seu comando:

  • Como mencionado no comentário de Chris, você pode usar -q em vez de redirecionamento de saída.
  • Use um grep em vez de dois:

    if netstat -an | grep -q " $address:$port .* ESTABLISHED"; then
    
por 19.09.2011 / 23:31
2

lsof deve fazer o trabalho. Peça para dar a você uma saída analisável por máquina com a opção -F .

lsof -n -i @${hostname}:${port} -F nT | grep '^TST=ESTABLISHED$'

Se precisar de mais informações:

lsof -n -i -F nT | awk '
    function host_port(s, a) {
        match(s, /:[^:]*$/);
        a["host"] = substr(s, 1, RSTART-1);
        a["port"] = substr(s, RSTART+1);
    }
    sub(/^p/,"") {pid = $0}
    sub(/^n/,"") {
        split($0, endpoints, "->");
        host_port(endpoints[1], from);
        host_port(endpoints[2], to);
    }
    /^TST=ESTABLISHED$/ {
        print "Established from", from["host"] ":" from["port"],
              "to", to["host"] ":" to["port"]
    }
'
    
por 20.09.2011 / 00:55
2

com ss :

if ss -n -o state established '( dport = $hostname:$portnumber )'|awk 'NR==2{exit 0}END{exit 1}';then 
    
por 13.04.2012 / 06:05
1

Isso funciona bem o suficiente por enquanto, para o Linux.

Em outros sistemas UNIX (os que tenho em minhas mãos são o Mac OS X e o Solaris), a porta é separada por . em vez de : .

E isso provavelmente falhará em qualquer conexão IPv6. netstat trunca endereços IPv6, portanto, use --wide . Mas, novamente, essa não é uma opção portátil.

    
por 19.09.2011 / 17:41
1

Você pode usar lsof em vez de netstat : algo assim: sudo /usr/sbin/lsof -i [email protected]:80 , mas lsof está disponível apenas para o usuário root e geralmente não é instalado por padrão, portanto, é uma dependência externa adicional.

    
por 19.09.2011 / 19:43