我在启动AWS Ubuntu实例(来自Cloud Formation模板)并在启动时成功运行脚本时遇到了很多麻烦。这个脚本确实运行,但我不希望它以root身份运行。我希望脚本可以作为不同的用户调用,也可以在脚本运行时让脚本更改用户。
由于我们正在尝试使用Cloud Formation,因此我需要将脚本或脚本引用放在我的模板文件中。我的模板文件的相关部分如下。脚本'myScript.sh'确实运行,但始终以root身份运行。
"MyImage" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"ImageId" : "xxxxxx",
"KeyName" : "xxxxxx",
"SecurityGroups" : [ "xxxxxx" ],
"UserData" : {"Fn::Base64" : {"Fn::Join" : ["", [
"#include\n",
"https://s3-eu-west-1.amazonaws.com/aFolder/myScript.sh \n"
] ] } }
}
}
},
从URL:http://alestic.com/2009/06/ec2-user-data-scripts它声明这些脚本始终以root身份运行。所以我决定修改脚本来改变用户。下面是一个不能满足我想要的示例脚本。我已经内联评论它来解释每个阶段的作用:
#!/bin/bash
whoami > /home/ubuntu/who1.txt # Always returns 'root'
su ubuntu # Appears to have no effect. Ubuntu user does exist
whoami > /home/ubuntu/who2.txt # Always returns 'root'
su ubuntu echo fish > /home/ubuntu/aFile.txt # File is not created
sudo -u ubuntu bash # Appears to have no effect
whoami > /home/ubuntu/who3.txt # Always returns 'root'
我猜我的脚本存在根本性的错误,但我看不到它!有没有人有过AWS和Cloud Formation的经验,你是否成功地以root身份运行脚本?我真的不希望脚本以root身份运行,因为要启动的活动不应该在根级别拥有。
谢谢, 菲尔
答案 0 :(得分:8)
su
不会更改脚本剩余部分的用户,而是为您指定的用户启动新的交互式shell。在像这里的脚本这样的非交互式上下文中,该shell会立即退出,因为它没有任何内容可以执行。
有关如何更改一系列命令的用户的一些建议,请参阅this question。或者对于单个命令,您可以执行sudo -u ubuntu [...]
。
答案 1 :(得分:0)
这是一个不错的选择。
#!/bin/bash
su ubuntu << 'EOF'
whoami >> /home/ubuntu/user_data_output2
EOF
su user2 << 'EOF'
whoami >> /home/user2/user_data_output2
EOF
为什么? 这使得目录和环境在每个“EOF”中的命令之间保持变量。块。
例如:
#!/bin/bash
su ubuntu << 'EOF'
cd /home/ubuntu/myfolder
pwd # The result will be /home/ubuntu/myfolder #
EOF