【问题标题】:How can I get a secure system-wide oh-my-zsh configuration?如何获得安全的系统范围的 oh-my-zsh 配置?
【发布时间】:2015-07-25 08:41:12
【问题描述】:

我想要一个系统范围的 oh-my-zsh 设置,但我不确定什么是“最好”的方法。我无意询问个人喜好等,我只是不确定以下解决方案是否是:

  • ln 我的本地用户配置似乎不正确,因为向我的本地 cfg 添加漏洞利用并因此获得 root 权限非常容易。

  • 安装 oh-my-zsh 到 /etc 也可能是一个安全漏洞,因为我根本不是自己写的。

  • 只写我自己的个人.zshrc 将是我想尝试的最后一种方法,因为它非常耗时。

有什么建议吗?

【问题讨论】:

  • 将它放在/etc 中并不比将它安装在主目录中并允许其他用户使用它更不安全。不过,这确实是 superuser.com 或 serverfault.com 的问题。
  • @chepner 我担心的一点是,使用 /etc,将为每个用户执行 cfg,即也为 root 用户执行,在我看来,这是一个潜在的安全漏洞。但似乎每个涉及用户 cfg 的解决方案都有这个问题。但是感谢您向超级用户询问的提示。

标签: linux shell unix zsh oh-my-zsh


【解决方案1】:

除非我误解了 Caleb 的标记答案只是 正常的每用户安装步骤,将 .zshrc 文件添加到 skel 目录并更改默认的新用户 shell,但它实际上并没有工作或真正回答问题,因为每个用户仍然需要 oh-my-zsh 目录/仍然需要每个用户克隆 oh- my-zsh dir 放到他们自己的文件夹中,这意味着它并没有真正安装在系统范围内,它只是自动给他们一个 zshrc 文件并将默认 shell 更改为 zsh,但是在每个用户文件夹中没有 oh-my-zsh 会出错出去。

根据我对这个问题的理解,它询问如何安装 oh-my-zsh system-wide 也就是将它安装在一个地方,而不需要手动弄乱每个新用户/拥有一个每个用户目录上的 oh-my-zsh 的 git 克隆。假设是这种情况,这就是我基于 Arch Linux 的 AUR 包所做的,我通常使用但在 centos 服务器上寻找相同的包,但是这可以在任何发行版上完成。 感谢 MarcinWieczorek 和其他维护者,我刚刚调整了以下内容,因此可以在非拱形发行版上做同样的事情。

如果您已经在 root 上安装了 oh-my-zsh,请跳到第 3 步。这不是特定于发行版的,只需使用 zshrc 的 AUR 补丁文件


第 1 步

当然要安装 zsh


第 2 步

以 root 身份正常安装 oh-my-zsh(显示 wget 方法,请参阅 Calebs 的答案)

sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

第 3 步

将安装移至 /usr/share 以便在系统范围内进行

#Copy zsh files to /usr/share for all uer access 
mv /root/.oh-my-zsh /usr/share/oh-my-zsh
# Move into the dir and copy the zshrc template to zshrc (which will be the default for users)
cd /usr/share/oh-my-zsh/
cp templates/zshrc.zsh-template zshrc
# Nab the patch file from MarcinWieczorek's AUR Package and apply to the zshrc file
wget https://aur.archlinux.org/cgit/aur.git/plain/0001-zshrc.patch\?h\=oh-my-zsh-git -O zshrc.patch && patch -p1 < zshrc.patch

现在 oh-my-zsh 已全局安装,用户只需要该 zshrc 文件。所以现在是 Caleb 的答案所在,尽管只需执行以下操作,因为 /etc/adduser.conf 仅在 debian 上,而以下应该是独立于发行版的。


第四步

将其设置为新用户的默认设置

# Create hard link to the zshrc file so it creates an actual independent copy on new users
sudo ln /usr/share/oh-my-zsh/zshrc /etc/skel/.zshrc
# Set default shell to zsh
sudo adduser -D -s /bin/zsh

现在这是 oh-my-zsh 的真正安装,所有新用户都会自动使用 /usr/share/oh-my-zsh/zshrc 设置应用它,无需其他步骤。

杂记

  • 对于任何使用 oh-my-zsh 的现有用户:

    cp /usr/share/oh-my-zsh/zshrc ~/.zshrc
    
  • 您可以在 /usr/share/oh-my-zsh/zshrc 中设置新用户 OMZ 默认值
  • 自动更新被禁用,因为新用户无权更新 /usr/share/oh-my-zsh 文件
    • 要更新 oh-my-zsh 只需 cd 到 /usr/share/oh-my-zsh/ 并运行 'sudo git pull'
  • oh-my-zsh 缓存将在 ~/.oh-my-zsh-cache/ 下的每个用户目录中按用户处理(自动创建)

【讨论】:

  • cp templates/zshrc.zsh-templan't answer the question/just looks to be the standard installation which must be performed per-user. Ite zshrc 这对我来说看起来不对。看起来你在复制命令上复制粘贴了一些东西。
  • Nab the patch file from [..]”命令实际上是做什么的,是否需要它?运行时出现以下错误:pastebin.com/fL54kTxZ
  • @Ronaldt,补丁文件有效并显示了它的作用。可能最重要的变化是 omz 在 zshrc 开头的新“home”路径(“zsh=..”)。
  • adduser -D -s /bin/zsh 在 Ubuntu 18.04 上失败,因为选项错误。我想那里的实现有所不同,编辑/etc/adduser.conf 是预期的方式。
  • AUR 补丁添加了一个 mkdir 命令来生成 zsh 的缓存文件夹:shell ZSH_CACHE_DIR=$HOME/.cache/oh-my-zsh if [[ ! -d $ZSH_CACHE_DIR ]]; then mkdir $ZSH_CACHE_DIR fi ,它在没有预先存在的 .cache 文件夹的系统上失败,例如我的 Ubuntu Docker 映像。考虑改用mkdir -p
【解决方案2】:

公平警告:这假设是 Debian 风格的 linux,但这也应该适用于其他形式。这也假设您是从零开始。

第 1 部分,安装:

您需要在整个系统范围内安装 zsh,而不仅仅是一个用户。 (您可能已经这样做了,但为了全面起见,我将其包括在内)

确保您已安装 zsh,只需:sudo apt-get install zsh

遵循oh-my-zsh install 指南,或者您可以:

使用卷曲

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

使用 wget

sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

第 2 部分,添加新用户时设置 zsh:

你需要让它让新用户默认使用 zsh。在您的 /etc/adduser.conf 文件中编辑以下行:

DSHELL=/bin/sh

到:

DSHELL=/bin/zsh

您还应该为/etc/default/useradd 文件更改它,更改行:

SHELL=/bin/sh

到:

SHELL=/bin/zsh

第 3 部分,设置您的自定义主题。

我有一个自定义主题文件 (here),我希望系统上的所有用户都拥有它。首先,您应该将文件添加到您的.oh-my-zsh/themes 文件夹:

cp your_custom_style.zsh-theme ~/.oh-my-zsh/themes

接下来,编辑您的主目录中的.zshrc 文件,将ZSH_THEME="default" 更改为ZSH_THEME="your_custom_style"

然后,重新加载您的 .zshrc 文件:. ~/.zshrc

第 4 部分,设置新用户的主目录。

我们需要将我们希望新用户拥有的任何文件放在/etc/skel 目录中,因为这是系统在创建新用户的主目录时复制的内容。详情请见this sys admin guide

复制您用户的文件(您可能需要 sudo):

cp -r .oh-my-zsh /etc/skel/
cp .zshrc /etc/skel 

现在您将能够添加新用户,他们将拥有 oh-my-zsh by 默认使用您希望他们拥有的任何自定义主题。

如果您想将所有其他现有用户的 shell 更改为 zsh,我建议您阅读this serverfault question

