Ajuda formatar saída. [RESOLVIDO]

1. Ajuda formatar saída. [RESOLVIDO]

Luis Eduardo Vilella
luivilella

(usa Debian)

Enviado em 25/06/2012 - 17:48h

Estou brincando um pouco aqui o Shell e estou com um problema, tenho uma saída que não esta saindo formatada.
Por hora estou montando um Script que a partir do arquivo dhcp.conf eu gero algumas regras.


rm -rf /etc/scripts/aux/
mkdir /etc/scripts/aux/
cp /etc/dhcp/dhcpd.conf /etc/scripts/aux/dhcpd.conf

arquivoEntrada="/etc/scripts/aux/dhcpd.conf"
arquivoAux1="/etc/scripts/aux/arquivoAuxiliar1"
arquivoAux2="/etc/scripts/aux/arquivoAuxiliar2"
arquivoAux3="/etc/scripts/aux/arquivoAuxiliar3"
arquivoAux4="/etc/scripts/aux/arquivoAuxiliar4"

#rm $arquivoAux1
#rm $arquivoAux2
#rm $arquivoAux3
#rm $arquivoAux4

arquivoSaidaSUBNET=$arquivoAux1
arquivoSaidaMaskSUBNET=$arquivoAux2
arquivoSaidaIP=$arquivoAux3
arquivoSaidaListaDeRegras=$arquivoAux4

delimitador="subnet"
grep -e $delimitador $arquivoEntrada | sed "s/$delimitador/_/g" | cut -d"_" -f2 | sed "s/ /_/g" | cut -d"_" -f2 > $arquivoSaidaSUBNET

delimitador="netmask"
grep -e $delimitador $arquivoEntrada | sed "s/$delimitador/_/g" | cut -d"_" -f2 | sed "s/ /_/g" | cut -d"_" -f2 > $arquivoSaidaMaskSUBNET

delimitador="fixed-address"
grep -e $delimitador $arquivoEntrada | sed "s/$delimitador/_/g" | sed "s/;/_/g" | cut -d"_" -f2 | sed "s/ //g" > $arquivoSaidaIP

for aux in `cat $arquivoSaidaIP`
do
echo "iptables -A INPUT -s " `echo $aux` " -j ACCEPT" >> $arquivoSaidaListaDeRegras
done

aux=""
for aux in `paste -d"/" $arquivoSaidaSUBNET $arquivoSaidaMaskSUBNET`
do
echo "iptables -A INPUT -s " `echo $aux` " -j REJECT" >> $arquivoSaidaListaDeRegras
done

#tail $arquivoSaidaSUBNET
#tail $arquivoSaidaMaskSUBNET
#tail $arquivoSaidaIP
cat $arquivoSaidaListaDeRegras



No primeiro FOR funciona perfeitamente.

for aux in `cat $arquivoSaidaIP`
do
echo "iptables -A INPUT -s " `echo $aux` " -j ACCEPT" >> $arquivoSaidaListaDeRegras
done

Saída:

iptables -A INPUT -s 10.1.1.111 -j ACCEPT
iptables -A INPUT -s 10.1.1.209 -j ACCEPT
iptables -A INPUT -s 10.1.1.215 -j ACCEPT
iptables -A INPUT -s 10.1.1.248 -j ACCEPT


Mas no segundo for não sai formatado.

for aux in `paste -d"/" $arquivoSaidaSUBNET $arquivoSaidaMaskSUBNET`
do
echo "iptables -A INPUT -s " `echo $aux` " -j REJECT" >> $arquivoSaidaListaDeRegras
done

Saída:

-j REJECT INPUT -s 10.1.1.0/255.255.255.0


Como estou começando a brincar certeza que é alguma coisa boba.


  


2. Re: Ajuda formatar saída. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/06/2012 - 17:58h

Tente assim:

echo "iptables -A INPUT -s "$(echo $aux)" -j REJECT" >> $arquivoSaidaListaDeRegras 


e ao invés de usar o sub-shell assim: "255.255.255.0" abrevie, pois é mais limpo leitura, deixando assim: "24", isso é se quer fazer assim é claro.

retorna ai.


3. Re: Ajuda formatar saída. [RESOLVIDO]

Luis Eduardo Vilella
luivilella

(usa Debian)

Enviado em 25/06/2012 - 18:10h

