Почему в переменную попадает значение до первого пробела?

У меня на машине около 40 локальных пользователей и есть потребность сброса пароля у них раз в определенный промежуток времени. Решил автоматизировать это дело на bash.

На текущий момент имею код

#!/usr/bin/env bash

_RED_COLOR="\e[1;31m"
_GREEN_COLOR="\e[1;32m"
_YELLOW_COLOR="\e[1;33m"
_COLOR_RESET="\e[0m"

if [[ $EUID != 0 ]]; then
    echo -e "${_RED_COLOR}!!! Данный скрипт должен быть запущен от имени root !!!${_COLOR_RESET}"
    exit 1
fi

function report_step {
    echo -e "${_YELLOW_COLOR}[STEP] $1...${_COLOR_RESET}"
}

function report_success {
    echo -e "  ${_GREEN_COLOR}[SUCCESS] $1.${_COLOR_RESET}"
}

function report_fail {
    echo -e "  ${_RED_COLOR}[FAIL] $1!${_COLOR_RESET}"
}

local_users=$(awk -F: '($3 >= 1000 && $3 != 65534) {printf "%s:%s\n",$1,$5}' /etc/passwd)

for user in $local_users; do
    user_login=$(echo $user | awk -F: '{print $1}')
    user_gecos=$(echo $user | awk -F: '{print $2}')
    report_step "Изменение пароля пользователя $user_gecos"
    passwd $user_login
done

И не могу понять почему в переменную user_gecos попадает значение до первого пробела. Например, если GECOS = "Администратор безопасности", то у меня выводится "Администратор..."


Ответы (1 шт):

Автор решения: Алексей Сундеев

вы используете awk -F: '{print $2}', это извлекает всё, что идет после первого двоеточия (то есть имя пользователя, GECOS и другие данные), а потом по пробелу происходит разделение на несколько частей, что приводит к извлечению только первой части строки.

надо использовать другую логику извлечения этого поля, например, использовать команду cut или продолжить с awk, но учтя, что GECOS может содержать несколько слов.

код:

#!/usr/bin/env bash

_RED_COLOR="\e[1;31m"
_GREEN_COLOR="\e[1;32m"
_YELLOW_COLOR="\e[1;33m"
_COLOR_RESET="\e[0m"

if [[ $EUID != 0 ]]; then
    echo -e "${_RED_COLOR}!!! Данный скрипт должен быть запущен от имени root !!!${_COLOR_RESET}"
    exit 1
fi

function report_step {
    echo -e "${_YELLOW_COLOR}[STEP] $1...${_COLOR_RESET}"
}

function report_success {
    echo -e "  ${_GREEN_COLOR}[SUCCESS] $1.${_COLOR_RESET}"
}

function report_fail {
    echo -e "  ${_RED_COLOR}[FAIL] $1!${_COLOR_RESET}"
}

local_users=$(awk -F: '($3 >= 1000 && $3 != 65534) {print $1":"$5}' /etc/passwd)

for user in $local_users; do
    user_login=$(echo $user | awk -F: '{print $1}')
    user_gecos=$(echo $user | awk -F: '{print substr($0, index($0,$2))}')
    report_step "Изменение пароля пользователя $user_gecos"
    passwd $user_login
done
→ Ссылка