Почему в переменную попадает значение до первого пробела?
У меня на машине около 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