Vou testar aqui já retorno.. porem a questa dos 24 Bytes fica complicado pois eu preciso saber a mascara tipo 255.255.255.0 = 24, mais eu quero deixar algo que funcione para todos os casos.
Eu depois eu do uma olhada como faz a conversão para isso e coloco esta melhoria.



4. Re: Ajuda formatar saída. [RESOLVIDO]

Luis Eduardo Vilella
luivilella

(usa Debian)

Enviado em 25/06/2012 - 18:13h

Testei aqui.. nada ainda.
Resultado para:
 echo "iptables -A INPUT -s "$(echo $aux)" -j REJECT" >> $arquivoSaidaListaDeRegras  


-j REJECTA INPUT -s 10.1.1.0/255.255.255.0



5. Re: Ajuda formatar saída. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/06/2012 - 18:22h

olhando o script vi que a variável já está com conteúdo, então não precisa ecoar em um sub-shell, vê se funciona como está abaixo:

echo "iptables -A INPUT -s "$aux" -j REJECT" >> $arquivoSaidaListaDeRegras 


pode até ficar assim:

echo iptables -A INPUT -s "$aux" -j REJECT >> $arquivoSaidaListaDeRegras 



6. Re: Ajuda formatar saída. [RESOLVIDO]

Luis Eduardo Vilella
luivilella

(usa Debian)

Enviado em 25/06/2012 - 19:28h

Então referente ao sub-shell é que eu estava fazendo outras coisas com o valor da variável.
Testei das duas maneiras.
Resultado:

-j REJECTA INPUT -s 10.1.1.0/255.255.255.0
-j REJECTA INPUT -s 10.1.1.0/255.255.255.0


Estou achando estranho fiz um teste:

echo " abcdef "$aux" ghij"


Resultado:

ghijef 10.1.1.0/255.255.255.0



7. Re: Ajuda formatar saída. [RESOLVIDO]

Luis Eduardo Vilella
luivilella

(usa Debian)

Enviado em 25/06/2012 - 20:06h

Efetuei mais alguns testes demonstra a saída acima com mais visualização.
Adicionando caracteres esquerda ele remove um a direita.

echo "iptables -A INPUT -s " $aux
echo "iptables -A INPUT -s " $aux " "
echo "iptables -A INPUT -s " $aux " "

Resultado:

iptables -A INPUT -s 10.1.1.0/255.255.255.0
tables -A INPUT -s 10.1.1.0/255.255.255.0
ables -A INPUT -s 10.1.1.0/255.255.255.0

Comparação:

iptables -A INPUT -s
iptables -A INPUT -s

iptables -A INPUT -s
tables -A INPUT -s

iptables -A INPUT -s
ables -A INPUT -s



8. Re: Ajuda formatar saída. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 25/06/2012 - 20:15h

já tentou executar sem colocar as aspas ?


9. Re: Ajuda formatar saída. [RESOLVIDO]

Luis Eduardo Vilella
luivilella

(usa Debian)

Enviado em 25/06/2012 - 20:27h

sim sim segui os dois testes os quais você passou.
Segue teste sem aspas.


echo iptables -A INPUT -s "$aux"
echo iptables -A INPUT -s "$aux" T
echo iptables -A INPUT -s "$aux" TT

Resultado

iptables -A INPUT -s 10.1.1.0/255.255.255.0
Ttables -A INPUT -s 10.1.1.0/255.255.255.0
TTables -A INPUT -s 10.1.1.0/255.255.255.0



10. Escape especial chars

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/06/2012 - 07:46h


# escape especial chars?
echo "iptables -A INPUT -s \"${AUX}\" -j REJECT"
echo 'iptables -A INPUT -s '${AUX}' -j REJECT'


Eu acho que o "defeito" está na construção dos arquivos temporários e/ou na rotina que pega os dados para o laço de repetição com fim determinado e não no echo em si.

Poste exemplos dos arquivos para que seja mais fácil lhe fornecer alguma ajuda.


11. Re: Ajuda formatar saída. [RESOLVIDO]

Luis Eduardo Vilella
luivilella

(usa Debian)

Enviado em 26/06/2012 - 13:31h

./.ronin escreveu:


# escape especial chars?
echo "iptables -A INPUT -s \"${AUX}\" -j REJECT"
echo 'iptables -A INPUT -s '${AUX}' -j REJECT'


Eu acho que o "defeito" está na construção dos arquivos temporários e/ou na rotina que pega os dados para o laço de repetição com fim determinado e não no echo em si.

