`gcloud compute copy-files`:复制文件时权限被拒绝

Posted

技术标签:

【中文标题】`gcloud compute copy-files`:复制文件时权限被拒绝【英文标题】:`gcloud compute copy-files`: permission denied when copying files 【发布时间】:2015-03-04 14:43:20 【问题描述】:

我很难将文件复制到我的 Google Compute Engine。我在 Google Compute Engine 上使用 Ubuntu 服务器。

我在我的 OS X 终端上执行此操作,并且我已获得使用 gcloud 的授权。

local:$ gcloud compute copy-files /Users/Bryan/Documents/Websites/gce/index.php example-instance:/var/www/html --zone us-central1-a
Warning: Permanently added '<IP>' (RSA) to the list of known hosts.
scp: /var/www/html/index.php: Permission denied
ERROR: (gcloud.compute.copy-files) [/usr/bin/scp] exited with return code [1].

【问题讨论】:

您是否可以使用 gcloud compute ssh 命令从本地 OS X 机器 ssh 到您的实例? @Faizan 是的,我用过gcloud compute --project "&lt;PROJECT&gt;" ssh --zone "us-central1-a" "&lt;compute-name&gt;" sudo 添加到命令的开头是否可以正常工作? 目标目录的权限似乎有问题,我认为解决方法是将文件复制到 /tmp 中的其他位置,然后将它们复制到 /var/www/html 时你 ssh 到实例。 【参考方案1】:

在实例名称前插入root@

local:$ gcloud compute copy-files /Users/Bryan/Documents/Websites/gce/index.php root@example-instance:/var/www/html --zone us-central1-a

【讨论】:

我可以通过 ssh 进入 VM 实例,并且我使用前缀 root@,但在 gcloud compute copy-files 上仍然收到相同的错误消息。您对我在这方面的帮助有什么进一步的建议吗? 啊,还有一些证据。我不能 ssh 以 root 身份进入 VM 实例。也许将这些文件scp 放到像/tmp 这样的中间位置比尝试启用它更好。 这个答案取决于您的 SSH 访问权限是如何设置的。不允许 root 直接 SSH 的原因有很多,因此,此解决方案不适用于 root 被拒绝的情况。我能看到的唯一方法是将其分为两个步骤:1)将文件复制到 /tmp,2)通过 ssh 进入并使用系统 sudo cp 命令复制到永久位置。 @Drux, @Dave — 因为这个问题是指 Google Compute Engine,所以您不能直接以 root 的身份通过 SSH 连接到 VM,这是为了让您的 VM 更安全而设计的。请参阅my answer 了解在这种情况下该怎么做。 我会注意到在 &lt;instance-user&gt;@&lt;instance-name&gt; 的前缀是因为没有前缀 gcloud compute copy-files 默认为 &lt;local-workstation-user&gt;@&lt;instance-name&gt; ,本地用户在本地工作站上调用 gcloud 的用户名。 【参考方案2】: 推荐的答案 Google Cloud

这不起作用的原因是您的用户名没有 GCE VM 实例的权限,因此无法写入/var/www/html/

注意,由于这个问题是关于 Google Compute Engine 虚拟机的,因此您不能以 root 的身份直接通过 SSH 连接到虚拟机,也不能以 root 的身份直接复制文件,原因相同: gcloud compute copy-files 使用 scp,它依赖于 ssh 进行身份验证。

