命令行中如何管理密码

有些命令需要管理员权限才能执行,也就是 sudo <command>,这需要我们输入密码。偶尔输入一次没有问题,但频繁输入的话就会促使我们思考:“有没有办法自动输入密码?”

方案大概有三种,以 networksetup 这个需要 sudo 权限来执行的命令为例来讲解。墙裂建议不知道这个命令作用的同学看下 我是如何利用它实现代理的快速切换的。

编辑 sudoers 权限

不知道有没有读者思考过这个问题:

执行 sudo 命令获取的是 root 权限,但为什么输入的是当前用户的密码,而不是 root 密码呢?

实际上,sudo 可以理解为当前用户临时化身为 root 并执行某个命令,至于这个角色转变能不能发生,是在 /etc/sudoers 文件中规定的。我们输入密码仅仅是证明:“我确实是 xxx 用户” 而已。

编辑这个文件不能直接用 vim 命令,而是用 sudo visudo,文件中有很多注释,我们先不用管,只看 User specification 这一节:

我们看到这一行,有一个 root 和三个 ALL

  • root ALL = (ALL) ALL

它的意思是说 root 用户可以在所有终端以所有用户的身份执行所有命令。

类似的,下一行中我的账户被定义为不需要密码就可以执行 /usr/sbin/networksetup 命令,如果想允许自己不用密码执行任何命令,可以写成:

  • zxy ALL=(ALL) NOPASSWD: ALL

需要提醒的是,在 Linux 上配置到此就结束了。但在新的 Mac 系统上(至少 10.12 以后是这样)我们还需要关闭 SIP 才能使 sudoers 文件的配置生效。

利用 sudo 的参数

通过 man sudo 可以看到,它的 -S 参数能够从标准输入中读取密码,和 Linux 不同的是,密码必须以换行符结尾。举例说明下:

```shell

top Created with Sketch.