【问题标题】:`gcloud compute copy-files`: permission denied when copying files`gcloud compute copy-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 到实例。

标签: linux ubuntu permissions google-compute-engine gcloud


【解决方案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 进行身份验证。

可能的解决方案:

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

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

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

      # note: sample command; adjust paths appropriately

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

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

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

      # make the HTML directory owned by current user, recursively

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

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

      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 已经提供了它,他详细说明了为什么发布的内容是实质性的。
        猜你喜欢
        • 2018-11-16
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 2015-12-06
        相关资源
        最近更新 更多