Vetores \ Arrays no Bash

1. Vetores \ Arrays no Bash

Paulo Ferraz
killAll

(usa Outra)

Enviado em 29/05/2006 - 14:26h

Olá amigos!!
Tenho um problema c\ um vetor não dimensionado num script Bash que verifica serviços vulneráveis em hosts c\ nmap.
No teste condicional recebo a resposta: muitos argumentos.
Acredito que seja erro de sintaxe e não da lógica.
Segue código:

P=$(cat IP); # arquivo IP contém endereços IP à serem scaneados

for i in $P;
do
cd $i; # vai p\ diretório previamente criado de nome igual ao IP do host
declare -a vt=$(cat IP_$i); # define, para cada IP, um vetor que terá suas portas ativas
n=0; # inicializa o índice do vetor que representa cada porta
if [ ${vt[$n]} == 21/tcp ]; # verifica se elemento combina c\ padrão 21/tcp
then {ping -c 3 $i > ping; n++}; # se sim dá ping e armazena em arquivo, no mesmo bloco
elif [ ${vt[$n]} == 53/udp ]; # incrementa índice
then {ping -c 3 $i >> ping; n++};
else echo "Nada" >> ping;
cd ..; # sai do diretório referente ao IP
fi
done


-bash: [: too many arguments # saida repetida 4 vezes
-bash: [: too many arguments
-bash: [: too many arguments
-bash: [: too many arguments

Alguma dica?

Abraço à todos!



  


2. Resposta

Lame Duck
lame_duck_hat

(usa Outra)

Enviado em 27/03/2008 - 15:48h

Infelizmente não dá pra testar perfeitamente seu script aqui, já que não tenho as pastas e arquivos e ele usa.

Quando testei ele apontou outros erros aqui, e nenhum erro que você citou.

Vou mostrar alguns possíveis erros no script, tente mudá-lo e veja se funciona:

Na linha:

if [ ${vt[$n]} == 21/tcp ];
Se não me engano o comando test "[ ]" quando testa string usa apenas um sinal de igual, em muitas vezes é necessário colocar tanto a variável quanto o valor a ser comparado entre aspas.

Deveria ficar:

if [ "${vt[$n]}" = "21/tcp" ];

-----------

Na linha:
then {ping -c 3 $i > ping; n++};

Não deveria estar entre colchetes os comandos após o then.
Deveria ser.
then ping -c 3 $i > ping; n++;


---------------

O mesmo para as linhas:
elif [ ${vt[$n]} == 53/udp ]; # incrementa índice
then {ping -c 3 $i >> ping; n++};

deveriam ser:

elif [ "${vt[$n]}" = "53/udp" ];
then ping -c 3 $i >> ping; n++;

-----------------------
Modifiquei o script, não sei se está tudo certo se quiser testar direto, tente aqui:


P=$(cat IP); # arquivo IP contém endereços IP à serem scaneados

for i in $P;
do

cd $i; # vai p\ diretório previamente criado de nome igual ao IP do host
declare -a vt=$(cat IP_$i); # define, para cada IP, um vetor que terá suas portas ativas
n=0; # inicializa o índice do vetor que representa cada porta

if [ "${vt[$n]}" = "21/tcp" ]; # verifica se elemento combina c\ padrão 21/tcp
then ping -c 3 $i > ping; n++; # se sim dá ping e armazena em arquivo, no mesmo bloco

elif [ "${vt[$n]}" = "53/udp" ]; # incrementa índice
then ping -c 3 $i >> ping; n++;

else echo "Nada" >> ping;
cd ..; # sai do diretório referente ao IP
fi
done


-----
Tenho escrito uma apostila de Shell, caso interesse ler:
http://patinhofaminto.awardspace.com/tutorial.php






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts