Tenho tentado escrever um comando (servidor Solaris) que adicione um usuário a um grupo específico. É um comando bem longo, então vou postar o comando inteiro aqui e depois dividi-lo.
USER=myUser && sudo /usr/sbin/usermod -G `awk -v delim="," -F: '/[:,]'$USER'/ { groups = groups $1 delim; } END { groups = groups "myGroup"; print groups}' /etc/group` myUser
O interiorestranhoO comando compila uma lista delimitada por vírgulas dos grupos atuais e o comando externo leva essa lista no parâmetro -G.
Ambosestranhoemod de usuárioestão me dando erros de sintaxe (perto da linha 1, mas há apenas uma linha), mas tenho a sensação de que um erro é causado pelo outro.
Há algum erro de sintaxe gritante aqui que estou perdendo? Isso pode ser causado por um problema de shell? Como isenção de responsabilidade, estou usando a construção && em vez de ponto e vírgula devido a alguns problemas de processamento de texto de nível superior, mas isso não deve afetar a execução, na minha opinião (eu testei).
Responder1
awk
funciona de maneira diferente no Solaris– a versão disponível em /usr/bin
não suporta a -v
opção. Usarnawk
para uma versão mais parecida com POSIX.
O segundo problema é que, como você já percebeu, só existe uma linha. Não tente escrever frases curtas se não for absolutamente necessário; comandos legíveis são mais fáceis de corrigir. Se você precisar colocar o comando em um arquivo de configuração em algum lugar – coloque-o em um .sh
script.
Não use $USER
como variável temporária; muitos programas esperam que esta variável específica contenhaseuNome de acesso. Escolha algo parecido $user
.
Não analise /etc/group
quando houver ferramentas que façam isso por você, como groups
. (Além de simplificar o código, eles também funcionam com contas não locais.)
#!/bin/sh
user=myUser
group=myGroup
oldgroups=$(groups "$user" | sed "y/ /,/")
usermod -G "$oldgroups,$group" "$user"
ou se você insistir
user=myUser && sudo usermod -G "$(groups "$user" | sed "y/ /,/"),myGroup" "$user"