Аналог "C:\Users\Public" (%Public%) в десктопном Linux
Мне понадобилось вытаскивать файлы .desktop на рабочий стол, чтобы пользователи не искали их в Start Menu.
Отсюда вопрос, eсть ли какая-то папка (желательно в стандарте freedesktop), как в Windows из заголовка вопроса?
Всем, кто захочет советовать /etc/skel, хочу напомнить, что это - только для НОВЫХ профилей.
Я умею в for i in $var ; do ; done, но не хочу.
Ответы (1 шт):
Т.к. стандарта нет или мы его не нашли, то сделал костыль (имхо, достаточно элегантный, но костыль).
Ставим пакет symlinks для чистки битых симлинков.
Создаём нужные папки каталоги:
tree /home/public/
/home/public/
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
├── Public
├── Templates
└── Videos
Разрешаем всем read only:
chmod -R 755 /home/public/
Создаём .desktop файл для автозагрузки:
/etc/xdg/autostart/create-symlinks-to-desktop-from-public-directory.desktop
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Create symlinks 4 any files in %Public% 4 current user
Comment=https://ru.stackoverflow.com/q/1438407/191416
Exec=/usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh
RunHook=0
StartupNotify=false
Terminal=false
Hidden=false
и скрипт:
/usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh
#!/usr/bin/env bash
# Получаем переменные XDG_*
source "$HOME/.config/user-dirs.dirs"
# Создаём симлинки из всего, что находится в "%Public%/Desktop" для рабочего стола конкретного пользователя.
ln -s /home/public/Desktop/* "$XDG_DESKTOP_DIR"/
# Переходим в папку рабочего стола.
cd "$XDG_DESKTOP_DIR"
# Чистим битые симлинки, если из "%Public%/Desktop" было что-то удалено - у пользователя оно тоже почистится.
symlinks -d ./
В итоге - всё, что будет кидаться (rsync\curl\ssh\ansible\mount.nfs\руками) в /home/public/Desktop - при логоне пользователя будет копироваться в виде ярлыка на его рабочий стол. При удалении из /home/public/Desktop - симлинк у пользователя будет становиться битым и удаляться.
Всё тоже самое, но через ansible:
---
# WORK
- name: Config directory %Public%
hosts: all
strategy: free
serial:
- "100%"
vars:
paths_to_public_directory:
root: /home/public
user_dirs:
desktop: Desktop
downloads: Downloads
templates: Templates
public: Public
documents: Documents
music: Music
pictures: Pictures
videos: Videos
tasks:
# https://ru.stackoverflow.com/q/1438407/191416
# /etc/xdg/user-dirs.defaults
- name: Config %Public% 4 Linux
when: ansible_system == 'Linux'
become: yes
block:
- user:
name: public
system: yes
state: present
create_home: yes
home: "{{ paths_to_public_directory.root }}"
comment: "ru.stackoverflow.com/q/1438407/191416"
expires: -1
- acl:
path: "{{ paths_to_public_directory.root }}"
etype: other
permissions: rx
default: yes
recursive: yes
state: present
- file:
path: "{{ paths_to_public_directory.root }}"
state: directory
mode: '755'
- file:
path: "{{ paths_to_public_directory.root }}/{{ item.value }}"
state: directory
mode: '755'
with_dict: "{{ paths_to_public_directory.user_dirs }}"
- name: Create symlinks 4 any files in %Public% 4 current user
when:
- ansible_system == 'Linux'
become: yes
block:
- copy:
dest: /etc/xdg/autostart/create-symlinks-to-desktop-from-public-directory.desktop
content: |
[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Create symlinks 4 any files in %Public% 4 current user
Comment=https://ru.stackoverflow.com/q/1438407/191416
Exec=/usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh
RunHook=0
StartupNotify=false
Terminal=false
Hidden=false
mode: '644'
- copy:
dest: /usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh
content: |
#!/usr/bin/env bash
# Получаем переменные XDG_*
source "$HOME/.config/user-dirs.dirs"
# Создаём симлинки из всего, что находится в "%Public%/Desktop" для рабочего стола конкретного пользователя.
ln -s {{ paths_to_public_directory.root }}/Desktop/* "$XDG_DESKTOP_DIR"/
# Переходим в папку рабочего стола.
cd "$XDG_DESKTOP_DIR"
# Чистим битые симлинки, если из "%Public%/Desktop" было что-то удалено - у пользователя оно тоже почистится.
symlinks -d ./
mode: '755'