Shell 如果我从命令行(以root用户身份)运行脚本,它就可以工作。如果它在启动时运行,则会失败
我有一个shell脚本,我想在启动时运行。在这个脚本中,我使用aws cli将我的IP更新为route53记录集,如果我从命令行(以root用户身份)运行该脚本,它就会工作。如果它在启动时运行,则会失败。我已经为根用户配置了aws凭据。 我的更新路径53-record.shShell 如果我从命令行(以root用户身份)运行脚本,它就可以工作。如果它在启动时运行,则会失败,shell,amazon-web-services,ubuntu-14.04,aws-cli,Shell,Amazon Web Services,Ubuntu 14.04,Aws Cli,我有一个shell脚本,我想在启动时运行。在这个脚本中,我使用aws cli将我的IP更新为route53记录集,如果我从命令行(以root用户身份)运行该脚本,它就会工作。如果它在启动时运行,则会失败。我已经为根用户配置了aws凭据。 我的更新路径53-record.sh #!/bin/bash DOMAIN_NAME="mydomain.com" HOSTED_ZONE_ID="Z1986XXXXXXXXX" main(){ UPDATED_IP_LIST=$(updated_i
#!/bin/bash
DOMAIN_NAME="mydomain.com"
HOSTED_ZONE_ID="Z1986XXXXXXXXX"
main(){
UPDATED_IP_LIST=$(updated_ip_list)
update_route53_record "$UPDATED_IP_LIST"
}
# Get IP List of $DOMAIN_NAME from route53
get_ip_list(){
RECORD_SET_JSON=$( aws route53 list-resource-record-sets --hosted-zone-id Z1986QIYBBYSUJ --query "ResourceRecordSets[?Name == '$DOMAIN_NAME.']")
#Remove the first and last character in string to convert json array to json object
RECORD_SET_JSON=${RECORD_SET_JSON:1:-1}
# Need to install jq to parse json http://xmodulo.com/how-to-parse-json-string-via-command-line-on-linux.html
# Get value of ResourceRecords
RECORD_SET_JSON=$( echo $RECORD_SET_JSON | jq -r '.ResourceRecords' )
echo $RECORD_SET_JSON
}
updated_ip_list(){
# Get public IP of running instance
IP=$( curl http://169.254.169.254/latest/meta-data/public-ipv4 )
# IP="192.168.10.1"
# Get IP list from Route53 by invoking get_ip_list
IP_LIST=$(get_ip_list)
# Get length of json array
LENGTH=$(echo $IP_LIST | jq '. | length')
# Add one element to last array
IP_LIST=$(echo $IP_LIST | jq '.['$LENGTH'].Value |= .+ '\"$IP\"'')
echo $IP_LIST
}
update_route53_record(){
JSON_REQUEST='{
"Comment": "Update the A record set",
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": '\"$DOMAIN_NAME\"',
"Type": "A",
"TTL": 300,
"ResourceRecords": '$1'
}
}
]
}'
#echo $JSON_REQUEST
#echo "Calling API..."
aws route53 change-resource-record-sets --hosted-zone-id "$HOSTED_ZONE_ID" --change-batch "$JSON_REQUEST"
# write to log file
echo "aws route53 change-resource-record-sets --hosted-zone-id \"$HOSTED_ZONE_ID\" --change-batch \"$JSON_REQUEST\"" | sudo tee /var/log/update-route53.log
}
main
exit 0
我安装的脚本在启动时运行
sudo cp update-route53-record.sh /etc/init.d
sudo chmod +x /etc/init.d/update-route53-record.sh
sudo update-rc.d update-route53-record.sh defaults 98 02
但是,如果我从命令行(以root用户身份)运行脚本,它就可以工作。如果它在启动时运行,则会失败。我已经为根用户配置了aws凭据。
您能帮忙吗?这可能是因为您在用户数据中使用了
sudo
。AWS以root用户身份运行这些命令,使用sudo将无法工作,因为sudo需要tty
从:
作为用户数据输入的脚本作为根用户执行,因此不要在脚本中使用sudo命令
试着移除sudo,看看效果如何 这可能是因为您在用户数据中使用了
sudo
。AWS以root用户身份运行这些命令,使用sudo将无法工作,因为sudo需要tty
从:
作为用户数据输入的脚本作为根用户执行,因此不要在脚本中使用sudo命令
试着移除sudo,看看效果如何 第169页。范围通常是“无法获取IP”类型的地址。我猜你是想在网卡驱动程序完全加载之前运行脚本,对吗?@SteveMatthews,那么如何在启动时运行脚本,但在网卡驱动程序完全加载之后运行脚本呢?你也许可以在脚本的开头加一个睡眠,让它启动,然后等待?@SteveMatthews,它能够获得IP。我可以在调试时打印出IP。范围通常是“无法获取IP”类型的地址。我猜你是想在网卡驱动程序完全加载之前运行脚本,对吗?@SteveMatthews,那么如何在启动时运行脚本,但在网卡驱动程序完全加载之后运行脚本呢?你也许可以在脚本的开头加一个睡眠,让它启动,然后等待?@SteveMatthews,它能够获得IP。我可以在调试时打印出IP。