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

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

Re: RES: [shell-script] Localizar, procurar e editar com shell-script


From: Paulo Bettega
Subject: Re: RES: [shell-script] Localizar, procurar e editar com shell-script
Date: Sat, 28 Jun 2014 03:07:44 -0300
User-agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.6.0

Pelo que entendi, então não é o caso de fazer uma edição em lote,
em todas as linhas dos protocolos, in e out, com a mesma porta, entendi certo?

Acho que vc quer por exemplo abrir a porta 80 TCP_IN , então só é preciso
editar a linha TCP_IN e adicionar a porta. Depois se vc quiser fechar essa
porta, roda o script de novo com TCP_IN 80 para deletar o 80 da linha, é isso?

Se for isso, pode ser passando os parâmetros para um script (novamente como o 
Julio fez:)
(Se não for, descomente as linhas do "for do done" e comente a linha 
"regra=$..."
assim cada regra será testada com a porta. Se vc quiser testar mais de uma porta
pra cada regra, coloque mais um for com as portas dentro do for das regras)

$ cat edita-csf.conf.sh
#!/bin/bash
#

#for regra in TCP_IN UDP_IN TCP_OUT UDP_OUT TCP6_IN UDP6_IN TCP6_OUT UDP6_OUT
#do

  regra=${2^^}
  porta=$1

  # Esta linha realiza a busca da variável nas linhas da $regra
  grep -qE "^$regra = .*\b$porta\b" csf.conf && {

  # Com esta linha removemos a variavel da $regra; se a busca tiver sucesso
  sed -ir \
  '/^'$regra'/ { s/\b'$porta'\b//; s/",/"/; s/,"/"/; s/,,/,/; }' csf.conf
  } || {

  # E esta adiciona a variável na linha da $regra; se a busca falhar
  sed -i '/^'$regra'/ s/"$/,'$porta'"/' csf.conf
  }

#done
#--------------------------------------

passando protocolo e porta como parâmetros
$ edita-csf.conf.sh 80 TCP_IN

funciona do mesmo jeito, se houver 80 na linha do TCP_IN, exclui,
se não houver, inclui.

Vc pode chamar o script dentro de outro, ou usar como uma função,
daí passe as variáveis que vc quer como parâmetros
edita-csf.conf.sh $NETWORKPORT1 $PROTOCOLO
edita-csf.conf.sh $VPNPORT1 UDP_IN


O firewall é iptables? Aquelas faixas de portas indicadas como 1:65535
fica mais complicado se vc quiser excluir portas. Uma solução seria
vc criar uma regra de bloqueio para cara porta, ao invés de tirar a porta
da faixa.

Abraços Paulo Bettega


On 27-06-2014 21:46, 'Felipe S. Costa' address@hidden [shell-script] wrote:
Ótimo Paulo,

                 Realmente funciona. JConsegui incluir corretamente a porta 
(10000) automaticamente.
Mas ai ocorreu um problema...  Quando rodei o comando pela segunda vez, ele 
duplicou a porta
(adicionou novamente). Algumas perguntas:

                 Esta linha realiza a busca da variável nas linhas da $regra, 
certo?

grep -qE "^$regra = .*\b$NETWORKPORT1\b" csf.conf

Com esta linha removemos a variavel do TCP_IN;

{
sed -ir '/'$regra'/ s/\b'$NETWORKPORT1'\b//; s/",|,"/"/; s/,,/,/' csf.conf
}

E esta adiciona a variável na linha UDP_IN;

|| {
sed -i '/'$regra'/ s/"$/,'$NETWORKPORT1'"/' csf.conf;}

Como editar para que procure a variável em cada linha (TCP_IN UDP_IN TCP_OUT 
UDP_OUT TCP6_IN
TCP6_OUT UDP6_IN UDP6_OUT), se encontrar, passar para a próxima e se não 
encontrar, inserir a
variável e passar para a proxima?. Tentei utilizar o “|” mas não funcionou.

                 Bom, esta seria a função que adicionarei ao script de criar 
usuários.

                 A parte de remover seria adicionada ao script de remover 
usuários e seria
basicamente a mesma de adicionar, somente modificando para remover a variável 
das linhas.

                 Mais uma e última, como adicionar mais variáveis para realizar 
