shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bulk] Re: [shell-script] netcat/telnet - conexão persistente


From: Fernando Mercês
Subject: Re: [Bulk] Re: [shell-script] netcat/telnet - conexão persistente
Date: Sat, 14 Feb 2015 11:19:37 +0400

@Ronaldo, legal saber que o expect é Tcl puro. O lance é que meu script em bash já tá bem grandinho. Tenho certeza que há um jeito em bash e não queria desistir sem lutar! :)

@Cartola, valeu pela oferta. Se realmente não rolar em bash, será o jeito.

@Julio, tá funcionando com terminais. Só não funciona quando ponho no scrip. Olha só:

-- Fazendo com vários terminais

No terminal 1, deixo um netcat escutando na porta 3000, simulando um servidor:

$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)

No terminal 2, crio o fifo e deixo o cat:

$ mkfifo fifo
$ cat > fifo

No terminal 3, conecto o fifo na entrada de um netcat (cliente):

$ cat fifo | nc -v localhost 3000
Connection to localhost 3000 port [tcp/*] succeeded!

Agora no terminal 4, mando os comandos normalmente:

$ echo comando1 > fifo
$ echo comando2 > fifo
$ echo comando3 > fifo

Ao voltar ao terminal 1 (server), vejo lá:

$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)
Connection from [127.0.0.1] port 3000 [tcp/*] accepted (family 2, sport 41722)
comando1
comando2
comando3

Ou seja, tudo funciona como esperado. Abri uma conexão do cliente com o servidor e a mantive, podendo agora enviar comandos à vontade.

No entanto, se coloco isso num script, fica:

No terminal 1, deixo o servidor exatamente como antes:
$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)

No terminal 2, rodo o seguinte script:

#!/bin/bash

rm -f fifo
mkfifo fifo
cat > fifo &
pid1=$!
cat fifo | nc -v localhost 3000 &
pid2=$!

echo enviando comandos...
echo comando1 > fifo
echo comando2 > fifo
echo comando3 > fifo

kill -9 $pid1 $pid2

Ao rodar o script, ele fica preso ao tentar escrever no fifo:

$ ./fifo.sh 
Connection to localhost 3000 port [tcp/*] succeeded!
enviando comandos...

No terminal 1 (servidor), que tem um netcat escutando na 3000, só aparece a conexão:

$ nc -vlkp 3000
Listening on [0.0.0.0] (family 0, port 3000)
Connection from [127.0.0.1] port 3000 [tcp/*] accepted (family 2, sport 42191)
Connection closed, listening again.

Não to conseguindo entender por que funciona fora do script, mas dentro não. :(

Abraços.


Att,

Fernando Mercês
Linux Registered User #432779
www.mentebinaria.com.br
------------------------------------
"Ninguém pode ser escravo de sua identidade; quando surge uma possibilidade de mudança é preciso mudar". (Elliot Gould)

2015-02-13 11:35 GMT-02:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden>:
 

Fala Nando,
acho que o que vc está chamando de loop, é no duro um semáforo fechado, pq não tem ninguém falando do lado de lá do fifo.

Experimente o seguinte:
No term 1 vc manda dados para o fifo, só que o 1º dado que vc mandará será o número do processo em bg (echo $! > fifo)
O term 2 armazena esse número (digamos em PidBg) e em seguida entra num loop de leitura, do tipo:

while true
do
    read -t N fifo || {
        kill PidBg
        exit 1
        }
done

Isto é, se não receber nada em N segundos, ele mata o processo em bg e se suicida.

Abcs,
Julio
@juliobash
P
róximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 09 a 13/03/15
São Paulo 4Linux 23 a 27/03/15
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.


Em 12 de fevereiro de 2015 23:36, Fernando Mercês address@hidden [shell-script] <address@hidden> escreveu:

 

@Ernander,

Não sei se você entendeu bem a pergunta, mas pelo que sei de expect ele não resolve, a não ser que eu abra mão de todo o meu escript em bash e tente fazer algo usando a linguagem do próprio expect, que não sei se é turing complete. Eu posso alterar para a minha função send_command usar o expect, mas como manter a conexão persistente nele a patir do meu script?

@Julio,

Eu to em viagem mas tenho novidades sobre o HnR quando voltar. Sai sim. ;-)

Em relação ao netcat, é isso mesmo, já somando à dica do @Ronaldo. No terminal funciona que é uma maravilha, mas quando coloco num script tem vários problemas. Tentei assim:

# aba 1
$ mkfifo f
$ cat > f

# aba 2
$ cat f | nc -v <ip> <porta>

# aba 3
$ echo -e "x\1b\x1a" >> f

Usei três abas no gnome-terminal aqui. No script tudo que mudo é que coloco em background (&) e aí não funciona. O echo no named pipe fica em loop e não acaba nunca. Daí nada acontece.

@Sidney, vou ver o que é isso. Parece interessante. :)

Obrigado a todos. Qualque ideia é bem vinda!


Att,

Fernando Mercês
Linux Registered User #432779
www.mentebinaria.com.br
------------------------------------
"Ninguém pode ser escravo de sua identidade; quando surge uma possibilidade de mudança é preciso mudar". (Elliot Gould)

2015-02-13 3:09 GMT+04:00 Sidney Souza address@hidden [shell-script] <address@hidden>:
 

Olá Mercês,


Acredito que os comandos faucet[1] e bison podem ajudar você. Eu nunca implementei nada utilizando os, mas um amigo do trabalho implementou um p2p em bash e disse que foi isso que ele usou para comunicar na época.

------------------------------------------------------
http://www.politicos.org.br

2015-02-12 20:02 GMT-02:00 'Julio C. Neves' address@hidden [shell-script] <address@hidden>:

 

Fala Nando,
e o Hack'n Rio, sai ou não sai? ;)

Nando, para vc manter a conexão, acho que vc precisa especificar uma porta na qual vc terá de um lado um programa falando e do outro, um programa ouvindo. Eu escrevi sobre isso qdo lanceia a 7a. edição do meu livro, mas há muito tempo não uso o nc e por isso estou esquecido, o material que escrevi está aqui. Chegando lá dê um CTRL+F "netcat"

Abcs,
Julio
@juliobash
P
róximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 09 a 13/03/15
São Paulo 4Linux 23 a 27/03/15
Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.


Em 12 de fevereiro de 2015 19:01, Fernando Mercês address@hidden [shell-script] <address@hidden> escreveu:

 

Olá, amigos.

Novamente recorro à lista. :) Tenho um dispositivo que acesso via telnet/netcat normalmente. Consigo automatizar comandos fazendo por exemplo:

echo comando | nc <ip>

Só que os comandos para este dispositivo são bastante chatos, então estou criando uma shell para interagir com ele. Acontece que cada comando dado na minha shell gera uma nova conexão TCP com o dispositivo, conforme vocês podem ver no trecho de código abaixo:

...
send_command() {
    # ctrl+a + command
    echo -e "\x1b\x01$1" |
     $nc $host $port
}
echo -n "$pname> "

has_quit=false

while read -r cmdline; do
    case $cmdline in
        info|i)
            send_command "INFO10201030002" ;;
...

Eu queria conectar apenas uma vez, ao subir a shell, e poder enviar comandos à vontade, como é se eu conectar diretamente no dispositivo via telnet/nc. Alguma ideia de como fazer?

Abraços.

Att,

Fernando Mercês
Linux Registered User #432779
www.mentebinaria.com.br
------------------------------------
"Ninguém pode ser escravo de sua identidade; quando surge uma possibilidade de mudança é preciso mudar". (Elliot Gould)







reply via email to

[Prev in Thread] Current Thread [Next in Thread]