我想更改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 命令是否有问题?
答案 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
这是一个更精细的命令:
这是代码:
~# grep -q nameserver /etc/resolv.conf && sed -i_bak "s/\(nameserver\) .*/\1 $NAMESERVER/" /etc/resolv.conf || echo "nameserver $NAMESERVER" >> /etc/resolv.conf
再次提供您只使用单个名称服务器条目!