在 cloud-init 脚本中以 root 身份为不同的用户安装 oh-my-zsh
installing oh-my-zsh for a different user as root in cloud-init script
我正在尝试 bootstrap 我的 AWS EC2 ubuntu 服务器,为 ubuntu 用户安装了 oh-my-zsh。我有一个云初始化脚本(更多信息 here),运行 作为 root 用户(使用 sudo)。因此,在我的脚本中,我 运行 作为 ubuntu 用户安装了 oh-my-zsh。
#cloud-config
runcmd:
# omitted other commands specific to my server, install zsh at the end
- apt-get install -y zsh
- su ubuntu -c 'sh -c "$(curl -fsSL https://raw.githubusercontent.com/coreycole/oh-my-zsh/master/tools/install.sh)"'
- chsh -s $(which zsh) ubuntu
# change the prompt to include the server hostname
- su ubuntu -c echo "echo export PROMPT=\''%{$fg[green]%}%n@%{$fg[green]%}%m%{$reset_color%} ${ret_status} %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'\'" >> /home/ubuntu/.zshrc
# get environment variables defined above
- echo "source ~/.profile" >> /home/ubuntu/.zshrc
当 cloud-init 完成并且我通过 ssh 进入 $PROMPT
时颜色不起作用,我看到 [green]
和 [cyan]
:
[green]ubuntu@[green]ip-172-31-27-24 [cyan]~
如果我在 ssh 登录后 运行 使用与 ubuntu 用户相同的 PROMPT
命令,颜色会正常工作:
问题似乎是当 cloud-init 脚本 运行 使用 echo
命令时如何评估颜色与 ubuntu 用户 [=] 时如何评估颜色39=]s echo
命令。有谁知道我如何更改 PROMPT
以便仅在 ubuntu 用户评估 ~/.zshrc
后评估颜色?
感谢 jgshawkey 的回答 ,我解决了这个问题。我使用 bash 变量来转义颜色代码和命令来推迟它们的评估:
- apt-get install -y zsh
- runuser -l ubuntu -c 'sh -c "$(curl -fsSL https://raw.githubusercontent.com/coreycole/oh-my-zsh/master/tools/install.sh)"'
- chsh -s $(which zsh) ubuntu
- fgGreen='%{$fg[green]%}'
- fgCyan='%{$fg[cyan]%}'
- fgReset='%{$reset_color%}'
- retStatus='${ret_status}'
- gitInfo='$(git_prompt_info)'
- runuser -l ubuntu -c "echo export PROMPT=\''${fgGreen}%n@%m${fgReset} ${retStatus} ${fgCyan}%c${fgReset} ${gitInfo}'\'" >> /home/ubuntu/.zshrc
- echo "source ~/.profile" >> /home/ubuntu/.zshrc
它在我的 ~/.zshrc
中看起来像这样:
因为我正在创建一个新的 user/server,所以我这样做了:
user=you user here
pass=you password here
apt install -y zsh curl wget # considering you currently are root
#creates a new user with password and zsh as default shell
useradd "$user" -m -p $(openssl passwd -1 "$pass") -s $(which zsh)
usermod -aG sudo "$user" # append to sudo and user group (optional)
# mind the command above, with the parameter --unattended which means "no questions" and "no set default to zsh"
runuser -l $user -c 'sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended'
对我来说效果很好。
我正在尝试 bootstrap 我的 AWS EC2 ubuntu 服务器,为 ubuntu 用户安装了 oh-my-zsh。我有一个云初始化脚本(更多信息 here),运行 作为 root 用户(使用 sudo)。因此,在我的脚本中,我 运行 作为 ubuntu 用户安装了 oh-my-zsh。
#cloud-config
runcmd:
# omitted other commands specific to my server, install zsh at the end
- apt-get install -y zsh
- su ubuntu -c 'sh -c "$(curl -fsSL https://raw.githubusercontent.com/coreycole/oh-my-zsh/master/tools/install.sh)"'
- chsh -s $(which zsh) ubuntu
# change the prompt to include the server hostname
- su ubuntu -c echo "echo export PROMPT=\''%{$fg[green]%}%n@%{$fg[green]%}%m%{$reset_color%} ${ret_status} %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'\'" >> /home/ubuntu/.zshrc
# get environment variables defined above
- echo "source ~/.profile" >> /home/ubuntu/.zshrc
当 cloud-init 完成并且我通过 ssh 进入 $PROMPT
时颜色不起作用,我看到 [green]
和 [cyan]
:
[green]ubuntu@[green]ip-172-31-27-24 [cyan]~
如果我在 ssh 登录后 运行 使用与 ubuntu 用户相同的 PROMPT
命令,颜色会正常工作:
问题似乎是当 cloud-init 脚本 运行 使用 echo
命令时如何评估颜色与 ubuntu 用户 [=] 时如何评估颜色39=]s echo
命令。有谁知道我如何更改 PROMPT
以便仅在 ubuntu 用户评估 ~/.zshrc
后评估颜色?
感谢 jgshawkey 的回答
- apt-get install -y zsh
- runuser -l ubuntu -c 'sh -c "$(curl -fsSL https://raw.githubusercontent.com/coreycole/oh-my-zsh/master/tools/install.sh)"'
- chsh -s $(which zsh) ubuntu
- fgGreen='%{$fg[green]%}'
- fgCyan='%{$fg[cyan]%}'
- fgReset='%{$reset_color%}'
- retStatus='${ret_status}'
- gitInfo='$(git_prompt_info)'
- runuser -l ubuntu -c "echo export PROMPT=\''${fgGreen}%n@%m${fgReset} ${retStatus} ${fgCyan}%c${fgReset} ${gitInfo}'\'" >> /home/ubuntu/.zshrc
- echo "source ~/.profile" >> /home/ubuntu/.zshrc
它在我的 ~/.zshrc
中看起来像这样:
因为我正在创建一个新的 user/server,所以我这样做了:
user=you user here
pass=you password here
apt install -y zsh curl wget # considering you currently are root
#creates a new user with password and zsh as default shell
useradd "$user" -m -p $(openssl passwd -1 "$pass") -s $(which zsh)
usermod -aG sudo "$user" # append to sudo and user group (optional)
# mind the command above, with the parameter --unattended which means "no questions" and "no set default to zsh"
runuser -l $user -c 'sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended'
对我来说效果很好。