as mesmas buscas e
alterações, algo como \b’$NETWORKPORT1’\b;\b’$VPNPORT1’\b;\b’$FTPPORT1’\b?

Já agradeço pelo help até o momento. Pouco a pouco as idéias vao clareando aqui.

*De:*address@hidden [mailto:address@hidden]
*Enviada em:* sexta-feira, 27 de junho de 2014 12:27
*Para:* address@hidden
*Assunto:* Re: [shell-script] Localizar, procurar e editar com shell-script

Olá Arkan, o meu exemplo não funciona, acho que o problema é o
^ marcando o começo de linha no teste do bash.
Fazendo o teste com um texto ( [[ TCP_IN =~ ^TCP ]] ) casa, mas
com um arquivo ( [[ "$(cat csf.conf)" =~ ^TCP ]] ) não casa.

Usando o grep (como o Julio fez) dá certo.

$ cp csf.conf csf.conf-original
$ for regra in TCP_IN UDP_IN TCP6_IN UDP6_IN; do
NETWORKPORT1=10000
grep -qE "^$regra = .*\b$NETWORKPORT1\b" csf.conf && {
sed -ir '/'$regra'/ s/\b'$NETWORKPORT1'\b//; s/",|,"/"/; s/,,/,/' csf.conf
} || {
sed -i '/'$regra'/ s/"$/,'$NETWORKPORT1'"/' csf.conf;}
done

Inclui a porta 10000 na linha com UDP_IN e exclui na linha com TCP_IN

Abraços Paulo Bettega

On 25-06-2014 15:55, Paulo Bettega address@hidden <mailto:address@hidden>
[shell-script] wrote:
 > Agora com uma parte do arquivo dá pra ver melhor o que vc quer :)
 > veja se é isso.
 >
 > $ cp csf.conf csf.conf-original
 > $ for regra in TCP_IN UDP_IN TCP6_IN UDP6_IN; do
 > NETWORKPORT1=10
 > exp="^$regra = .*[\",]{1}$NETWORKPORT1[\",]{1}"
 > [[ "$(cat csf.conf)" =~ $exp ]] && { sed -i "/$regra/ s/$NETWORKPORT1//; 
s/\",/\"/; s/,,/,/;
 > s/,\"/\"/" csf.conf;} || { sed -i "/$regra/ s/\"$/,$NETWORKPORT1\"/" 
csf.conf;}
 > done
 >
 > Para inclusão da porta, o teste da expressão entra no || já que a porta não 
existe.
 > Para exclusão, entra no && já que a porta existe e vai casar com a expressão.
 >
 > Pode ter faixas de portas separadas por dois-pontos misturadas na mesma 
regra,
 > por exemplo na regra TPC_IN? Se puder daí complica, o meu exemplo não 
funciona.
 >
 > Abraços Paulo Bettega
 >
 > On 25-06-2014 13:51, Arkan Add address@hidden <mailto:address@hidden> 
[shell-script] wrote:
 > > Sem problemas,
 > >
 > > Preciso editar algumas linhas dentro daquele arquivo (csf.conf) em 
/etc/csf/.
 > >
 > > Hoje preciso criar um script manualmente com as portas que quero liberar e 
gero aquela linha
"sed -i
 > > 's/^TCP_IN =.*/TCP_IN = "227,280,9090,10500,57413"/' csf.conf"para 
substituir a linha existente.
 > >
 > > Por exemplo,
 > >
 > > Se eu configuro um serviço que utiliza a porta 10, pego as TCP/UDP_IN 
TCP6/UDP6_IN... , adiciona a
 > > porta 10, edito e executo a linha "sed -i 's/^TCP_IN =.*/TCP_IN = 
"227,280,9090,10500,57413,10"/'
 > > csf.conf" Alterando o campo TCP_IN para o protocolo correspondete.
 > >
 > > E para remover realizo o mesmo procedimento, somente retirando as portas 
que de
 > >
 > > /etc/csf/csf.conf
 > > ...
 > > # Lists of ports in the following comma separated lists can be added using 
