`gcloud compute copy-files`:复制文件时权限被拒绝
`gcloud compute copy-files`: permission denied when copying files
我很难将文件复制到我的 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].
这不起作用的原因是您的用户名在 GCE VM 实例上没有权限,因此无法写入 /var/www/html/
。
请注意,因为这个问题是关于 Google Compute Engine 虚拟机的,所以您不能通过 SSH 直接连接到虚拟机 root
,也不能复制文件直接作为 root
,出于同样的原因:gcloud compute copy-files
使用 scp
,它依赖于 ssh
进行身份验证。
可能的解决方案:
(也是Faizan在评论中提出的)这个方案每次都需要两步
使用 gcloud compute copy-files
将 files/directories 传输到您的用户可以写入的位置,例如 /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
在实例名称前插入root@
:
local:$ gcloud compute copy-files /Users/Bryan/Documents/Websites/gce/index.php root@example-instance:/var/www/html --zone us-central1-a
我使用 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 目标目录,因为这会导致其他脚本出现其他问题...
更新
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
我遇到了同样的问题,但使用其他答案中建议的方法无法解决问题。最终起作用的是在按照官方 documentation 中的指示复制文件时明确发送我的 "user"。重要的部分是
中的 "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 的用户名。
这是将文件从远程机器复制到您的机器。并确保你有 ssh 设置,因为这将使用默认的 ssh 密钥。
这对我有用:
gcloud compute scp 'username'@'instance_name':~/source_dir /destination_dir --recurse
这是通用语法,所以如果您想将文件从您的机器复制到远程机器,您可以使用它。
--recurse : 需要复制包含其他文件的目录
语法:gcloud compute scp 'SOURCE' 'DESTINATION'
注意:运行它没有root
针对此确切问题的更新解决方案 (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 终端设置权限的需要。
我很难将文件复制到我的 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].
这不起作用的原因是您的用户名在 GCE VM 实例上没有权限,因此无法写入 /var/www/html/
。
请注意,因为这个问题是关于 Google Compute Engine 虚拟机的,所以您不能通过 SSH 直接连接到虚拟机 root
,也不能复制文件直接作为 root
,出于同样的原因:gcloud compute copy-files
使用 scp
,它依赖于 ssh
进行身份验证。
可能的解决方案:
(也是Faizan在评论中提出的)这个方案每次都需要两步
使用
gcloud compute copy-files
将 files/directories 传输到您的用户可以写入的位置,例如/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
在实例名称前插入root@
:
local:$ gcloud compute copy-files /Users/Bryan/Documents/Websites/gce/index.php root@example-instance:/var/www/html --zone us-central1-a
我使用 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 目标目录,因为这会导致其他脚本出现其他问题...
更新
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
我遇到了同样的问题,但使用其他答案中建议的方法无法解决问题。最终起作用的是在按照官方 documentation 中的指示复制文件时明确发送我的 "user"。重要的部分是
中的 "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 的用户名。
这是将文件从远程机器复制到您的机器。并确保你有 ssh 设置,因为这将使用默认的 ssh 密钥。 这对我有用:
gcloud compute scp 'username'@'instance_name':~/source_dir /destination_dir --recurse
这是通用语法,所以如果您想将文件从您的机器复制到远程机器,您可以使用它。 --recurse : 需要复制包含其他文件的目录
语法:gcloud compute scp 'SOURCE' 'DESTINATION'
注意:运行它没有root
针对此确切问题的更新解决方案 (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 终端设置权限的需要。