LINUX.ORG.RU
ФорумAdmin

как защитить symlink от удаления?

 


0

1

Вопрос в сабже, кому интересно можете ниже почитать, зачем мне это надо. Изначальная задача состоит в том, чтобы отдать разным пользователям разные принтеры. При этом в силу специфических причин cups не используется как отдельный принтсервер. Cups стоит на каждой пользовательской машине. Пользовательская машина при этом и не машина вовсе, а PXE readonly клиент.

В общем, юзер запускает PXE и на выходе должен ВИДЕТЬ только свои принтеры.

Средствами CUPS это сделать нереально. Реально разграничить доступ, но сделать принтера невидимыми нельзя. Поэтому при логине я подсовываю капсу конфиг в зависимости от группы пользователя.

Поскольку PXE в режиме RO, то я не могу запихивать конфиг прямо к /etc/cups (хотя можно сделать ее tmpfs).

В папке /etc/cups лежит симлинк от файла printers.conf, он указывает printers.conf пользователя.

Все работает , пока не загрузишь систему в режиме RW. Cups использует /etc/cups как свой личный cache и запросто меняет там сам все что ему вздумается. Поэтому он набрасывается на несчастный симлинк, удаляет его и прописывает там свой файл.

Если не найду решения , то буду маунтить /etc/cups как tmpfs и копировать ее содержимое при логине пользователя.

chattr +i и chmod не работают с симлинками

★★★★

Последнее исправление: constin (всего исправлений: 1)

Попробуй такой костыль:

chattr +i /path/to/user/printers.conf
mount -o bind /path/to/user/printers.conf /etc/cups/printers.conf

Deleted
()
Последнее исправление: MyLittleLoli (всего исправлений: 1)
Ответ на: комментарий от Deleted

Да, спасибо! отличный костыль

правда chattr +i не пашет на tmpfs, но это и не нужно, так как если cups видит, что printers.conf существует, то он его не трогает.

вот такой у меня скриптик, пришлось дать юзерам sudo на mount и /etc/init.d/cups restart



$ cat /etc/profile.d/cups.sh 


if  [ $USER != "root" ]; then
  #getting user cups group
  cups_groups=(`groups | grep -oh "cups_\w*"| sed 's/\@//g'`)

  #choose last group if many.
  for x in ${cups_groups[@]}; do cups_profile=$x; done


  #check if config/group exist, place all printers if not exist
  [ -f  /mnt/_software/cups/$cups_profile/printers.conf ] || cups_profile=cups_all

  #copy config to /tmp, cups will use it from /tmp 
  cp /mnt/_software/cups/$cups_profile/printers.conf  /tmp/
  chmod 444 /tmp/printers.conf
  sudo mount -o bind /tmp/printers.conf /etc/cups/printers.conf

  #restart cups with config
  sudo /etc/init.d/cups restart

fi
constin ★★★★
() автор топика
Последнее исправление: constin (всего исправлений: 2)
Ответ на: комментарий от constin

В результате я решил подсовывать не только конфиг, но и папку /etc/cups целиком.

Может быть мой скрипт кому-нибудь пригодится.

Скрипт лежит в /etc/profile.d/

Требования: linux клиент интегрирован в ldap, те видит по getent ldap группы. В ldap пользователь имеет группу вида cups_XXXXX. Так же на шаре имеется папка темплейт с тем же названием, которую мы будем биндит. Скрипт имеет защиту от того, что польльователь по ошибке состоит в несколких группах cups или же не имеет вообще никакой. В первом случае ему выдаста одна их групп, во-втором случае он получит группу со всеми принтерами. Пользователь должен иметь sudo права без пароля на mount * и /etc/init.d/cups *



#/etc/profile.d/cups_template.sh
 
#avoid root
[ $USER == "root" ] &&  return 0

_CUPS () {

    #getting user cups group
    cups_groups=(`groups | grep -oh "cups_\w*"| sed 's/\@//g'`) 

    #choose last group if many. 
    for x in ${cups_groups[@]}; do cups_profile=$x; done 

    #check if template exist, place all printers if not exist
    [ -d  /mnt/_software/cups_groups/$cups_profile ] || cups_profile=cups_all 

    #mount cups template
    sudo mount -o bind /mnt/_software/cups_groups/$cups_profile/ /etc/cups/ 

    #restart cups
    sudo /etc/init.d/cups restart
}
_CUPS
constin ★★★★
() автор топика
Последнее исправление: constin (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.