可能的解决方案:

    (也由 cmets 中的Faizan 建议)此解决方案每次都需要两个步骤

      使用gcloud compute copy-files 传输用户可以写入的文件/目录,例如/tmp/home/$USER

      通过gcloud compute ssh 或通过控制台上的SSH 按钮登录GCE VM 并使用sudo 复制以获得适当的权限:

      # note: sample command; adjust paths appropriately

      sudo cp -r $HOME/html/* /var/www/html

    此解决方案是预先进行一些准备工作的一步:

      一次性设置:直接将您的用户名写入/var/www/html;这可以通过多种方式完成;这是一种方法:

      # make the HTML directory owned by current user, recursively

      sudo chown -R $USER /var/www/html

      现在您可以一步运行副本:

      gcloud compute copy-files /Users/Bryan/Documents/Websites/gce/index.php example-instance:/var/www/html --zone us-central1-a

【讨论】:

sudo chown -R [myusername] /var/www/html 使用第三方 SFTP 工具为我工作。【参考方案3】:

我使用 bash 脚本从本地机器复制到远程 GCE 机器上的可写目录;然后使用 ssh 移动文件。

SRC="/cygdrive/d/mysourcedir"
TEMP="~/incoming"
DEST="/var/my-disk1/my/target/dir"

你还需要设置 GCE_USER 和 GCE_INSTANCE

echo "=== Pushing data from $SRC to $DEST in two simple steps"
echo "=== 1) Copy to a writable temp directoy in user home"
gcloud compute copy-files "$SRC"/*.* "$GCE_USER@$GCE_INSTANCE:$TEMP"
echo "=== 2) Move with 'sudo' to destination"
gcloud compute ssh $GCE_USER@$GCE_INSTANCE --command "sudo mv $TEMP/*.* $DEST" 

在我的情况下,我不想 chown 目标目录,因为这会导致其他脚本出现其他问题...

【讨论】:

【参考方案4】:

更新

gcloud compute copy-files弃用

改用:

$ gcloud compute scp example-instance:~/REMOTE-DIR ~/LOCAL-DIR \ --zone us-central1-a

更多信息: https://cloud.google.com/sdk/gcloud/reference/compute/scp

【讨论】:

【参考方案5】:

我遇到了同样的问题,但没有使用其他答案中建议的方法使其正常工作。最终奏效的是在复制文件时明确发送我的“用户”,如官方documentation 所示。重要的部分是

中的“USER@”
gcloud compute scp [[USER@]INSTANCE:]SRC [[[USER@]INSTANCE:]SRC …] [[USER@]INSTANCE:]DEST

在我的情况下,我最初可以通过键入以下内容来传输文件:

gcloud compute scp instance_name:~/file_to_copy /local_dir

但在我获得许可被拒绝后,我通过输入以下内容来使其工作:

gcloud compute scp my_user_name@instance_name:~/file_to_copy /local_dir

在我的案例中,用户名是我登录 Google Cloud 时使用的用户名。

【讨论】:

这是唯一对我有用的解决方案(在 user@ 的实例之前)。谢谢【参考方案6】:

针对这个确切问题的更新解决方案(2020 年)

为了说明起见,我们必须将问题分成两部分。 "copy-files" 命令已正式弃用,我们将使用 "scp",但是新旧选项都仅限于某些文件夹。

由于我们确实可以访问 /tmp 文件夹,这意味着我们可以使用首选的“scp”轻松移动我们的分发文件命令,作为暂存步骤。

更重要的是,我们还可以通过 SSH 在实例上远程执行脚本或命令,这意味着受限访问不再是问题。

示例时间

第一部分是将 dist 文件夹及其所有内容递归地复制到 gloud 确实授予访问权限的 tmp 文件夹:

gcloud compute scp --recurse dist user_name@instance:/tmp

第二部分利用了我们可以通过 ssh 远程运行命令这一事实:

gcloud compute ssh user_name@instance --command "sudo bash golive"

(或您可能需要执行的任何其他命令)

更重要的是,这也意味着我们可以使用 sudo 和 "cp" 复制功能将我们的分发文件复制到最终目的地:

gcloud compute ssh user_name@instance --command "sudo cp -rlf /tmp/dist/* /var/www/html/"

这完全不需要先通过ssh终端设置权限。

【讨论】:

【参考方案7】:

这是将文件从远程机器复制到您的机器。并确保您有 ssh 设置,因为这将使用默认的 ssh 密钥。 这对我有用:

gcloud compute scp 'username'@'instance_name':~/source_dir  /destination_dir --recurse

这是通用语法,所以如果你想将文件从你的机器复制到远程机器,你可以使用它。 --recurse : 需要复制目录和里面的其他文件

语法:gcloud compute scp 'SOURCE' 'DESTINATION'

注意:不用root运行它

【讨论】:

欢迎来到 Stack Overflow。在发布对较早问题或已接受答案的问题的答案之前,请查看已提供的答案并问自己如何添加到现有信息中。在这种情况下,您提供的信息只不过是命令行使用输出。更重要的是,@Nekroz 已经提供了它,他详细说明了为什么发布的内容是实质性的。

以上是关于`gcloud compute copy-files`:复制文件时权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

ERROR.(gcloud.compute.instance-groups.managed.rolling-action.replace)无法获取资源。(gcloud.compute.instance

ERROR.(gcloud.compute.instance-groups.managed.rolling-action.replace)无法获取资源。(gcloud.compute.instance

错误:(gcloud.compute.ssh)无法获取资源:-权限不足

Gcloud Compute - 虚拟机不断终止

Google Compute Engine:无法从 gcloud 终端查询 API

错误:(gcloud.compute.ssh)[/usr/bin/ssh] 退出并返回代码 [255]