使用sudo更改根目录中的文件

时间:2014-05-29 18:04:50

标签: bash shell

我尝试编写脚本以自动配置resolv.conf/etc/network/interfaces。我将命令作为" sudo"运行,但我得到"权限被拒绝"错误。

sudo apt-get --assume-yes install vsftpd
sudo "nameserver 8.8.8.8" >> /etc/resolv.conf
sudo python setinterfaces.py
sudo chattr +i /etc/network/interfaces
sudo apt-get --assume-yes install lamp-server^

第2行和第3行获得权限拒绝错误,但第1行和第5行确实运行。 setinterfaces.py应该覆盖/etc/network/interfaces'. setinterfaces.py works when pointed at the home folder but not the interfaces`文件。

有什么想法吗?我必须改变所有权吗?理想情况下,我希望这是一个命令脚本,我可以在其中调用它,它将运行。我正在为那些没有* nix经验的人写这个剧本。

2 个答案:

答案 0 :(得分:2)

sudo命令执行您在root帐户下提供的命令。最简单的形式是语法:

sudo command args...

例如:

sudo whoami

打印root

如果您输入内容,就像在问题中所做的那样:

sudo "nameserver 8.8.8.8" >> /etc/resolv.conf
然后它不会起作用;它将尝试执行名为"nameserver 8.8.8.8"的命令,该命令不存在。问题在于你错过了echo命令。

此:

sudo "echo nameserver 8.8.8.8" >> /etc/resolv.conf

仍然无效,因为没有名为"echo nameserver 8.8.8.8"的命令。整个字符串作为单个参数传递给sudo。它需要将命令及其每个参数视为一个单独的参数。

所以这个:

sudo echo nameserver 8.8.8.8 >> /etc/resolv.conf

越来越近 - 但它仍然无效。它以echo执行root命令 - 但echo不需要特殊权限,因此执行root没有意义。 >> /etc/resolv.conf重定向由shell执行,它以您身份运行,而不是root。由于您无权写入/etc/resolv.conf,因此命令失败。 sudo命令永远不会看到重定向。

您需要在root帐户下执行重定向,这意味着您需要以root身份运行的shell进程。所以解决方案是:

sudo sh -c 'echo nameserver 8.8.8.8 >> /etc/resolv.conf'

这将启动一个shell作为root进程。该shell执行命令行echo nameserver 8.8.8.8 >> /etc/resolv.conf。由于你有一个执行echo和输出重定向的root shell,它应该可以工作。

(我建议您在执行此操作之前抓取/etc/resolv.conf文件的副本,以确保在意外破坏它时可以恢复。)

答案 1 :(得分:1)

第二行就是这样,

sudo sh -c "echo 'nameserver 8.8.8.8' >> /etc/resolv.conf"