使用shell脚本将行附加到/ etc / hosts文件

时间:2013-10-12 21:11:59

标签: linux bash shell ubuntu sed

我有一个新的Ubuntu 12.04 VPS。我正在尝试编写一个完成整个LAMP安装的安装脚本。我遇到问题的地方是在/etc/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(sed)命令尝试了各种\a命令。出于某种原因,Ubuntu要么只是回显终端中hosts文件的内容,要么根本不做任何事情。如何使用bash脚本将第二行正确地注入文件?

8 个答案:

答案 0 :(得分:36)

请务必使用-i的{​​{1}}选项。

sed

否则,

-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

会将该行附加到文件的末尾,这可以按预期工作。

答案 1 :(得分:16)

插入/更新条目

如果你想使用bash以编程方式插入/更新主机条目,这是我写的一个脚本:

#!/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以及稍微调整。

答案 2 :(得分:9)

如果您在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

答案 3 :(得分:3)

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

答案 4 :(得分:1)

我应该指出sed stream 编辑器)实际上不是用于编辑文件,尽管它可以用来做。 (Standard sed没有用于写入标准输出以外的内置机制。)更合适的工具是ed

以下ed脚本说“找到包含(公认的马虎)正则表达式/127.0.0.1/的行,并在下一行附加。” (唯一的一段时间告诉ed停止追加。)

ed /etc/hosts <<-'EOF'
    /127.0.0.1/a
    192.241.xx.xx  venus.example.com
    .
    wq
EOF

也就是说,您可以非常简单地将此行附加到/ etc / hosts文件的 end

echo '192.241.xx.xx  venus.example.com' >> /etc/hosts

答案 5 :(得分:0)

你可以使用sed,例如:

sed&#39; / Venus / a \
192.241.xx.xx venus.example.com venus&#39;的/ etc /主机

答案 6 :(得分:0)

以root用户访问权限尝试此操作。

 public void edithost() {
    sudo("echo " + "192.168.43.1     www.openrap.com openrap" + " >> /etc/hosts");
    sudo("echo " + "192.168.43.1  openrap.com openrap" + " >> /etc/hosts");
    sudo("echo " + "192.168.2.144  www.openrap.com openrap" + " >> /etc/hosts");
    sudo("echo " + "192.168.2.144  openrap.com openrap" + " >> /etc/hosts");
}

sudo以获得超级用户权限

public static void sudo(String... strings) {
    try {
        Process su = Runtime.getRuntime().exec("su");
        DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

        for (String s : strings) {
            outputStream.writeBytes(s + "\n");
            outputStream.flush();
        }

        outputStream.writeBytes("exit\n");
        outputStream.flush();
        try {
            su.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这会将行添加到android中的主机

答案 7 :(得分:0)

我从 bash 脚本中尝试了上述所有内容。没有一个工作。 所以我是这样用的:

chmod 777 /etc/hosts
echo "127.0.0.1 $HOSTNAME" >> /etc/hosts
chmod 644 /etc/hosts

不理想,但至少有效...