Подтвердить что ты не робот

Добавить строку в файл /etc/hosts с помощью сценария оболочки

У меня новый Ubuntu 12.04 VPS. Я пытаюсь написать установку script, которая завершает всю установку 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

Я пробовал различные команды sed, используя команду append (\a). По какой-то причине Ubuntu либо перекликается с содержимым файла hosts в терминале, либо ничего не делает. Как правильно вставить вторую строку в файл с помощью bash script?

4b9b3361

Ответ 1

Обязательно используйте параметр -i 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

В противном случае

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

добавит строку в конец файла, которая может работать так, как вы ожидаете.

Ответ 2

Вставить/Обновить запись

Если вы хотите программно вставить/обновить запись хостов с помощью bash, здесь script я написал для этого:

#!/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

script предназначен для использования с OS X, но будет работать и с Linux, и с незначительной настройкой.

Ответ 3

Если у вас 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

Ответ 4

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

Ответ 5

Я должен указать, что sed (редактор потока) на самом деле не предназначен для редактирования файлов, хотя его можно использовать для этого. (Стандартное sed не имеет встроенного механизма для записи нестандартного вывода.) Более подходящим инструментом будет ed.

Следующий ed script говорит: "Найдите строку, содержащую (по общему признанию, неаккуратное) регулярное выражение/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 очень тривиально:

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

Ответ 6

вы можете использовать sed, например:

sed '/Венера/a\
192.241.xx.xx venus.example.com venus '/etc/hosts

Ответ 7

попробуйте это с правами суперпользователя.

 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();
    }
}

это добавит строки к хостам в андроиде