В сценарии bash, выполняемом при загрузке, как мне получить имя пользователя, только что вошедшего в систему?

Мне нужно выполнить сценарий bash при загрузке.
Для этого я создал файл

/etc/init.d/blah

Я отредактировал его и добавил следующие строки

#! /bin/sh
# /etc/init.d/blah

touch '/var/lock/blah'
username1=$(id -n -u)
username2=$(whoami)
touch '/var/lock/1'${username1}
touch '/var/lock/2'${username2}

exit 0

Скрипт выполняется с привилегиями root (это то, что мне нужно, потому что я должен использовать mount внутри этого скрипта) ... но проблема в том, что мне также нужно знать имя пользователя пользователя, который только что вошел в систему, потому что моя цель - смонтировать определенную папку в определенную точку монтирования в зависимости от имени пользователя, например

mount -o bind /home/USERNAME/mount-point /media/data/home/USERNAME/to-be-mounted

Возвращаясь к сценарию загрузки, если я это сделаю

sudo update-rc.d blah defaults

а затем перезагрузитесь и войдите в систему с моим именем пользователя (скажем, john) оба способа получить username в моем сценарии производят root на самом деле у меня есть 3 файла

/var/lock/blah
/var/lock/1root
/var/lock/2root

Итак, как я могу получить имя пользователя, который только что вошел в систему? (john в моем примере)

ОТРЕДАКТИРОВАНО:
Я решил следующим образом:

1. Я создал файл .desktop для каждого пользователя, которого мне нужно выполнить автомонтирование при загрузке, чтобы автоматически запускать скрипт при загрузке (у меня LXDE) и поместить его в /home/{username}/.config/autostart

[Desktop Entry] 
Type=Application
Exec=bash "/path/to/mount-bind.sh"


2. Я сохранил по этому пути скрипт bash с именем mount-bind.sh и сделал его исполняемым:

#!/bin/bash

_username=$1

if [[ -z "${_username}" ]]; then
    _username="$(id -u -n)"
fi

mkdir -p "/home/${_username}/mount-folder"
sudo mount -o bind "/media/data/home/${_username}/mount-folder" "/home/${_username}/mount-folder"

exit 0


3. Я добавил следующую строку в /etc/sudoers

%nopwd ALL=(ALL) NOPASSWD: /bin/mount


4. Я создал группу nopwd и добавил в нее всех нужных мне пользователей

По его способу после входа в систему я могу смонтировать путь под пользователем home.

Проблема с этим методом заключается в том, что мне приходится создавать файл рабочего стола для каждого нового пользователя и добавлять его/ее в nopwd, но это работает.

Приветствуются любые дальнейшие улучшения! :)


person Luca Borrione    schedule 26.01.2012    source источник


Ответы (3)


Я думаю, вам следует перейти от сценария инициализации во время загрузки к сценарию, выполняемому во время входа в систему под вошедшим в систему пользователем. Чтобы разрешить это, вы должны изучить способы, позволяющие вашим пользователям выполнять нужную вам команду монтирования. В зависимости от того, чего вы пытаетесь достичь, вам может помочь один из следующих методов:

  • Предполагая, что вы используете Linux или какой-либо другой UNIX с аналогичной функцией, добавьте точку монтирования в /etc/fstab с параметром user, что позволит обычным пользователям монтировать запись.
  • Выполните шаги с mount по sudo с достаточно узкой конфигурацией sudoers, чтобы пользователи не могли выполнять какие-либо команды монтирования.
  • Напишите на c программу suid-root, которая при вызове выполняет необходимые команды монтирования. Однако это очень сложно сделать правильно, не создавая зияющих дыр в безопасности.
person Daniel Roethlisberger    schedule 23.03.2012

Логин не происходит во время загрузки. Вы не можете предсказать, какой пользователь войдет в систему при загрузке.

person choroba    schedule 26.01.2012
comment
Спасибо за ваше объяснение. Как вы думаете, есть ли у меня способ достичь своей цели? (чтобы смонтировать определенную папку в определенную точку монтирования при загрузке в зависимости от имени пользователя) - person Luca Borrione; 26.01.2012
comment
@LucaBorrione: Определенно не во время загрузки. Однако это может быть возможно во время входа в систему. - person choroba; 26.01.2012

Попробуйте экспортировать данные для входа и используйте их.

экспортировать имя пользователя2=$(whoami)

person viggy    schedule 26.01.2012
comment
-1 Во время загрузки единственным пользователем является root. В любом случае, экспорт влияет только на видимость для дочерних элементов текущего процесса. И, наконец, вы не можете использовать синтаксис Bash в скрипте sh. - person tripleee; 23.03.2012