當前位置: 首頁>>技術教程>>正文


使用shell腳本將行附加到/etc/hosts文件

, , , ,

問題描述

我有一個新的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

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/6805.html,未經允許,請勿轉載。