Poste exemplos dos arquivos para que seja mais fácil lhe fornecer alguma ajuda.


@./.ronin
Estou testando com um arquivo DHCP.conf normal.
cp /etc/dhcp/dhcpd.conf /etc/scripts/aux/dhcpd.conf
arquivoEntrada="/etc/scripts/aux/dhcpd.conf"

#dhcp3-server
ddns-update-style none;
default-lease-time 600;
max-lease-time 7200;
authoritative;

subnet 10.1.1.0 netmask 255.255.255.0
{
range 10.1.1.100 10.1.1.252;
option routers 10.1.1.98;
option domain-name-servers 208.67.222.222
,208.67.220.220
,67.138.54.100
,207.225.209.66
,156.154.70.1
,156.154.71.1
,8.8.8.8
,8.8.4.4;
option broadcast-address 10.1.1.255;

host PC1
{
hardware ethernet ac:72:89:09:a4:11;
fixed-address 10.1.1.111;
}
host PC2
{
hardware ethernet 4c:ed:de:74:be:ff;
fixed-address 10.1.1.209;
}
host PC3
{
hardware ethernet b4:74:9f:9c:64:f8;
fixed-address 10.1.1.215;
}


Não entendo muito então acho que deve ser alguma coisa boba que estou errando. Só não entendo porque em um FOR funciona normalmente e em outro não.


12. Re: Ajuda formatar saída. [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/06/2012 - 01:31h

A versão original rodou sem problemas em meu sistema. O resultado foi:

iptables -A INPUT -s 10.1.1.0/255.255.255.0 -j REJECT


Mas tomei a ousadia de reescrer seu script.


arquivoSaidaSUBNET=$arquivoAux1
arquivoSaidaMaskSUBNET=$arquivoAux2
arquivoSaidaIP=$arquivoAux3
arquivoSaidaListaDeRegras=$arquivoAux4


_INICIO_REGRA='iptables -A INPUT -s'
_ACCEPT_FIM_REGRA='-j ACCEPT'
_REJECT_FIM_REGRA='-j REJECT'

function _setSubnet()
{
delimitador='subnet'
grep -e $delimitador $arquivoEntrada |
sed "s/$delimitador/_/g" |
cut -d '_' -f2 |
sed 's/ /_/g' |
cut -d '_' -f2
} > $arquivoSaidaSUBNET

function _setMaskSubnet()
{
delimitador='netmask'
grep -e $delimitador $arquivoEntrada |
sed "s/$delimitador/_/g" |
cut -d '_' -f2 |
sed 's/ /_/g' |
cut -d '_' -f2
} > $arquivoSaidaMaskSUBNET

function _setIp()
{
delimitador='fixed-address'
grep -e $delimitador $arquivoEntrada |
sed "s/$delimitador/_/g" |
sed 's/;/_/g' |
cut -d '_' -f2 |
sed 's/ //g'
} > $arquivoSaidaIP

function _getRejectList()
{
paste -d '/' $arquivoSaidaSUBNET $arquivoSaidaMaskSUBNET
}

function _setAcceptRules()
{
while read _IP_RANGE
do
echo "${_INICIO_REGRA} ${_IP_RANGE} ${_ACCEPT_FIM_REGRA}"
done < $arquivoSaidaIP
} > $arquivoSaidaListaDeRegras

function _setRejectRules()
{
unset _IP_RANGE

for _IP_RANGE in $( _getRejectList )
do
echo "${_INICIO_REGRA} ${_IP_RANGE} ${_REJECT_FIM_REGRA}"
done
} >> $arquivoSaidaListaDeRegras

function _getDebug()
{
echo -e "\nDebug$0\nSubnet"
cat $arquivoSaidaSUBNET
echo -e "\nMaskSubnet"
cat $arquivoSaidaMaskSUBNET
echo -e "\nIP"
cat $arquivoSaidaIP
echo -e "\nLista de regras"
cat $arquivoSaidaListaDeRegras
}

_setSubnet
_setMaskSubnet
_setIp
_setAcceptRules
_setRejectRules

DBG=$1
if [ $DBG == '-d' ]
then
_getDebug
fi


A minha suspeita é que seu sistema deve estar com algum problema/bug.
Verifique a shell usada para rodar seu código. Eu usei a bash para rodar o script em questão.


Boa SORTE!!!



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts