Как мне написать скрипт оболочки 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
Но это только показывает первую часть. Как мне показать остальное?
Если с "" именем пользователя Вы имели в виду имя пользователя пользователя, запускающего скрипт:
#!/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
Другой удар путь:
#! /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
Затем, это - просто вопрос печати корректных полей.
/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 }' )
Вот 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(':')
войдет в список полей (разделенный :
) из строки
Затем мы распечатываем желаемые индексируемые значения из списка наряду с соответствующей строкой.