ubuntu "云计算复制文件“:复制文件时权限被拒绝

yfwxisqw  于 2022-11-02  发布在  其他
关注(0)|答案(7)|浏览(233)

我很难将文件复制到我的Google计算引擎上。我在Google计算引擎上使用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].
nimxete2

nimxete21#

在示例名称前插入root@

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

vuktfyat2#

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

请注意,由于此问题与Google计算引擎虚拟机有关,因此您不能以root的身份直接通过SSH访问虚拟机,也不能以root的身份直接复制文件,原因与此相同:gcloud compute scp使用scp,而scp依赖于ssh进行身份验证。

可能的解决方案:
1.(Faizan也在注解中建议)此解决方案每次都需要两个步骤
1.使用gcloud compute scp --recurse传输用户可以写入的文件/目录,例如/tmp/home/$USER
1.通过gcloud compute ssh或通过控制台上的 SSH 按钮登录GCE虚拟机,并使用sudo进行复制以获得适当的权限:


# note: sample command; adjust paths appropriately

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

1.该解决方案是具有一些先前准备工作一个步骤:
1.一次性设置:直接给予您用户名对/var/www/html的写访问权限;这可以通过几种方式来实现;这里有一种方法:


# make the HTML directory owned by current user, recursively`

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

1.现在,您可以通过一个步骤运行复制:

gcloud compute scp --recurse \
    --zone us-central1-a \
    /Users/Bryan/Documents/Websites/gce/index.php \
    example-instance:/var/www/html
zkure5ic

zkure5ic3#

我使用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"

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

hsgswve4

hsgswve44#

我遇到了同样的问题,使用其他答案中建议的方法也没有成功。最后成功的是在复制文件时明确发送我的“用户”,如官方的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

在我的例子中,用户名是我登录谷歌云时使用的用户名。

9lowa7mx

9lowa7mx5#

更新
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

v09wglhw

v09wglhw6#

此问题的更新解决方案(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"

(or您可能需要执行的任何其他命令)
更重要的是,这还意味着我们可以使用sudo和 “cp” 复制函数将分发文件复制到最终目的地:

gcloud compute ssh user_name@instance --command "sudo cp -rlf /tmp/dist/* /var/www/html/"

这完全消除了首先通过ssh终端设置权限的需要。

p8h8hvxi

p8h8hvxi7#

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

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

这是一个通用的语法,所以如果你想把文件从你的机器复制到远程机器,你可以使用这个语法。--recurse:需要复制包含其他文件的目录
语法:gcloud compute scp 'SOURCE' 'DESTINATION'
注意:在没有超级用户的情况下运行

相关问题