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

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

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


From: Felipe S. Costa
Subject: RES: [shell-script] Localizar, procurar e editar com shell-script
Date: Fri, 27 Jun 2014 21:46:48 -0300

Ótimo Paulo,

 

                Realmente funciona. J Consegui 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 [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 [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 [shell-script]"
> > <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>
> > [shell-script] <address@hidden <mailto: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> [shell-script]" <address@hidden
> > <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> [shell-script]
> > <address@hidden <mailto: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]