Discussion:
[shell-script] Extrair comandos a partir de um arquivo
Michael Costa linuxajuda@gmail.com [shell-script]
2017-03-17 13:12:39 UTC
Permalink
Pessoal, bom dia!

Tenho um arquivo com o seguinte conteudo:

maestro_932_gid=931(grpmstr)_groups=1(staff)_groups=1(staff)_/maestro_/bin/bash
sapadm_32123_gid=204(sapsys)_groups=206(oper),208(sapinst)_groups=206(oper),208(sapinst)_/home/sapadm_/usr/bin/ksh
oracle_31201_gid=205(dba)_groups=206(oper),208(sapinst)_groups=206(oper),208(sapinst)_/oracle/SID_/bin/false
usuario_206_gid=204(sapsys)_groups=208(sapinst)_groups=208(sapinst)_/home/usuario_/bin/bash

O que estou tentando fazer, é usar este arquivo como origem e gerar os
comandos de criação de usuário e grupo baseado nele.
Problemas que estou enfrentando:

O campo do ((HOME) é variável, as vezes está na sexta posição e em outras
vezes varia.
Os grupos se repetem, preciso de uma forma de validar se o comando do grupo
já foi processado e não repetir (pensei em jogar todos os comandos para um
arquivo e depois dar um uniq nele)
Preciso validar se o grupo ou o usuário já existem no servidor.

A saida esperada, seria algo do tipo:

groupadd -g 931 grpmstr
groupadd -g 1 staff
useradd -g grpmstr -u 932 -G staff -m -s /bin/bash maestro

groupadd -g 204 sapsys
groupadd -g 206 oper
Grupo sapinst já existe no sistema com ID 208
useradd -g sapsys -u 32123 -G oper,sapinst -m -s /usr/bin/ksh

groupadd -g 205 dba
Grupo oper já existe no ambiente com ID 206
Usuario oracle já existe no ambiente. (saida do comando id oracle)

E por ai vai.

Entenderam ?

Agradeço!
Robson Alexandre alexandrerobson@gmail.com [shell-script]
2017-03-17 19:38:35 UTC
Permalink
Michael

acho que vc deveria montar seu algoritmo da seguinte forma

1- Parsear seu arquivo de entrada
2- Separar os grupos para serem criados primeiramente
3- Adicionar os usuários em seus respectivos grupos com seus respectivos
parâmetros

Mais ou menos desta forma:

#!/bin/bash
grupos=( )
usuarios=( )
while IFS='_' read user uid gid groups1 groups2 home shell resto; do

groups1=${groups1#groups=}
groups2=${groups2#groups=}
grupos+=( ${gid#gid=} ${groups1//,/ } ${groups2//,/ } )

groups=$(grep -Eo "[a-zA-Z]+" <<< "$groups1 $groups2")
usuarios+=( "$user:$gid:$uid:$groups:$shell" )

done < arquivo_de_entrada

grupos=( $(sort -nu <(printf "%s\n" ${grupos[@]})) )
for grupo in "${grupos[@]}"; do
grupo=( $(sed -r 's/(.*)\((.*)\)/\1 \2/' <<< "$grupo") )
echo groupadd -g ${grupo[0]} ${grupo[1]}
groupadd -g ${grupo[0]} ${grupo[1]}
done

#useradd -g sapsys -u 32123 -G oper,sapinst -m -s /usr/bin/ksh
for usuario in ${usuarios[@]}; do
params=( ${usuario//:/ } )
echo useradd -g ${params[1]} -u ${params[2]} -G ${params[3]} -m -s
${params[4]} ${params[0]}
done
#EOF

Notei que os campos groups se repetem a cada linha. Isso acontece em todas
as linhas?
Sobre o que vc falou sobre os campos de home estarem em posições
diferentes, qual seria o padrão destas posições?


Atenciosamente
Robson Alexandre
Post by Michael Costa ***@gmail.com [shell-script]
Pessoal, bom dia!
maestro_932_gid=931(grpmstr)_groups=1(staff)_groups=1(staff)_/maestro_/bin/bash
sapadm_32123_gid=204(sapsys)_groups=206(oper),208(sapinst)_groups=206(oper),208(sapinst)_/home/sapadm_/usr/bin/ksh
oracle_31201_gid=205(dba)_groups=206(oper),208(sapinst)_groups=206(oper),208(sapinst)_/oracle/SID_/bin/false
usuario_206_gid=204(sapsys)_groups=208(sapinst)_groups=208(sapinst)_/home/usuario_/bin/bash
O que estou tentando fazer, é usar este arquivo como origem e gerar os
comandos de criação de usuário e grupo baseado nele.
O campo do ((HOME) é variável, as vezes está na sexta posição e em outras
vezes varia.
Os grupos se repetem, preciso de uma forma de validar se o comando do
grupo já foi processado e não repetir (pensei em jogar todos os comandos
para um arquivo e depois dar um uniq nele)
Preciso validar se o grupo ou o usuário já existem no servidor.
groupadd -g 931 grpmstr
groupadd -g 1 staff
useradd -g grpmstr -u 932 -G staff -m -s /bin/bash maestro
groupadd -g 204 sapsys
groupadd -g 206 oper
Grupo sapinst já existe no sistema com ID 208
useradd -g sapsys -u 32123 -G oper,sapinst -m -s /usr/bin/ksh
groupadd -g 205 dba
Grupo oper já existe no ambiente com ID 206
Usuario oracle já existe no ambiente. (saida do comando id oracle)
E por ai vai.
Entenderam ?
Agradeço!
--
Atenciosamente

Robson Alexandre
Michael Costa linuxajuda@gmail.com [shell-script]
2017-03-19 02:39:01 UTC
Permalink
Não há posição definida para o home!
Estou migrando os usuários e grupos de um servidor para outro e preciso
recriar eles no destino!
Basicamente este arquivo origem é gerado a partir da saida do comando (id
usuario) e grep usuario /etc/passwd (para pegar o home e o shell dele)

Eu nunca montei algo usando esta logica que esta usando! Estou apredendo
bastante.
Post by Robson Alexandre ***@gmail.com [shell-script]
Michael
acho que vc deveria montar seu algoritmo da seguinte forma
1- Parsear seu arquivo de entrada
2- Separar os grupos para serem criados primeiramente
3- Adicionar os usuários em seus respectivos grupos com seus respectivos
parâmetros
#!/bin/bash
grupos=( )
usuarios=( )
while IFS='_' read user uid gid groups1 groups2 home shell resto; do
groups1=${groups1#groups=}
groups2=${groups2#groups=}
grupos+=( ${gid#gid=} ${groups1//,/ } ${groups2//,/ } )
groups=$(grep -Eo "[a-zA-Z]+" <<< "$groups1 $groups2")
usuarios+=( "$user:$gid:$uid:$groups:$shell" )
done < arquivo_de_entrada
grupo=( $(sed -r 's/(.*)\((.*)\)/\1 \2/' <<< "$grupo") )
echo groupadd -g ${grupo[0]} ${grupo[1]}
groupadd -g ${grupo[0]} ${grupo[1]}
done
#useradd -g sapsys -u 32123 -G oper,sapinst -m -s /usr/bin/ksh
params=( ${usuario//:/ } )
echo useradd -g ${params[1]} -u ${params[2]} -G ${params[3]} -m -s
${params[4]} ${params[0]}
done
#EOF
Notei que os campos groups se repetem a cada linha. Isso acontece em todas
as linhas?
Sobre o que vc falou sobre os campos de home estarem em posições
diferentes, qual seria o padrão destas posições?
Atenciosamente
Robson Alexandre
Post by Michael Costa ***@gmail.com [shell-script]
Pessoal, bom dia!
maestro_932_gid=931(grpmstr)_groups=1(staff)_groups=1(
staff)_/maestro_/bin/bash
sapadm_32123_gid=204(sapsys)_groups=206(oper),208(sapinst)_
groups=206(oper),208(sapinst)_/home/sapadm_/usr/bin/ksh
oracle_31201_gid=205(dba)_groups=206(oper),208(sapinst)_
groups=206(oper),208(sapinst)_/oracle/SID_/bin/false
usuario_206_gid=204(sapsys)_groups=208(sapinst)_groups=
208(sapinst)_/home/usuario_/bin/bash
O que estou tentando fazer, é usar este arquivo como origem e gerar os
comandos de criação de usuário e grupo baseado nele.
O campo do ((HOME) é variável, as vezes está na sexta posição e em outras
vezes varia.
Os grupos se repetem, preciso de uma forma de validar se o comando do
grupo já foi processado e não repetir (pensei em jogar todos os comandos
para um arquivo e depois dar um uniq nele)
Preciso validar se o grupo ou o usuário já existem no servidor.
groupadd -g 931 grpmstr
groupadd -g 1 staff
useradd -g grpmstr -u 932 -G staff -m -s /bin/bash maestro
groupadd -g 204 sapsys
groupadd -g 206 oper
Grupo sapinst já existe no sistema com ID 208
useradd -g sapsys -u 32123 -G oper,sapinst -m -s /usr/bin/ksh
groupadd -g 205 dba
Grupo oper já existe no ambiente com ID 206
Usuario oracle já existe no ambiente. (saida do comando id oracle)
E por ai vai.
Entenderam ?
Agradeço!
--
Atenciosamente
Robson Alexandre
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2017-03-17 21:36:15 UTC
Permalink
Fala Michael,

Comecei a fazer, mas tenho de sair. Pensei em fazer o seguinte:

sed -r 's/.*_gid=([0-9]+)\(([^)]+)\)_.*/groupadd -g \1 \2;/' <<<
'maestro_932_gid=931(grpmstr)_groups=1(staff)_groups=1(staff)_/maestro_/bin/bash'

Onde eu iria separar o que interessa, montando grupos (usando parênteses)
pelo sed e na saída geraria os diversos comandos usando esses valores
capturados e executaria com um eval.

Desse jeito vc só teria um sed bem grande e depois fazer um eval para
executar toda a linha gerada. Nesse sed aí de cima, só tive tempo de pegar
o trecho necessario para montar o 1⁰ cmd na saída. Vê se vc consegue o
resto.


Abcs,
Julio

*​Damos treinamento em sua empresa por *
*um preço, no mínimo, 50% mais barato que qualquer curso,*
*com certificado e nota fiscal.*

​​
Nosso time de instrutores *in company* é formado somente por
​
​
autores
​ ​
​
de
*Best Sellers​ ​*​laureados ​sobre os temas. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
Post by Michael Costa ***@gmail.com [shell-script]
Pessoal, bom dia!
maestro_932_gid=931(grpmstr)_groups=1(staff)_groups=1(
staff)_/maestro_/bin/bash
sapadm_32123_gid=204(sapsys)_groups=206(oper),208(sapinst)_
groups=206(oper),208(sapinst)_/home/sapadm_/usr/bin/ksh
oracle_31201_gid=205(dba)_groups=206(oper),208(sapinst)_
groups=206(oper),208(sapinst)_/oracle/SID_/bin/false
usuario_206_gid=204(sapsys)_groups=208(sapinst)_groups=
208(sapinst)_/home/usuario_/bin/bash
O que estou tentando fazer, é usar este arquivo como origem e gerar os
comandos de criação de usuário e grupo baseado nele.
O campo do ((HOME) é variável, as vezes está na sexta posição e em outras
vezes varia.
Os grupos se repetem, preciso de uma forma de validar se o comando do
grupo já foi processado e não repetir (pensei em jogar todos os comandos
para um arquivo e depois dar um uniq nele)
Preciso validar se o grupo ou o usuário já existem no servidor.
groupadd -g 931 grpmstr
groupadd -g 1 staff
useradd -g grpmstr -u 932 -G staff -m -s /bin/bash maestro
groupadd -g 204 sapsys
groupadd -g 206 oper
Grupo sapinst já existe no sistema com ID 208
useradd -g sapsys -u 32123 -G oper,sapinst -m -s /usr/bin/ksh
groupadd -g 205 dba
Grupo oper já existe no ambiente com ID 206
Usuario oracle já existe no ambiente. (saida do comando id oracle)
E por ai vai.
Entenderam ?
Agradeço!
Michael Costa linuxajuda@gmail.com [shell-script]
2017-03-19 02:35:32 UTC
Permalink
Vocês são demais, estava me matando aqui para criar aquele arquivo de
origem e depois fiquei filtrando, mas me perdia na hora de separar os
grupos.
Estou acompanhando a lógica de vocês e percebendo que eu ainda tenho muito
para aprender!

Muito obrigado pela orientação! Vocês são demais!
Post by 'Julio C. Neves' ***@gmail.com [shell-script]
Fala Michael,
sed -r 's/.*_gid=([0-9]+)\(([^)]+)\)_.*/groupadd -g \1 \2;/' <<<
'maestro_932_gid=931(grpmstr)_groups=1(staff)_groups=1(
staff)_/maestro_/bin/bash'
Onde eu iria separar o que interessa, montando grupos (usando parênteses)
pelo sed e na saída geraria os diversos comandos usando esses valores
capturados e executaria com um eval.
Desse jeito vc só teria um sed bem grande e depois fazer um eval para
executar toda a linha gerada. Nesse sed aí de cima, só tive tempo de pegar
o trecho necessario para montar o 1⁰ cmd na saída. Vê se vc consegue o
resto.
Abcs,
Julio
*​Damos treinamento em sua empresa por *
*um preço, no mínimo, 50% mais barato que qualquer curso,*
*com certificado e nota fiscal.*
​​
Nosso time de instrutores *in company* é formado somente por
​
​
autores
​ ​
​
de
Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
Post by Michael Costa ***@gmail.com [shell-script]
Pessoal, bom dia!
maestro_932_gid=931(grpmstr)_groups=1(staff)_groups=1(staff)
_/maestro_/bin/bash
sapadm_32123_gid=204(sapsys)_groups=206(oper),208(sapinst)_g
roups=206(oper),208(sapinst)_/home/sapadm_/usr/bin/ksh
oracle_31201_gid=205(dba)_groups=206(oper),208(sapinst)_grou
ps=206(oper),208(sapinst)_/oracle/SID_/bin/false
usuario_206_gid=204(sapsys)_groups=208(sapinst)_groups=208(
sapinst)_/home/usuario_/bin/bash
O que estou tentando fazer, é usar este arquivo como origem e gerar os
comandos de criação de usuário e grupo baseado nele.
O campo do ((HOME) é variável, as vezes está na sexta posição e em outras
vezes varia.
Os grupos se repetem, preciso de uma forma de validar se o comando do
grupo já foi processado e não repetir (pensei em jogar todos os comandos
para um arquivo e depois dar um uniq nele)
Preciso validar se o grupo ou o usuário já existem no servidor.
groupadd -g 931 grpmstr
groupadd -g 1 staff
useradd -g grpmstr -u 932 -G staff -m -s /bin/bash maestro
groupadd -g 204 sapsys
groupadd -g 206 oper
Grupo sapinst já existe no sistema com ID 208
useradd -g sapsys -u 32123 -G oper,sapinst -m -s /usr/bin/ksh
groupadd -g 205 dba
Grupo oper já existe no ambiente com ID 206
Usuario oracle já existe no ambiente. (saida do comando id oracle)
E por ai vai.
Entenderam ?
Agradeço!
itamarnet@yahoo.com.br [shell-script]
2017-03-20 11:58:39 UTC
Permalink
Caro Michael

Eu usaria outra tática usando diretamente o arquivo "/etc/passwd" e "/etc/group".
Mas baseando no arquivo que mostrou eu montaria essa sintaxe


awk -F _ '{
print "groupadd -f -g", $4;
print "useradd -g", $3, "-u", $2, "-G", $4, "-m -s", $(NF), $1}' arquivo_users.txt |
sed '
/^g/ {s/gid[^(]*(//;s/groups=//;s/(/ /g;s/)//g;s/,/\ngroupadd -f -g /g;};
/^u/ {s/gid[^(]*(//;s/groups=//;s/[0-9]\+(//g;s/)//g;}'



No caso o groupadd usa a opção '-f' que não interrompe o processo, mas que não cria o grupo se ele já existir


Talvez ajude


[]'s
Itamar

Continue reading on narkive:
Loading...