a
 > > # colon (e.g. 30000:35000).
 > >
 > > # Allow incoming TCP ports
 > > TCP_IN = "80,10000,33650,33651"
 > >
 > > # Allow outgoing TCP ports
 > > TCP_OUT = "1:65535"
 > >
 > > # Allow incoming UDP ports
 > > UDP_IN = "33651"
 > >
 > > # Allow outgoing UDP ports
 > > # To allow outgoing traceroute add 33434:33523 to this list
 > > UDP_OUT = "1:65535"
 > >
 > > # Allow incoming PING
 > > ICMP_IN = "1"
 > >
 > > # Set the per IP address incoming ICMP packet rate
 > > # To disable rate limiting set to "0"
 > > ICMP_IN_RATE = "1/s"
 > >
 > > # Allow outgoing PING
 > > ICMP_OUT = "1"
 > >
 > > # Set the per IP address outgoing ICMP packet rate (hits per second 
allowed),
 > > # e.g. "1/s"
 > > # To disable rate limiting set to "0"
 > > ICMP_OUT_RATE = "0"
 > >
 > > 
###############################################################################
 > > ...
 > >
 > > No exemplo do Paulo, ele consegue inserir a variavel na linha, mas ele 
seta a linha com os
valores a
 > > serem pesquisados, como variavel.
 > >
 > >
 > >
 > > On Wednesday, June 25, 2014 9:54 AM, "'Julio C. Neves' address@hidden
<mailto:address@hidden> [shell-script]"
 > > <address@hidden <mailto:address@hidden>> wrote:
 > >
 > >
 > > Cara que bobeada, eu ia fazer em awk e depois achei melhor fazer em sed. 
Como já estava com um sono
 > > danado, acho que misturei tudo e fiz uma grande besteira e gerei um 
cruzamento de 'aff maria' com
 > > 'cruz credo'.
 > >
 > > Pesquisei no arquivo pq foi isso que imaginei que vc queria. O problema é 
que seu exemplo foi meio
 > > incoerente com o que vc está falando. Seu exemplo foi:
 > >
 > > sed -i 's/^TCP_IN =.*/TCP_IN = "227,280,9090,10500,57413"/' csf.conf
 > >
 > > Por favor explique melhor a que linha vc se refere. O que vc deseja na 
saída, algumas linhas
 > > editadas ou o arquivo /etc/csf.conf editado?
 > >
 > > Algumas dicas:
 > > 1- A barra vertical dentro de uma expressão regular equivale a um 'ou' 
lógico então para pesquisar
 > > as cadeias que vc citou, pode-se separar as linhas da seguinte maneira:
 > > grep -E 
'^(TCP_IN|TCP_OUT|UDP_IN|UDP_OUT|TCP6_IN|TCP6_OUT|UDP6_IN|UDP6_OUT)=' /etc/csf.conf
 > >
 > > 2- Vc tb pode especificar as linhas que deseja alterar, passando o inicio 
delas por parâmetro,
 > > colocando logo no início do script o seguinte:
 > > RegExp=^\($(tr ' ' '|' <<< "$@")\)\ =
 > > Fiz um testezinho no prompt para vc entender:
 > > $ set - TCP_IN TCP_OUT UDP_IN # passando os parâmetros TCP_IN TCP_OUT 
UDP_IN para o
 > > shell do prompt
 > > $ RegExp=^\($(tr ' ' '|' <<< "$@")\)\ = # Gerando a Expressão Regular
 > > $ echo "$RegExp" # Mostrando que ER está pronta para ser usada
 > > ^(TCP_IN|TCP_OUT|UDP_IN) =
 > >
 > > Abcs,
 > > Julio
 > > *@juliobash*
 > > *Próximos cursos de Shell*
 > > *Cidade LocalPeríodo*
 > > *Rio de JaneiroEDX <http://edx.srv.br/>02 a 06/06*
 > > *São Paulo4Linux <http://www.4linux.com.br/>21 a 25/07*
 > > Dou treinamento de /Shell/ em qualquer cidade.
 > > Para mais detalhes, me mande um e-mail <mailto:address@hidden>.
 > >
 > >
 > >
 > > Em 24 de junho de 2014 23:48, Arkan Add address@hidden 
<mailto:address@hidden>
<mailto:address@hidden>
 > > [shell-script] <address@hidden <mailto:address@hidden
