创建 ec2 实例时,我使用引导脚本。在实例上,我安装并配置了 nginx Web 服务器。出于安全原因,我需要创建一个新用户 (www-data)。
www-data 用户使用以下命令创建:
sudo groupadd www-data
sudo adduser www-data -g www-data
sudo passwd -d www-data
另外,我在该机器上运行了一些 Python 脚本。为此,我使用了 virtualenv。我运行以下流程:
su www-data
pip install --user virtualenv
python -m virtualenv $VIRTUALENV_NAME
cd /path/to/bin
source activate
pip install `stuff`
deactivate
当我想返回 ec2-user 时,上述流程之后出现了问题。在终端中键入exit
即可。在引导脚本中,它将退出脚本。
我试过了,su ec2-user
但它要求输入密码。我没有密码。
如何从另一个用户返回 ec2-user?或者如何解决这个问题
答案1
当你类型这
su www-data
whatever
something-else
exit
su
以用户身份启动额外的 shell www-data
。然后你类型连续的命令,它们都在这个 shell 中执行,因此exit
会带你回到旧的 shell。
如果这些命令在脚本中,whatever
则不会在附加 shell 中执行。原始 shell 将等待su
退出,然后才能继续执行whatever
。如果您从终端运行这样的脚本(带有适当 shebang 的文件script.sh
),您将被带到一个交互的shell。exit
手动输入以继续脚本。
现在,引导脚本中没有附加 TTY,su www-data
无法启动交互式 shell 并立即退出。脚本的其余部分将被执行(显然不是以www-data
用户身份执行);如果有exit
某个地方,它将退出脚本。
处理它的最干净的方法是将其插入whatever
到something-else
单独的辅助脚本中,然后可以在主脚本中调用
su www-data -c "/path/to/the/helper/script"
主脚本将等待su
退出。当它发生时,任何后续行都将由原始用户执行。
另一种方式是这样的:
su www-data -c 'whatever; something-else'
或者等价地
su www-data -c '
whatever
something-else
'
如果命令需要引用,后一种方法可能会很麻烦。使用附加脚本则不会出现这样的问题。