28

我很难将文件复制到我的 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].
4

7 回答 7

79

root@在实例名称之前插入:

local:$ gcloud compute copy-files /Users/Bryan/Documents/Websites/gce/index.php root@example-instance:/var/www/html --zone us-central1-a
于 2015-03-27T11:05:59.020 回答
18

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

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

可能的解决方案:

  1. Faizan在评论中也建议)此解决方案每次都需要两个步骤

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

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

      # 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

于 2015-01-11T17:16:26.483 回答
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 目标目录,因为这会导致其他脚本出现其他问题......

于 2017-05-02T20:05:02.757 回答
3

我遇到了同样的问题,并且没有使用其他答案中建议的方法使其正常工作。最终奏效的是在复制文件时明确发送我的“用户”,如官方文档中所示。重要的部分是“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 时使用的用户名。

于 2018-12-03T13:06:46.990 回答
2

更新

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

于 2017-11-26T20:06:32.893 回答
2

此确切问题的更新解决方案 (2020)

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

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

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

示例时间

第一部分是将dist文件夹及其所有内容递归地复制到tmp文件夹,gloud确实可以访问该文件夹:

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 终端设置权限的需要。

于 2020-05-10T18:19:54.457 回答
-3

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

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

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

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

注意:无需root即可运行

于 2018-12-30T19:03:03.617 回答