<mailto:address@hidden%20%3cmailto:address@hidden>>> escreveu:
 > >
 > > __
 > > Julio,
 > >
 > > ++ sudo grep '\b51211\b' /etc/csf/csf.conf
 > > ++ sudo sed -i.veio '/^TCP_IN/; s/$/,51211' /etc/csf/csf.conf
 > > sed: -e expression #1, char 10: unknown command: `;'
 > > ++ echo Incluindo porta 51211
 > > Incluindo porta 51211
 > >
 > > Houve falha na adiçao da regra. Vi que voce procurou pelo valor no arquivo 
e não na linha, é
 > > possivel procurar somente na linha ou linhas? Eu terei que adicionar esta 
mesma variavel nas
 > > linhas que se iniciam com TCP_IN = , TCP_OUT = , UDP_IN = , UDP_OUT = , 
TCP6_IN = , TCP6_OUT = ,
 > > UDP6_IN = , UDP6_OUT = .
 > >
 > > Para remover este valor do csf.conf é que creio que esta mais complicado.
 > >
 > > Precisara ler o valor das linhas "network port1: , network port2:" dentro 
do arquivo
 > > /etc/$NEWUSER1.info, voltar no /etc/csf/csf.conf e remove-las das linhas 
TCP_IN = , TCP_OUT = ,
 > > UDP_IN = , UDP_OUT = , TCP6_IN = , TCP6_OUT = , UDP6_IN = , UDP6_OUT = .
 > >
 > >
 > >
 > >
 > > On Tuesday, June 24, 2014 10:44 PM, "'Julio C. Neves' address@hidden
<mailto:address@hidden>
 > > <mailto:address@hidden> [shell-script]" <address@hidden
<mailto:address@hidden%0b>> > <mailto:address@hidden>> wrote:
 > >
 > >
 > > grep "\b$NETWORKPORT1\b" /etc/csf.conf || {
 > > sed -i.veio "/^TCP_IN/; s/$/,$NETWORKPORT1"/etc/csf.conf
 > > echo Incluindo porta $NETWORKPORT1
 > > csf -r
 > > echo /etc/csf.conf está OK
 > > }
 > >
 > > Abcs,
 > > Julio
 > > *@juliobash*
 > > *Próximos cursos de Shell*
 > > *Cidade LocalPeríodo*
 > > *Rio de JaneiroEDX <http://edx.srv.br/>02 a 06/06*
 > > *São Paulo4Linux <http://www.4linux.com.br/>21 a 25/07*
 > > Dou treinamento de /Shell/ em qualquer cidade.
 > > Para mais detalhes, me mande um e-mail <mailto:address@hidden>.
 > >
 > >
 > >
 > > Em 24 de junho de 2014 22:21, address@hidden <mailto:address@hidden>
<mailto:address@hidden> [shell-script]
 > > <address@hidden <mailto:address@hidden
<mailto:address@hidden%20%3cmailto:address@hidden>>> escreveu:
 > >
 > > __
 > > Estou precisando resolver uma questão de manipulação de texto para um 
projeto pessoal de
 > > automação aqui. Basicamente tenho um script que cria usuarios 
automaticamente e estou
 > > precisando adicionar uma função para liberar portas no firewall para os 
serviços que este
 > > script habilita.
 > >
 > > Utilizo o csf como firewall e consigo refazer toda uma linha com o comando 
abaixo:
 > >
 > > sed -i 's/^TCP_IN =.*/TCP_IN = "227,280,9090,10500,57413"/' csf.conf
 > >
 > > Os campos que preciso modificar são campos dentros das "".
 > >
 > > Por exemplo:
 > >
 > > Eu recebo a porta a porta pela variavel $NETWORKPORT1
 > >
 > > Supondo que o valor da variavel seja 50, preciso checar se ele existe na 
linha TCP_IN dentro
 > > do /etc/csf.conf, se não existir, adiciona-lo e realizar o refresh de 
regras executando um
 > > "csf -r".
 > >
 > > Também preciso realizar o contrario, verificar se um valor existe nesta 
mesma linha,
 > > remove-lo e realizar o refresh nas regras.
 > >
 > > Qual a melhor forma de realizar tais funçoes?
 > >
 > >
 > >
 > >
 >



reply via email to

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