web-dev-qa-db-fra.com

`gcloud compute copy-files`: autorisation refusée lors de la copie de fichiers

J'ai du mal à copier des fichiers sur mon Google Compute Engine. J'utilise un serveur Ubuntu sur Google Compute Engine.

Je le fais depuis mon terminal OS X et je suis déjà autorisé à utiliser 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].
22
bryan

insérer root@ avant le nom de l'instance:

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

La raison pour laquelle cela ne fonctionne pas est que votre nom d'utilisateur n'a pas d'autorisations sur l'instance GCE VM et ne peut donc pas écrire dans /var/www/html/.

Notez que puisque cette question concerne les machines virtuelles de Google Compute Engine, vous ne pouvez pas SSH directement vers un VM as root, vous ne pouvez pas non plus copier des fichiers directement en tant que root, pour la même raison: gcloud compute copy-files utilise scp qui s'appuie sur ssh pour l'authentification.

Solutions possibles:

  1. (également suggéré par Faizan dans les commentaires) cette solution nécessitera deux étapes à chaque fois

    1. utilisation gcloud compute copy-files pour transférer des fichiers/répertoires dans lesquels votre utilisateur peut écrire, par exemple, /tmp ou /home/$USER

    2. connectez-vous au GCE VM via gcloud compute ssh ou via le bouton [~ # ~] ssh [~ # ~] sur la console et copiez à l'aide de Sudo pour obtenir les autorisations appropriées:

      # note: sample command; adjust paths appropriately

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

  2. cette solution est une étape avec un travail de préparation préalable:

    1. configuration unique: donnez à votre nom d'utilisateur un accès en écriture à /var/www/html directement; cela peut se faire de plusieurs manières; voici une approche:

      # make the HTML directory owned by current user, recursively

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

    2. vous pouvez maintenant exécuter la copie en une seule étape:

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

18
Misha Brukman

J'utilise un script bash pour copier de ma machine locale vers un répertoire accessible en écriture sur la machine GCE distante; puis en utilisant ssh déplacer les fichiers.

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

Vous devez également définir GCE_USER et 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" 

Dans mon cas, je ne veux pas afficher le répertoire cible car cela provoque d'autres problèmes avec d'autres scripts ...

2
Dr. Max Völkel

J'ai eu le même problème et je ne l'ai pas fait fonctionner en utilisant les méthodes suggérées dans les autres réponses. Ce qui a finalement fonctionné, c'est d'envoyer explicitement mon "utilisateur" lors de la copie du fichier comme indiqué dans la documentation officielle . La partie importante étant le "USER @" dans

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

Dans mon cas, j'ai pu initialement transférer des fichiers en tapant:

gcloud compute scp instance_name:~/file_to_copy /local_dir

mais après avoir obtenu l'autorisation refusée, je l'ai fait fonctionner en tapant à la place:

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

où le nom d'utilisateur dans mon cas était celui avec lequel j'étais connecté à Google Cloud.

2
Nekroz

MISE À JOUR

gcloud compute copy-files est obsolète .

Utilisez plutôt:

$ gcloud compute scp example-instance:~/REMOTE-DIR ~/LOCAL-DIR \ --zone us-central1-a

Plus d'informations: https://cloud.google.com/sdk/gcloud/reference/compute/scp

2
Victor