bash shell 脚本

bash shell 脚本

如何编写一个 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

然后只需打印正确的字段即可。

相关内容