如何编写一个 bash shell 脚本来请求用户的姓名、验证其是否存在,如果存在则显示以下信息:
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
以下是获取 gid、uid、shell 和目录的一种方法:
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 }' )
答案2
这是一个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(':')
则将列出:
该行的字段(以 分隔)然后我们从列表中打印出所需的索引值以及适当的字符串。
答案3
如果“用户”的名字指的是运行脚本的用户的用户名:
#!/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
答案4
另一种 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
只需一步,
- 运行命令并获取其输出 -
$(getent passwd $user)
- 分割输出
:
,将结果保存为数组IFS=: details=(...)
- 并使用命令的退出状态进行测试
if
然后只需打印正确的字段即可。