我该如何管理超级按钮中的用户变更?

我该如何管理超级按钮中的用户变更?

我正在编写一个 charm,其中我需要更改用户来安装一些软件包。当我启动 juju-deploy 时,所有这些都以 root 身份运行... 因此,我尝试更改我的用户,但无法实现。如果有人知道如何解决这个问题,请 agradeceria... 我在用 bash 编写的安装脚本中尝试了很多东西,但我没有完成任何事情。

我正在尝试这个...这是我在 hooks 目录中安装脚本的一部分:

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 用户)运行脚本。但这并没有发生

答案1

您的安装脚本可能由于多种原因而失败:

  • 如果该组以前不存在,则 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)。这可能是您的原始脚本将 skel 文件复制到用户目录的原因。

您可以在 charm unit 的 juju 日志文件中看到这些错误。强烈建议使用 运行 bash 脚本,以便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'

用户 charm 的安装脚本的输出是:

$ 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 命令复制过来的。您可以像其他命令一样使用钩子文件susudo从钩子文件运行单个命令。

答案2

在脚本中使用“su - "$user"”最终将为指定用户启动一个交互式 shell。

您可以使用“--command”选项来“su”以指定要运行的命令。然后,您可以将要以该用户身份运行的命令封装在脚本中,该脚本可以创建为 bash here 文档。

您的脚本看起来会像这样...

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}

答案3

由于您的脚本以 root 身份运行,因此您还可以使用 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

相关内容