script de shell bash

1

Como escrevo um script de shell bash que solicita o nome do usuário, verifique se ele existe e, se houver, mostre as seguintes informações:

Username: xxxx
User ID: xxxx
Group ID: xxxx
Shell: / bin / xxx
Directory: / home / xxx

Eu tenho isso até agora:

#!/bin/bash

echo "Ingrese el nombre del usuario"
read nombreUsuario
id $nombreUsuario

RESULTADO="$?"

if [ $RESULTADO = "0" ];then
    id $nombreUsuario | tee salida.txt
    echo "id del usuario:"
    cut -f 1-1 -d" "--output-delimiter="; " salida.txt
    #asignar la salida de cut a una variable
    UID=$(cut -f 1-1 -d" " --output-delimiter="; " salida.txt)
    clear
    echo "ID del Usuario: $UID"

    #quitar el texto UID
    UIDUNICO=$(echo UID | cut -d= -f2)
    echo "ID del Usuario: $UIDUNICO"
fi

Mas isso só mostra a primeira parte. Como mostro o resto?

    
por alex 12.05.2015 / 02:19

4 respostas

1

Aqui está uma maneira de obter o gid, o uid, o shell e o diretório:

printf "Enter username: "
read user

groupid=$( id -g $user )
userid=$( id -u $user ) 
usershell=$( grep $user /etc/passwd | awk -F':' '{ print  }' ) 
userdirectory=$( grep $user /etc/passwd | awk -F':' '{ print  }' ) 
    
por krt 12.05.2015 / 15:54
0

Aqui está uma solução python :

#!/usr/bin/env python2
import sys
with open('/etc/passwd') as f:
    for line in f:
        if line.startswith(sys.argv[1] + ':'):
            parts = line.rstrip().split(':')
            print 'Username: ' + parts[0] + '\n' + 'User ID: ' + parts[2].rstrip()
            print 'Group ID: ' + parts[3] + '\n' + 'Shell: ' + parts[6].rstrip()
            print 'Directory: ' + parts[5].rstrip()

Você pode colocar todas as instruções print em uma única linha, para melhor visualização, eu a coloquei em várias linhas. Guarde isto como um ficheiro, por ex. %código%. Execute o script fornecendo o nome de usuário como o primeiro argumento para o script. Por exemplo:

python username.py foobar

onde username.py é o nome de usuário.

Se encontrado, a saída será como:

Username: foobar
User ID: 1000
Group ID: 1000
Shell: /bin/bash
Directory: /home/foobar
  • foobar lerá cada linha do arquivo line.startswith(sys.argv[1] + ':') para verificar se começa com o nome de usuário fornecido. O /etc/passwd garantirá que não selecionamos, e. : enquanto nosso nome de usuário de entrada é foobarspam

  • Se sim, então foobar fará uma lista de campos (separados por line.split(':') ) da linha

  • Em seguida, imprimimos os valores indexados desejados da lista junto com a string apropriada.

por heemayl 12.05.2015 / 16:32
0

Se, com o nome "do usuário", você quis dizer o nome de usuário do usuário que está executando o script:

#!/bin/bash

read -p "Username: " username
if [ "${username}" == "${USER}" ]
then
    user_data="$(< /etc/passwd sudo grep "^${username}:")"
    echo "Username: ${username}"
    echo "User ID: $(<<<"${user_data}" cut -d: -f3)"
    echo "Group ID: $(<<<"${user_data}" cut -d: -f4)"
    echo "Shell: $(<<<"${user_data}"  cut -d: -f7)"
    echo "Directory: $(<<<"${user_data}" cut -d: -f6)"
fi

Se com o nome "do usuário" você quis dizer qualquer nome de usuário:

#!/bin/bash

read -p "Username: " username
if [ $(< /etc/passwd grep "^$username:") ]
then
    user_data="$(< /etc/passwd sudo grep "^${username}:")"
    echo "Username: ${username}"
    echo "User ID: $(<<<"${user_data}" cut -d: -f3)"
    echo "Group ID: $(<<<"${user_data}" cut -d: -f4)"
    echo "Shell: $(<<<"${user_data}"  cut -d: -f7)"
    echo "Directory: $(<<<"${user_data}" cut -d: -f6)"
fi    
    
por kos 12.05.2015 / 19:13
0

Outra maneira bash:

#! /bin/bash
read -p "Username: " user

if IFS=: details=($(getent passwd $user))
then 
    printf "Username: %s\nUser ID: %d\nGroup ID: %d\nShell: %s\nDirectory: %s\n" "${details[0]}" "${details[2]}" "${details[3]}" "${details[6]}" "${details[5]}"
fi

Pode-se, num único passo

  • executa um comando, obtendo sua saída - $(getent passwd $user)
  • divida a saída em : , salve o resultado como uma matriz IFS=: details=(...)
  • e use o status de saída do comando para teste em if

Então é só uma questão de imprimir os campos corretos.

    
por muru 13.05.2015 / 01:34