скрипт оболочки bash

Как мне написать скрипт оболочки bash, который запрашивает имя пользователя, проверяет, существует ли он, и, если это так, показывает следующую информацию:

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

У меня пока есть это:

#!/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

Но это только показывает первую часть. Как мне показать остальное?

1
задан 12 May 2015 в 08:43

4 ответа

Если с "" именем пользователя Вы имели в виду имя пользователя пользователя, запускающего скрипт:

#!/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

, Если с "" именем пользователя Вы имели в виду какое-либо имя пользователя:

#!/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    
0
ответ дан 12 May 2015 в 18:43
  • 1
    Спасибо за возвращение. Справедливому крику, да, удалось произвести то Восстановление Начальной загрузки использования (Расширенные настройки), которые дали опцию установить личинку и на sda и на sdb. Посмотрите решение, которое работало на меня в конце ниже. – chris 11 August 2016 в 16:50

Другой удар путь:

#! /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

Каждый может, в одноэтапном

  • выполняет команду, брать ее вывод - $(getent passwd $user)
  • разделило вывод на :, сохраняет результат как массив IFS=: details=(...)
  • и использует статус выхода команды для тестирования в if

Затем, это - просто вопрос печати корректных полей.

0
ответ дан 12 May 2015 в 18:43
  • 1
    Я просто полагал, что ни /etc/bashrc, ни /root/.profile читается, т.е. псевдоним isn' t доступный то, которое я думаю, является ошибкой. Добавление к /etc/profile.d/00-aliases.sh работы.Спасибо. – Karl Richter 11 August 2016 в 15:51

Вот один способ получить ценуроз, uid, оболочку и каталог:

printf "Enter username: "
read user

groupid=$( id -g $user )
userid=$( id -u $user ) 
usershell=$( grep $user /etc/passwd | awk -F':' '{ print $7 }' ) 
userdirectory=$( grep $user /etc/passwd | awk -F':' '{ print $6 }' ) 
0
ответ дан 12 May 2015 в 18:43
  • 1
    большой, довольный Вы получили его, отсортировал @NourAlhadiMahmoud:) – Zanna 13 August 2016 в 07:14

Вот a 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()

Можно поместить весь print операторы в одной строке, для лучшей способности представления я поместил его в несколько строк. Сохраните это как файл, например. username.py. Запустите скрипт, дающий имя пользователя как первый аргумент сценарию. Например:

python username.py foobar

где foobar имя пользователя.

Если найдено вывод будет похож:

Username: foobar
User ID: 1000
Group ID: 1000
Shell: /bin/bash
Directory: /home/foobar
  • line.startswith(sys.argv[1] + ':') считает каждую строку /etc/passwd файл, чтобы проверить, начинается ли это с данного имени пользователя. : гарантирует, чтобы мы не выбирали, например. foobarspam в то время как наше входное имя пользователя foobar

  • Если так, затем line.split(':') войдет в список полей (разделенный :) из строки

  • Затем мы распечатываем желаемые индексируемые значения из списка наряду с соответствующей строкой.

0
ответ дан 12 May 2015 в 18:43
  • 1
    О, я didn' t видят, что Вы отвечаете, как я писал по мобильному телефону..., но 755 не хороший выбор для всех дочерних файлов... OP didn' t делают рекурсивные 777 так или иначе – Zanna 11 August 2016 в 12:41

Другие вопросы по тегам:

Похожие вопросы: