为什么如果我在脚本内部更改用户,运行 su 的脚本似乎永远不会终止?

为什么如果我在脚本内部更改用户,运行 su 的脚本似乎永远不会终止?

我有一个非常简单的 bash 脚本,其中有 5 个命令在 root 用户下运行。如果我手动逐个运行命令,一切都会正常 - 没有问题。但是当我通过命令将其作为 my-deploy.sh 文件运行时

bash /root/custom-scripts/deploy/my-deploy.sh 2>> /var/log/www-deploy/tatrytec.eu.log

这似乎是无休止的过程。以下是脚本:

#!/bin/bash
# Run this script as bash command like: bash create-apache-site.sh

cd /var/www/html/tatrytec.eu

git pull

# Change user bacause of composer install warrning
su vlado

composer install  --no-scripts

npm install --production

它开始运行,我可以在终端中看到 git pull 的结果。但随后它没有任何错误就死机了,而且仍在运行。我可以通过 ctrl+Y 停止它。我认为该用户出了问题,但正如我之前所写,如果我逐个运行命令,它就会起作用。我不明白。有人能告诉我问题可能出在哪里吗?谢谢。

答案1

  1. su vlado除非以 root 身份运行,否则需要密码。
  2. su vlado将等待输入
  3. 之后的命令su valdo不是在里面执行su,而是在退出后执行su valdo

发生什么事

cd /var/www/html/tatrytec.eu  # change dir

git pull # pull git repos

# Change user bacause of composer install warrning
su vlado # either ask password or wait for input

composer install  --no-scripts # if this get executed, you are no longer as vlado

  • 关键点在于su vlado将会分叉一个新的 shell,它将忽略(原样)原始 bash 脚本中的以下行。
  • 复制/粘贴时你没有这个限制(因为你在 vlado 的新 shell 中复制)

我尝试更详细地解释哪个用户/发生了什么

cd /var/www/html/tatrytec.eu  # ROOT change dir

git pull # ROOT pull git repos

# Change user bacause of composer install warrning
su vlado # VLADO wait for input
new shells as VLADO> sample command
new shells as VALDO> exit

composer install  --no-scripts # ROOT run composer

建议修正

以 root 身份

#!/bin/bash
# Run this script as bash command like: bash create-apache-site.sh

cd /var/www/html/tatrytec.eu

git pull

# Change user bacause of composer install warrning
su vlado  <<EOF

composer install  --no-scripts

npm install --production

EOF

在哪里

  • su vlado << EOF...EOF将所有行输入至su vlado

答案2

改用这个:

#!/bin/bash
# Run this script as bash command like: bash create-apache-site.sh

cd /var/www/html/tatrytec.eu

git pull

# Change user bacause of composer install warrning
su vlado -c 'composer install  --no-scripts; npm install --production'

-c或选项--command允许su您运行命令。

答案3

您似乎想以用户 vlado 的身份运行脚本中的最后几行。有一种简洁的方法可以做到这一点:

sudo -u vlado  your_command 

因此脚本的最后几行将如下所示:

sudo -u vlado composer install --no-scripts
sudo -u vlado npm install --production

答案4

我猜su vlado需要输入密码。

您可以使用 sudo,并通过修改 /etc/sudoers 使其不需要密码来执行特定命令

相关内容