【讨论】:

  • 这与我在 Linux 和 BSD 机器上用于设置 ZSH 并可供所有未来用户使用的技术完全相同。现有用户需要更多的工作,但你明白了!精彩的回应!
  • 这个答案没有帮助,完全没有抓住重点,所以减一。
【解决方案3】:

如果您想要在系统范围内安装 Oh-My-Zsh,覆盖最少数量文件的便捷方法是:

sudo git clone https://github.com/robbyrussell/oh-my-zsh.git /etc/oh-my-zsh
sudo cp /etc/oh-my-zsh/templates/zshrc.zsh-template /etc/skel/.zshrc
sudo mkdir -p /etc/skel/.oh-my-zsh/cache

编辑/etc/skel/.zshrc:

  • 编辑export ZSH=$HOME/.oh-my-zsh行(当前为第5行)
  • 将行更改为:
      export ZSH=/etc/oh-my-zsh
      export ZSH_CACHE_DIR=~/.oh-my-zsh/cache

然后编辑/etc/default/useradd并将SHELL=...这一行更改为SHELL=/bin/zsh

基本上就这些了(当然git和zsh必须已经安装好了)。

要更新预先存在的用户:以他们和cp /etc/skel/.zshrc ~/.zshrc 登录

更新:请不要编辑。我刚刚回滚了一个完全搞砸的编辑!

