`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 sshgcloud compute --project "<PROJECT>" ssh --zone "us-central1-a" "<compute-name>"
将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 了解在这种情况下该怎么做。
我会注意到在 <instance-user>@
到 <instance-name>
的前缀是因为没有前缀 gcloud compute copy-files
默认为 <local-workstation-user>@<instance-name>
,本地用户在本地工作站上调用 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)无法获取资源:-权限不足