我有一个非常简单的 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
除非以 root 身份运行,否则su vlado
需要密码。su vlado
将等待输入- 之后的命令
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 使其不需要密码来执行特定命令