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