语境:
ssh
进入运行 Amazon Linux 2013.09 的 AWS t1.micro 实例,使用默认的ec2-user
。我试图列出默认 postgresql 目录的内容:
里面有什么?
$ ls /var/lib/pgsql9/
ls: cannot open directory /var/lib/pgsql9/: Permission denied
好的。这是谁的?
$ ls -l /var/lib | grep pgsql
drwx------ 4 postgres postgres 4096 Jun 22 16:06 pgsql9
啊,我真傻。
$ sudo -u postgres ls /var/lib/pgsql9/
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for ec2-user:
...什么?ec2-user
有密码?该换把大枪了。
$ sudo sudo -u postgres ls /var/lib/pgsql9/
backups data
成功! 现在,请前往 superuser.com 查明发生了什么。
为什么sudo sudo
行为与不同sudo
?
答案1
Amazon EC2 的构建方式与 Ubuntu 类似:无需root
访问,一切都已完成sudo
。
您的sudo
命令所做的是尝试模仿postgres
,需要获得这样做的权限。ec2-user
没有此权限,因此sudo
会要求输入密码(由于没有密码,因此会失败)。
当您执行 时sudo sudo
,您将以 root 身份调用第二个命令,sudo
该 root 具有模拟其他用户的权限,因此该命令有效。由于sudo
配置方式(sudoers 中的 NOPASSWD 行),它不需要密码即可以 root 身份执行。