Изменить DNS-сервер, отредактировав файл /etc/resolv.conf (используя sed) и проблему - PullRequest
2 голосов
/ 10 августа 2011

Я хочу изменить DNS-сервер для моей машины с Linux. Итак, я собираюсь редактировать файл /etc/resolv.conf.

Я использую команду: SED . И, как показано ниже, измените DNS-сервер на 192.168.1.5 :
#cat /etc/resolv.conf | sed '/nameserver/ c\ nameserver 192.168.1.5' > /etc/resolv.conf

Проблема:

Когда я выполняю команду в первый раз, и она меняет resolv.conf на что-то вроде:

domain somedomain<br> namserver 192.168.1.5

но при повторном запуске изменить DNS-сервер на 192.168.1.4:
#cat /etc/resolv.conf | sed '/nameserver/ c\ nameserver 192.168.1.4' > /etc/resolv.conf

Файл resolv.conf становится пустым

Вопросы:
1. Правильно ли я изменяю DNS-сервер?
2. Есть ли проблема с командой sed в приведенной выше команде?

Ответы [ 4 ]

1 голос
/ 10 августа 2011

Как работает перенаправление >, выходной файл усекается перед выполнением любой из команд, что означает, что cat должен видеть пустой файл, поэтому ожидаемый результат - ничто.Я немного озадачен тем, почему ваш первый вызов работает.Вы должны использовать временный файл (например, mv resolv.conf resolv.conf~ и запустить sed -e '...' resolv.conf~ > resolv.conf, нет необходимости в cat).В качестве альтернативы, если у вас есть GNU sed, вы можете использовать опцию редактирования на месте (sed -i), опять же, нет необходимости в cat.

1 голос
/ 10 августа 2011

используйте этот код (не проверено):

sed 's/nameserver.*/nameserver 192.168.1.5/' /etc/resolf.conf > /etc/resolf.conf.new
mv /etc/resolf.conf.new /etc/resolf.conf
0 голосов
/ 10 августа 2011

Sed имеет издание в файле ; это то, как я это сделаю (если я уверен, что в этом файле определен только один сервер имен; в противном случае я бы сделал другие вещи, но я думаю, что они вне этого вопроса). В примере sed создает файл resolv.conf_bak для безопасности.

~# NAMESERVER=192.168.1.5;
~# sed -i_bak "s/\(nameserver\) .*/\1 $NAMESERVER/" /etc/resolv.conf

И это более сложная команда:

  1. проверяет, есть ли запись на сервере имен
  2. если это так, отредактируйте его с помощью sed
  3. и, если нет, создает новый

Это код:

~# grep -q  nameserver /etc/resolv.conf && sed -i_bak "s/\(nameserver\) .*/\1 $NAMESERVER/" /etc/resolv.conf || echo "nameserver $NAMESERVER" >> /etc/resolv.conf

Опять при условии, что вы работаете только с одной записью на сервере имен!

0 голосов
/ 10 августа 2011

Я бы хотел сделать что-то вроде следующего.Используйте sed, чтобы манипулировать потоком cat в другой файл, затем как-то проверить этот новый файл, например подсчитать количество строк, и, если новый файл действителен, заменить новый файл на /etc/resolv.conf.

Couldбыть примерно таким:

cat /etc/resolv.conf | sed "s/.*nameserver.*/nameserver 192.168.1.5/" > /etc/resolv.conf.sed;

if [ "$(wc -l /etc/resolv.conf.sed)" -eq "0" ]; then
    rm /etc/resolv.conf.sed;
fi;

if [ -e /etc/resolv.conf.sed ]; then
    mv /etc/resolv.conf.sed /etc/resolv.conf
fi;

Только последняя строка, попробуйте сначала подсчитать строки, используйте head для печати всех строк, кроме одной, в выходной файл и используйте tail для печати последней строки, выполните sedманипулирование и добавление к выходному файлу, например:

I=$(wc -l /etc/resolv.conf | cut -d\/ -f1);
N=$[I-1];
head -n$N /etc/resolv.conf > /etc/resolv.conf.sed
tail -n1 /etc/resolv.conf | sed "s/.*nameserver.*/nameserver 192.168.1.5/" >> /etc/resolv.conf.sed;

if [ "$(wc -l /etc/resolv.conf.sed)" -eq "$I" ]; then
    rm /etc/resolv.conf.sed;
fi;

if [ -e /etc/resolv.conf.sed ]; then
    mv /etc/resolv.conf.sed /etc/resolv.conf
fi;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...