Как мне управлять сменой пользователей в чарме?

Я пишу талисман, в котором мне нужно сменить пользователя для установки некоторых пакетов. Когда я запускаю juju-deploy, все это работает от имени пользователя root. Итак, я пытаюсь сменить пользователя и это невозможно. Если у кого-то есть идеи, как решить эту проблему, agradeceria ... Я пробовал много вещей в скрипте установки, сделанном в bash, но я ничего не достиг.

Я попробую это ... Это часть моего скрипта установки на каталог ловушек:

mkdir -p $dir
useradd -d "$dir" -s "$bash" -g "$group" --create-home  $user
echo "$user:$pass" | chpasswd
cp /etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.profile $dir
su - "$user"

Предполагается, что эта часть должна изменить пользователя и продолжить выполнение скрипта с пользователем создан а не как root. Но этого не происходит

2
задан 25 August 2014 в 17:21

3 ответа

Ваш сценарий установки мог перестать работать по нескольким причинам:

  • Если группа не будет ранее существовать, то команда useradd бросит ошибку:
    useradd: group 'coolgroup' does not exist
    • Решение этой проблемы состоит в том, чтобы сделать группу перед вызовом useradd.
  • Если родительский каталог пользователя домой ($dir в Вашем примере) не будет существовать, то команда useradd повысит ошибку:
    useradd: cannot create directory /non/default/home/dir
    • Решение этого состоит в том, чтобы создать родительский каталог, если это уже не существует.
  • Если корневой каталог уже существует useradd не скопирует скелетные файлы:
    useradd: warning: the home directory already exists. Not copying any file from skel directory into it.
    • Решение этой проблемы состоит в том, чтобы создать родительский каталог (использующий dirname). Это может быть то, почему Ваш исходный сценарий копирует файлы бомжа в пользовательский каталог.

Вы видите эти ошибки в файле журнала амулета для единицы очарования. Это настоятельно рекомендовано для запущения скриптов удара с set -e таким образом, сценарий останавливается в первой ошибке. Мне также нравится использовать set -x показать команды, выполняемые в файле журнала.

Я записал быстрое очарование для проверения этой проблемы:

$ mkdir /tmp/trusty
$ cd /tmp/trusty
$ charm create user -t bash
$ vi user/hooks/install
$ juju deploy --repository=../../ local:trusty/user

Это создает скелетное "пользовательское" очарование, я затем отредактировал пользователя/рычаги/установку со следующим:

#!/bin/bash

set -ex 

dir=/non/default/home/dir
bash=/bin/bash
user=newuser
group=coolgroup
pass="JujuIsMagic!"

# The group must be created before trying to add the user.
groupadd "$group"
#  The parent directory must be created if this directory is not standard. 
mkdir -p `dirname $dir`
useradd -d "$dir" -s "$bash" -g "$group" -m $user
echo "$user:$pass" | chpasswd

su - "$user" --command 'whoami'
su - "$user" --command 'ls -al $dir'

Вывод сценария установки для пользовательского очарования:

$ tail -F /var/log/juju-mbruzek-local/unit-user-0.log
2014-08-25 14:49:47 INFO install + dir=/non/default/home/dir
2014-08-25 14:49:47 INFO install + bash=/bin/bash
2014-08-25 14:49:47 INFO install + user=newuser
2014-08-25 14:49:47 INFO install + group=coolgroup
2014-08-25 14:49:47 INFO install + pass='JujuIsMagic!'
2014-08-25 14:49:47 INFO install + groupadd coolgroup
2014-08-25 14:49:47 INFO install ++ dirname /non/default/home/dir
2014-08-25 14:49:47 INFO install + mkdir -p /non/default/home
2014-08-25 14:49:47 INFO install + useradd -d /non/default/home/dir -s /bin/bash -g coolgroup -m newuser
2014-08-25 14:49:47 INFO install + echo 'newuser:JujuIsMagic!'
2014-08-25 14:49:47 INFO install + chpasswd
2014-08-25 14:49:47 INFO install + su - newuser --command whoami
2014-08-25 14:49:47 INFO install newuser
2014-08-25 14:49:47 INFO install + su - newuser --command 'ls -al $dir'
2014-08-25 14:49:47 INFO install total 20
2014-08-25 14:49:47 INFO install drwxr-xr-x 2 newuser coolgroup 4096 Aug 25 09:49 .
2014-08-25 14:49:47 INFO install drwxr-xr-x 3 root    root      4096 Aug 25 09:49 ..
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup  220 Apr  8 20:03 .bash_logout
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup 3637 Apr  8 20:03 .bashrc
2014-08-25 14:49:47 INFO install -rw-r--r-- 1 newuser coolgroup  675 Apr  8 20:03 .profile

Вы видите, что скелетные файлы копируются с команды useradd. Можно выполнить отдельные команды как другое использование с su или sudo из файлов рычага.

3
ответ дан 25 August 2014 в 17:21

Использование 'su - "$user"' в Вашем сценарии закончит тем, что запустило интерактивную оболочку для указанного пользователя.

Вы могли использовать '-команда' опция к 'su' для определения команды для выполнения. Тогда Вы инкапсулировали бы команды, которые Вы хотите выполненный как тот пользователь в сценарии, который мог быть создан как удар здесь документ.

Ваш сценарий был бы похож на это...

mkdir -p $dir
useradd -d "$dir" -s "$bash" -g "$group" --create-home  $user
echo "$user:$pass" | chpasswd
cp /etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.profile $dir
# Create a temporary file for the user script
TMPFILE=$(mktemp)
chmod u+x ${TMPFILE}
chown ${user}:${group} ${TMPFILE}

## Create a bash here document (http://tldp.org/LDP/abs/html/here-docs.html)
## with a script to execute as the user.
cat > ${TMPFILE} << EOF
#!/bin/bash
## Run `whoami` to prove that this is run by the correct user
whoami | tee ~/whoami.out
EOF 

su - "$user" --comand ${TMPFILE}
0
ответ дан 25 August 2014 в 17:21

Так как Ваш сценарий работает как корень, можно также использовать sudo для изменения на другого пользователя на основе на команду. Это может быть более громоздким, чем предложение rcj, но оно должно работать. Другое возможное преимущество состоит в том, что Вы все еще имеете дело только с одним сценарием, в противоположность два/несколько с другим решением.

mkdir -p $dir
useradd -d "$dir" -s "$bash" -g "$group" --create-home  $user
echo "$user:$pass" | chpasswd
cp /etc/skel/.bash_logout /etc/skel/.bashrc /etc/skel/.profile $dir
# Starting here, preface user's commands with sudo -u user
sudo -u user some-command-run-as-user.sh
echo "some file you need written as user | sudo -u user tee filename.txt
sudo -u user another-command-run-as-user.sh
0
ответ дан 25 August 2014 в 17:21

Другие вопросы по тегам:

Похожие вопросы: