我创建了一个全新的 Google Compute Engine VM(Debian 9),并使用 GoogleCloud shell 打开了一个 shell。我可以sudo
从该浏览器 shell 窗口访问它。
然后我设置我的 ssh 密钥并 ssh 进入虚拟机。为了便于讨论,我的用户名是“user123”。我使用以下命令 ssh 进入我的 GCP 虚拟机:
其中 1.2.3.4 是我的 GCP 外部 IP 地址。然后我登录了。
因此作为user123
用户GoogleCloudShell sudo
有效,但当通过登录时远程控制因为user123
,我被提示输入密码。
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 user123:
当然,我不想也不需要设置密码,我需要获取 sudo 以允许此user123
用户帐户使用 sudo。但登录 GoogleCloudShell 时它可以工作.... 嗯...我会追踪它,但这是我的问题。
注意:因为我有 root 权限GoogleCloudShell(通过 sudo),我应该能够找到我需要做的事情并修复它。
为了允许 sudo 在通过 ssh 登录时工作,我需要采取下一步什么?
答案1
我会给你两个答案。
首先,Cloud Shell 在后台为您管理实例元数据,并允许通过这种方式向项目中添加的所有用户使用无密码 sudo。使用 Google 设置您的用户
https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys https://cloud.google.com/compute/docs/instances/managing-instance-access
通过项目控制台添加所需的用户帐户。这会将该用户传播到项目中的所有主机。
其次,您需要设置无密码 sudo。您可以(使用 visudo)编辑 /etc/sudoers 或在 /etc/sudoers.d 下创建一个新文件并添加如下一行:
user123 ALL = (ALL) NOPASSWD: ALL
你可以看到,Google 正在通过 google-sudoers 组中的组成员身份来执行此操作
timmy@instance-1:~$ sudo cat /etc/sudoers.d/google_sudoers
%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL
timmy@instance-1:~$ id
uid=1000(timmy) gid=1001(timmy) groups=1001(timmy),4(adm),30(dip),44(video),46(plugdev),1000(google-sudoers)
答案2
创建 GCP 计算引擎后,您无需执行任何特殊操作即可让 sudo 从 ssh 运行。您显然需要使用 GCP 控制台并添加密钥,正如@TimmyBrowne 在他的帖子中提到的那样。请参阅https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys。
将您的 ssh 公钥输入到 GCP Compute Engine 实例后,您就可以通过 ssh 进入您的实例。但您需要使用正确的用户名。
例如,如果我的 GCP 用户名是 fredsmith,并且我的 GCP 外部 IP 是 5.6.7.8,那么我的 ssh 命令将如下所示:
显然,您的私有 ssh 密钥需要与您放入实例的 ssh 元数据中的公钥相匹配。
登录后,您可以运行 sudo,它可以工作,因为 GCP 已经使用您的凭据(fredsmith)设置了此实例,并将您(fredsmith)放入所需的组中,以便 sudo 可以工作,对于 GCP 来说,这似乎是 google-sudoers。
如果您想创建另一个用户并允许该用户拥有 sudo 权限,请参阅@TimmyBrowne 的回答,正如他所描述的。
我仍然不确定为什么我会得到不一致的结果,有时候我可以使用 sudo,而其他时候却不能,因为我的 authorized_keys 文件被删除了,但我没有足够的信息来进一步探究这个问题。
由于 Timmy Browne 确实按照他的理解回答了我的问题,而且似乎是正确的。我会感谢他的回答,但我想发布我的回答,以便如果其他人看到同样的行为,他们可以赞成这个答案,希望我们能找到它。