通过编辑/etc/resolv.conf文件(使用sed)和问题来更改DNS服务器

时间:2011-08-10 16:04:43

标签: linux shell sed dns

我想更改Linux机器的DNS服务器。所以,我要编辑/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
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 个答案:

答案 0 :(得分:1)

>重定向的操作方式,输出文件在运行任何命令之前被截断,这意味着cat应该看到一个空文件,因此预期结果为空。我有点疑惑为什么你的第一次调用工作。您应该使用临时文件(例如mv resolv.conf resolv.conf~并运行sed -e '...' resolv.conf~ > resolv.conf,不需要cat)。或者,如果你有GNU sed,你可以使用就地编辑选项(sed -i),再次不需要cat

答案 1 :(得分:0)

使用此代码(未经测试):

sed 's/nameserver.*/nameserver 192.168.1.5/' /etc/resolf.conf > /etc/resolf.conf.new
mv /etc/resolf.conf.new /etc/resolf.conf

答案 2 :(得分:0)

我会想象做类似以下的事情。使用sed将cat流操作到另一个文件,然后以某种方式验证这个新文件,例如计算行数,如果新文件有效,请用/etc/resolv.conf替换新文件。

可能是这样的:

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;

答案 3 :(得分:0)

Sed有文件内版本;这就是我要做的事情(如果我确定在该文件中只定义了一个名称服务器;否则我会做其他事情,但我想他们已经不在这个问题上了)。在示例中,sed生成resolv.conf_bak文件以确保安全。

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

这是一个更精细的命令:

  1. 检查是否有名称服务器条目
  2. 如果是的话用sed编辑
  3. 如果没有创建新的
  4. 这是代码:

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

    再次提供您只使用单个名称服务器条目!