如何以超级用户身份从Cloud Shell复制文件至虚拟机并解决权限报错
解决Google Cloud Shell向虚拟机受保护目录复制文件的权限问题
看起来你遇到了路径错误+权限不足的双重问题,才导致了Permission denied的报错。我来一步步帮你搞定:
1. 先修正远程路径的错误
你之前的命令里写的lampstack-vm:~/opt/bitnami/apache2/htdocs/file.php有个小问题:~/代表的是虚拟机普通用户的家目录,所以这个路径实际指向的是/home/你的用户名/opt/...,而不是系统根目录下的/opt/bitnami/...。正确的远程路径应该去掉~/,写成:lampstack-vm:/opt/bitnami/apache2/htdocs/file.php
2. 解决受保护目录的权限问题
/opt/bitnami/apache2/htdocs是系统级的受保护目录,普通用户没有直接写入的权限,必须借助sudo来完成操作。这里有两种常用方案:
方法一:先复制到家目录,再用sudo移动
这种方式更直观,适合新手操作:
- 第一步:先把文件复制到虚拟机的普通用户家目录(这一步你已经成功过):
gcloud compute scp --project "[MY PROJECT ID]" ~/file.php lampstack-vm:~/file.php - 第二步:登录到虚拟机:
gcloud compute ssh --project "[MY PROJECT ID]" lampstack-vm - 第三步:用sudo把文件复制到目标目录,顺便调整权限确保Web服务能访问:
sudo cp ~/file.php /opt/bitnami/apache2/htdocs/file.php # 可选:适配Bitnami环境的权限设置 sudo chown bitnami:daemon /opt/bitnami/apache2/htdocs/file.php
方法二:直接通过SSH管道写入(一步到位)
如果不想分步骤操作,可以用gcloud compute ssh结合sudo tee直接把文件内容写入目标目录,省去中间复制到家目录的步骤:
gcloud compute ssh --project "[MY PROJECT ID]" lampstack-vm --command "sudo tee /opt/bitnami/apache2/htdocs/file.php > /dev/null" < ~/file.php
这里tee命令会以root权限写入文件,> /dev/null是为了避免在终端输出文件内容。
补充:为什么之前会报错?
你看到的Permission denied (publickey)其实可能是因为远程路径不存在(你写的~/opt在虚拟机里根本没有这个目录),加上后续的权限限制,才触发了连接断开的错误。修正路径+配合sudo就能彻底解决问题啦。
内容的提问来源于stack exchange,提问作者Alfredo Cely




