如何获取sudo的密码

How to get password for sudo

我正在尝试对 PostgreSQL 使用命令 sudo -i -u postgres,但 Google Compute Engine VM 要求我提供我的帐户(不是 root)的密码。

由于我从未设置过密码,而且我总是通过 SSH 密钥登录到我的服务器,所以我不确定密码是什么、如何重设密码或在哪里可以找到它。

请告诉我在哪里可以得到我的密码?

根据 https://cloud.google.com/compute/docs/instances ,

The instance creator and any users that were added using the metadata sshKeys value are automatically administrators to the account, with the ability to run sudo without requiring a password.

所以您不需要那个不存在的密码——您需要 "added using the metadata sshKeys value"!这样做的规范方式,我引用了同一页:

$ echo user1:$(cat ~/.ssh/key1.pub) > /tmp/a
$ echo user2:$(cat ~/.ssh/key2.pub) >> /tmp/a
$ gcloud compute project-info add-metadata --metadata-from-file sshKeys=/tmp/a

或者您可以将 Google 开发者控制台用于类似目的,如果您愿意,请参阅 https://cloud.google.com/compute/docs/console#sshkeys

要成为 GCE VM 上的另一个非根用户,首先通过无密码 sudo 成为 root(因为这就是 sudo 在 GCE VM 映像上的配置方式):

sudo su -

然后切换到你想成为的用户或运行一个命令作为另一种用途,例如,在你的情况下,那就是:

sudo -i -u postgres

总结

创建 VM 时,在 "Enter the entire key data" 框中指定 ssh 用户。

详情

  1. 生成 ssh 密钥对并识别 public 密钥:
    • if ssh-keygen,以“.pub”结尾的文件
    • 如果是 PuTTYgen,框中的文本 "Public key for pasting ..."

注意字段,全部一行,由空格分隔:"protocol key-blob username"。 对于用户名,您可能会找到 Windows 用户名或类似 "rsa-key-20191106" 的字符串。您将用您选择的 Linux 用户名替换该字符串。

  1. 将 public 密钥信息粘贴到 "Enter the entire key data" 框中。

  2. 将第三个字段更改为您要在 VM 上创建的实际用户。例如,如果 "gcpuser",则:

    ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAjUIG3Z8wKWf+TZQ7nVQzB4s8U5rKGVE8NAt/LxlUzEjJrhPI5m+8llLWYY2PH4atZzuIYvYR0CVWhZvZQzLQc33vDOjQohxV9Lg26MwSqK+bj6tsr9ZkMs2zqNbS4b2blGnr37+dnwz+FF7Es9gReqyPxL9bn5PU/+mK0zWMHoZSEfUkXBrgqKoMQTsYzbMERluByEpZm9nRJ6ypvr9gufft9MsWC2LPhEx0O9YDahgrCsL/yiQVL+3x00DO9sBOXxi8kI81Mv2Rl4JSyswh1mzGAsT1s4q6fxtlUl5Ooz6La693IjUZO/AjN8sZPh03H9WiyewowkhMfS0H06rtGQ== gcpuser
    
  3. 创建您的 VM。 (例如 Debian)

  4. 连接到虚拟机

    • 直接从 ssh 或 PuTTY(不是浏览器 window)
    • 使用私钥
    • 指定用户
  5. 请注意您的 public 密钥存在:

    gcpuser@instance-1:~/.ssh$ cat authorized_keys
    # Added by Google
    ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAjUIG3Z8wKWf+TZQ7nVQzB4s8U5rKGVE8NAt/LxlUzEjJrhPI5m+8llLWYY2PH4atZzuIYvYR0CVWhZvZQzLQc33vDOjQohxV9Lg26MwSqK+bj6tsr9ZkMs2zqNbS4b2blGnr37+dnwz+FF7Es9gReqyPxL9bn5PU/+mK0zWMHoZSEfUkXBrgqKoMQTsYzbMERluByEpZm9nRJ6ypvr9gufft9MsWC2LPhEx0O9YDahgrCsL/yiQVL+3x00DO9sBOXxi8kI81Mv2Rl4JSyswh1mzGAsT1s4q6fxtlUl5Ooz6La693IjUZO/AjN8sZPh03H9WiyewowkhMfS0H06rtGQ== gcpuser
    
  6. 注意你在组google-sudoers

    gcpuser@instance-1:~/.ssh$ id
    uid=1000(gcpuser) gid=1001(gcpuser) groups=1001(gcpuser),4(adm),30(dip),44(video),46(plugdev),1000(google-sudoers)
    
  7. 不用密码sudo到root

    gcpuser@instance-1:~$ sudo -i -u root
    root@instance-1:~#
    
  8. 注意 sudoers 文件:

    root@instance-1:~# cat /etc/sudoers.d/google_sudoers
    %google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL
    

结论

在 "Enter the entire key data" 中指定用户名会产生以下结果:

  1. 正在虚拟机中创建用户。
  2. 正在将密钥上传到 ~/.ssh
  3. 无密码 sudo 组的成员