Я пишу талисман, в котором мне нужно сменить пользователя для установки некоторых пакетов. Когда я запускаю 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. Но этого не происходит
Ваш сценарий установки мог перестать работать по нескольким причинам:
useradd: group 'coolgroup' does not exist
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.
Вы видите эти ошибки в файле журнала амулета для единицы очарования. Это настоятельно рекомендовано для запущения скриптов удара с 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
из файлов рычага.
Использование '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}
Так как Ваш сценарий работает как корень, можно также использовать 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