estou tentando usar useradd
. Encontrei um exemplo de algo que gostaria de tentar incorporar, embora não consiga entender partes específicas.
Segue o exemplo na íntegra:
if [ $(id -u) -eq 0 ]; then
read -p "Enter username : " username
read -s -p "Enter password : " password
egrep "^$username" /etc/passwd >/dev/null
if [ $? -eq 0 ]; then
echo "$username exists!"
exit 1
Eu entendo o básico do que está acontecendo, mas especificamente:
[ $(id -u) -eq 0 ];
e
[ $? -eq 0 ];
Eu estou supondo que uma variável está sendo feita dentro dos colchetes. Mas fiquei perplexo decifrando seu propósito ou significado.
Do homem:
id -u
imprimirá o ID do usuário. O script é restrito ao usuário root cujo UID é 0.$?
status de saída do comando executado anteriormente.O
id
utilitário, quando usado com sua-u
opção, produzirá o UID do usuário atual. Se esse UID for zero, o usuário será o usuário root. Apenas o usuário root deve adicionar novos usuários.Portanto, o script testa o UID do usuário que executa o script contra zero e só executa as ações privilegiadas (não mostradas no script da pergunta) se o usuário for root.
Uma maneira indiscutivelmente melhor de lidar com isso no script, se todo o script exigir root, é verificar se o UID é diferente de zero no início e sair com um erro se for:
Quanto ao
$?
, é uma variável shell especial que sempre contém o status de saída do comando executado mais recentemente. É muito raro precisar usar isso diretamente, poisif
é mais do que capaz de trabalhar diretamente comgrep
:Aqui,
if
usará o status de saída degrep
. Usamosgrep
with-q
para impedi-lo de produzir qualquer saída e de analisar o arquivo inteiro após qualquer primeira correspondência. Ele apenas retorna um status de saída queif
será usado. Também não precisamosegrep
, pois a expressão regular não é uma expressão regular estendida (egrep
é idêntica agrep -E
).Observe também que as mensagens de diagnóstico devem ser gravadas no fluxo de erro padrão. Você pode fazer isso redirecionando suas mensagens com
>&2
. Além disso,printf
é preferívelecho
na saída de dados variáveis .Se você estiver em um sistema onde um serviço de diretório como NIS ou LDAP é usado, grepping para um usuário existente
/etc/passwd
pode não ser útil, pois os usuários reais podem estar armazenados em um banco de dados separado.Em tais sistemas, pode ser melhor usar
getent passwd "$username"
(isso também funcionaria em sistemas não NIS/LDAP). Isso retornaria a entrada do banco de dados de senhas para o usuário específico ou sairia com um status de saída diferente de zero, o que significa que poderíamos usar isso em nosso teste:Apenas observe que
useradd
não é possível adicionar usuários a um banco de dados NIS ou LDAP...Embora, estritamente falando, nada do acima deve ser realmente necessário, pois
useradd
não deve fazer nada de útil se o usuário atual não for root ou se o usuário que está sendo adicionado já existir.