Bash: скопировать файл во все домашние каталоги

Мне нужно скопировать (перезаписать, если он уже существует) файл во все домашние каталоги пользователей, входящих в одну и ту же группу («студенты»).

Я нашел сценарий, который попытался адаптировать к моему контексту (у меня есть пользователи LDAP вместо /etc/passwd, поэтому я использовал getent passwd для получения имен пользователей).

Вот это скрипт (cp2stud.sh):

#!/bin/bash

# subdirectory of /home/uid
DIR=".eclipse/org.eclipse.platform_3.8_155965261/configuration"

# the file to copy
FILE="/home/admin/tmp/config.ini"

# location of home dirs
UHOME="/home" 

# GID of "students" group
USERS_GID=10004

# get list of users having same GID
_USERS="$(getent passwd | awk -F ':' '{if ( $4 == $USERS_GID ) print $1 }')"

for u in $_USERS
do
   _dir="${UHOME}/${u}/${DIR}"
   if [ -d "$_dir" ]
   then
     yes | /bin/cp -v "$FILE" "$_dir"
     chown $(id -un $u):students "$_dir/${FILE}"
   fi
done

Когда я пытаюсь запустить его:

$ sudo cp2stud.sh

Я ничего не получаю.

Где я ошибаюсь?

заранее спасибо


person user2452426    schedule 11.08.2014    source источник
comment
Что произойдет, если вы сделаете sudo bash -x cp2stud.sh ? -x отслеживает каждую команду до стандартного вывода.   -  person Jordan Samuels    schedule 12.08.2014
comment
Правильно ли вы используете переменную $USERS_GID с awk?   -  person Cyrus    schedule 12.08.2014
comment
sudo bash -x cp2stud.sh + DIR= + FILE=/skole/tjener/home0/frank/config.ini + UHOME=/skole/tjener/home0 + STUD_GID=10004 ++ awk -F : '{if ( $4 = = $STUD_GID ) print $1 }' ++ getent passwd + _USERS=   -  person user2452426    schedule 12.08.2014
comment
Вам дали 3 ответа на этот вопрос. Какие-то из них приемлемы? Если нет, то не могли бы вы указать, почему?   -  person lurker    schedule 28.08.2014


Ответы (2)


Попробуйте этот подход:

...
export USERS_GID=10004

_USERS=$(getent passwd | awk -F ':' '{if ( $4 == ENVIRON["USERS_GID"] ) print $1 }')
...

Вы также можете сделать что-то вроде этого:

...

USERS_GID=10004

_USERS=$(getent passwd | awk -F ':' -v gid=$USERS_GID '{if ( $4 == gid ) print $1 }')
...

Или просто:

...

_USERS=$(getent passwd | awk -F ':' -v gid=10004 '{if ( $4 == gid ) print $1 }')
...
person lurker    schedule 11.08.2014

Работает следующий код:

DIR=".eclipse/org.eclipse.platform_3.8_155965261/configuration"
FILE="/home/admin/tmp/config.ini"

UHOME="/home"
USERS_GID=10004
GRP_NAME=students
FILENAME=$(basename $FILE)


_USERS="$(getent passwd | awk -v X="$USERS_GID" -F ':' '{if ( $4 == X ) print $1 }')"

for u in $_USERS
do
  _dir="${UHOME}/${u}/${DIR}"
  if [ -d "$_dir" ]
  then
      yes | /bin/cp -v "$FILE" "$_dir"
      chown -v $(id -un $u):$GRP_NAME "${UHOME}/${u}/${DIR}${FILENAME}"
  fi
done
person user2452426    schedule 12.08.2014