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

时间:2015-01-06 20:55:01

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

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

7 个答案:

答案 0 :(得分:61)

在实例名称前插入root@

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

答案 1 :(得分:18)

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

注意由于此问题与Google Compute Engine虚拟机有关,因此您无法直接以root的身份直接与虚拟机进行SSH连接,也无法直接将文件复制为root,同样的原因:gcloud compute copy-files使用scp依赖ssh进行身份验证。

可能的解决方案:

  1. (评论中也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

答案 2 :(得分:2)

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

def calculate_up_eye_target(viewMat):
  eye = -viewMat[3,0:3].T
  target = eye - viewMat[0:3,2]
  up = viewMat[0:3,1]
  return up, eye, target

您还需要设置GCE_USER和GCE_INSTANCE

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

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

答案 3 :(得分: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

答案 4 :(得分:2)

I had the same problem and didn't get it to work using the methods suggested in the other answers. What finally worked was to explicitly send in my "user" when copying the file as indicated in the official documentation. The important part being the "USER@" in

gcloud compute scp [[USER@]INSTANCE:]SRC [[[USER@]INSTANCE:]SRC …] [[USER@]INSTANCE:]DEST

In my case I could initially transfer files by typing:

gcloud compute scp instance_name:~/file_to_copy /local_dir

but after I got the permission denied I got it working by instead typing:

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

where the username in my case was the one I was logged in to Google Cloud with.

答案 5 :(得分:2)

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

为了说明起见,我们必须将问题分为两个部分。 “复制文件” 命令已正式弃用,我们将使用“ 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终端设置权限的需要。

答案 6 :(得分:-3)

这对我有用:

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

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

注意:无需root即可运行