【讨论】:

    【解决方案4】:

    以 ROOT 身​​份登录

    第 1 步:安装 ZSH

    # Download and extract ZSH
    
    wget https://github.com/zsh-users/zsh/archive/zsh-5.8.tar.gz -P /tmp/demo/zsh
    cd /tmp/demo/zsh
    tar -xvzf zsh-*
    cd zsh-zsh-5.8
    
    # configure and make
    
    sudo ./Util/preconfig
    sudo ./configure
    sudo make && sudo make install
    
    
    # Add ZSH to the list of shells
    
    echo /usr/local/bin/zsh | sudo tee -a /etc/shells
    

    第 2 步:安装 oh-my-zsh

    # If you're running the Oh My Zsh install script as part of an automated install, 
    # you can pass the flag --unattended to the install.sh script.
    # This will have the effect of not trying to change the default shell, and also won't
    # run zsh when the installation has finished.
    
    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
    
    # Add oh-my-zsh to /usr/share
    mv /root/.oh-my-zsh /usr/share
    mv /usr/share/.oh-my-zsh /usr/share/oh-my-zsh
    mv /root/.zshrc /usr/share/oh-my-zsh
    mv /usr/share/oh-my-zsh/.zshrc /usr/share/oh-my-zsh/zshrc
    
    # Modify zshrc to point to /usr/share/oh-my-zsh
    
    sed -i 's|export ZSH="'"$HOME"'/.oh-my-zsh"|export ZSH="\/usr\/share\/oh-my-zsh"|g' /usr/share/oh-my-zsh/zshrc
    

    第 3 步:添加额外功能(可选 - 查看底部的额外功能)

    第 4 步:创建符号链接

    # Create Symbolic Links to /etc/skel
    sudo ln /usr/share/oh-my-zsh/zshrc /etc/skel/.zshrc
    

    第 5 步:为 root 添加 oh-my-zsh

    # Change shell to ZSH for root
    echo "$USER" | chsh -s /usr/local/bin/zsh
    

    第 6 步:为用户添加 oh-my-zsh

    # Change user
    su - username
    
    # Copy zshrc to $HOME for user
    cp /usr/share/oh-my-zsh/zshrc ~/.zshrc
    
    # Change shell to ZSH for user  
    echo "$USER" | chsh -s /usr/local/bin/zsh
    

    sudo -i -u username bash << EOF
    cp /usr/share/oh-my-zsh/zshrc ~/.zshrc
    echo username | chsh -s /usr/local/bin/zsh
    EOF
    

    额外:

    将主题更改为 powerlevel10k

    git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-/usr/share/oh-my-zsh/custom}/themes/powerlevel10k
    
    sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="powerlevel10k\/powerlevel10k"/g' /usr/share/oh-my-zsh/zshrc
    

    启用自动校正

    sed -i 's/# ENABLE_CORRECTION="true"/ENABLE_CORRECTION="true"/g' /usr/share/oh-my-zsh/zshrc
    

    启用自动建议和语法突出显示

    git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-/usr/share/oh-my-zsh/custom}/plugins/zsh-autosuggestions
    
    git clone --depth=1 https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-/usr/share/oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
    
    sed -i 's/plugins=(git)/plugins=(\n  git\n  zsh-autosuggestions\n  zsh-syntax-highlighting\n)/' /usr/share/oh-my-zsh/zshrc
    
    sed -i 's/plugins=(git)/plugins=(git)\nZSH_DISABLE_COMPFIX=true/' /usr/share/oh-my-zsh/zshrc
    

    添加nord dircolors

    git clone --depth=1 https://github.com/arcticicestudio/nord-dircolors.git /tmp/demo/dircolors
    
    mv /tmp/demo/dircolors/src/dir_colors /usr/share/
    cd /usr/share/
    mv /usr/share/dir_colors /usr/share/.dir_colors
    
    tee -a /usr/share/oh-my-zsh/zshrc >/dev/null <<'EOF'
    test -r "/usr/share/.dir_colors" && eval $(dircolors /usr/share/.dir_colors)
    EOF
    

    【讨论】:

      【解决方案5】:

      我结合了 cFINNY 的回答,阅读并理解了 oh-my-zsh 安装脚本、他回答中的 AUR 补丁,并修复了损坏的 adduser 命令以在FROM ubuntu:bionic (Ubuntu 18.04) Dockerfile :

      RUN git clone \
              -c core.eol=lf \
              -c core.autocrlf=false \
              -c fsck.zeroPaddedFilemode=ignore \
              -c fetch.fsck.zeroPaddedFilemode=ignore \
              -c receive.fsck.zeroPaddedFilemode=ignore \
              --depth=1 \
              --branch master \
              https://github.com/ohmyzsh/ohmyzsh.git \
              /usr/share/oh-my-zsh \
          # Adapt zshrc template
          && cd /usr/share/oh-my-zsh/ \
          && cp templates/zshrc.zsh-template zshrc \
          && sed -i 's/export ZSH=$HOME\/.oh-my-zsh/export ZSH=\/usr\/share\/oh-my-zsh/g' zshrc \
          && sed -i 's/# DISABLE_AUTO_UPDATE="true"/DISABLE_AUTO_UPDATE="true"/g' zshrc \
          && sed -i 's/source $ZSH\/oh-my-zsh.sh//g' zshrc \
          && sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="bira"/g' zshrc \
          && echo '\n \
      \n \
      ZSH_CACHE_DIR=$HOME/.cache/oh-my-zsh \n \
      if [[ ! -d $ZSH_CACHE_DIR ]]; then \n \
        mkdir -p $ZSH_CACHE_DIR \n \
      fi \n \
       \n \
      source $ZSH/oh-my-zsh.sh \n \
      ' >> zshrc \
          # Copy zshrc template to $HOME on user creation
          && ln /usr/share/oh-my-zsh/zshrc /etc/skel/.zshrc \
          # Setting the default shell for new users has no effect since:
        # 1. The default shell is specified when creating new users in entrypoint
        # 2. The `ade enter` command will execute `bash` anyways
          && sed -i 's/DSHELL=\/bin\/bash/DSHELL=\/bin\/zsh/g' /etc/adduser.conf
      

      【讨论】:

        【解决方案6】:

        还有一个简单的方法可以做到这一点: 以root用户登录并安装zsh

        • sudo su
        • apt-get install zsh

        然后以系统的另一个用户身份登录:

        • su username
        • export ZSH=/home/username/.oh-my-zsh
        • sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

        对所有想要oh-my-zsh的用户遵循相同的程序

        【讨论】:

          猜你喜欢
          • 2015-12-23
          • 2020-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-28
          • 1970-01-01
          相关资源
          最近更新 更多