问题描述
我有一个新的Ubuntu 12.04 VPS。我正在尝试编写一个完成整个LAMP安装的安装脚本。我遇到问题的地方是在/etc/hosts
文件中附加一行。我当前的hosts文件如下所示:
127.0.0.1 localhost Venus
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
我希望它看起来像这样:
127.0.0.1 localhost Venus
192.241.xx.xx venus.example.com venus
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
我使用append(\a
)命令尝试了各种sed
命令。出于某种原因,Ubuntu或者只是在终端中回显hosts
文件的内容,或者什么都不做。如何使用bash脚本正确地将第二行注入文件?
最佳解决办法
确保使用sed
的-i
选项。
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
sed -i "2i192.241.xx.xx venus.example.com venus" /etc/hosts
除此以外,
echo "192.241.xx.xx venus.example.com venus" >> /etc/hosts
将该行附加到文件的末尾,这可以按预期工作。
次佳解决办法
插入/更新条目
如果你想使用bash以编程方式插入/更新hosts条目,这是我写的一个脚本:
#!/bin/bash
# insert/update hosts entry
ip_address="192.168.x.x"
host_name="my.hostname.example.com"
# find existing instances in the host file and save the line numbers
matches_in_hosts="$(grep -n $host_name /etc/hosts | cut -f1 -d:)"
host_entry="${ip_address} ${host_name}"
echo "Please enter your password if requested."
if [ ! -z "$matches_in_hosts" ]
then
echo "Updating existing hosts entry."
# iterate over the line numbers on which matches were found
while read -r line_number; do
# replace the text of each line with the desired host entry
sudo sed -i '' "${line_number}s/.*/${host_entry} /" /etc/hosts
done <<< "$matches_in_hosts"
else
echo "Adding new hosts entry."
echo "$host_entry" | sudo tee -a /etc/hosts > /dev/null
fi
该脚本旨在与OS X一起使用,但也可以在linux上进行微调。
第三种解决办法
如果您在Mac中或需要sudo权限,请尝试以下操作:
sudo -- sh -c -e "echo '192.34.0.03 subdomain.domain.com' >> /etc/hosts";
它仍然会要求您输入密码。
来自@kainjow的替代方式
echo '192.34.0.03 subdomain.domain.com' | sudo tee -a /etc/hosts
第四种办法
echo "127.0.0.1 localhost `hostname`">./temp_hosts
echo "192.241.xx.xx venus.example.com">>./temp_hosts
cat /etc/hosts |tail -n +2 >>./temp_hosts
cat ./temp_hosts > /etc/hosts
rm ./temp_file