在两个主机文件之间切换的简单命令

在两个主机文件之间切换的简单命令

我正在使用 /etc/host 将 localhost 映射到 Web 域。我想要一种快速的方法来做到这一点,而不是每次都搜索和替换。我把它放在我的 .bashrc 文件中。

alias hostchange='
nowdir=$PWD;
cd /etc;
mv hosts hoststempname;
mv hostssecondary hosts;
mv hoststempname hostssecondary;
cd $nowdir'

我收到此错误,无论 y 或 n 都不会进展。

mv: rename hosts to hoststempname: Permission denied
override rw-r--r--  root/wheel for hosts? (y/n [n]) 

我通过添加 sudo 让它工作。

alias hostchange='
nowdir=$PWD;
cd /etc;
sudo mv hosts hoststempname;
sudo mv hostssecondary hosts;
sudo mv hoststempname hostssecondary;
cd $nowdir'

这是合法的吗?我是在黑暗中开枪吗?

答案1

你走在正确的轨道上!对此有一些评论。通常更好的做法是将这样的多行操作留给函数。我可能会这样写:

change_etc_hosts_file() {
  set -e # stop running if we encounter an error
  sudo \mv -f /etc/hosts /etc/hoststempname
  sudo \mv -f /etc/hostssecondary /etc/hosts
  sudo \mv -f /etc/hoststempname /etc/hostssecondary
  set +e
}
alias changehosts=change_etc_hosts_file

您会注意到我还使用了绝对路径而不是更改目录。这通常是一个更好的主意(使用绝对路径)。如果您确实想继续使用亲戚,那么通常最好在子 shell 中执行此操作,这样您就不必处理将目录更改回 $PWD (如果您中止,将使您处于奇怪的状态)。要将其作为子 shell 执行,它将如下所示:

change_etc_hosts_file() {
  ( # use subshell
    cd /etc
    set -e # stop running if we encounter an error
    sudo \rm -f hoststempname # the \ escapes aliases which might cause prompting
    sudo \cp -f hosts hoststempname
    sudo \cp -f hostssecondary hosts
    sudo \cp -f hoststempname hostssecondary
  )
}

cd 发生在 () 内,这是一个新进程,因此它不会影响您当前的工作目录。

答案2

你对这个命令有疑问的事实sudo表明,不知怎的,你在 Unix 世界中生存至今,却没有掌握有关 unix 用户概念的基本知识(尤其)。虽然这种情况对我来说是不可理解的,但你的问题和评论清楚地表明了情况就是如此。

是的,你所取得的成果sudo正是你所期望的。这是因为:

  • 在 Unix 系统上,有许多系统用户- 你可以称它们为“虚拟”(这些是不是被误认为是人类计算机用户)。
  • 每个文件和目录都有它的所有者,它始终是(虚拟)用户之一。
  • 用户,称为超级用户是每个 Unix 都必须拥有的特殊系统帐户。他可以做任何事情——拥有系统的全部权力。
  • sudo是一个用于临时利用“普通”用户权限的命令以便可以执行一些特殊任务。

请进一步阅读sudo关于这些示例站点上的root和文件权限:1,2,3,4,5,6

相关内容