web-dev-qa-db-ja.com

`gcloud compute copy-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].
22
bryan

挿入root@インスタンス名の前:

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

これが機能しないのは、ユーザー名にGCE VMインスタンスに対するアクセス許可がないため、/var/www/html/に書き込むことができないためです。

この質問はGoogle Compute Engine VMに関するものであるため、直接VM as rootとして、または同じ理由で、rootとしてファイルを直接コピーできますか?gcloud compute copy-filesは、scpを認証に使用するsshを使用します。

可能な解決策:

  1. (コメントで Faizan も提案)このソリューションは毎回2つのステップを必要とします

    1. gcloud compute copy-files を使用して、ユーザーが書き込み可能なファイル/ディレクトリを転送します(例:/tmpまたは/home/$USER

    2. gCEへのログインVM via gcloud compute ssh または[〜#〜] ssh [〜#〜]コンソールのボタンをクリックし、Sudoを使用してコピーして適切な権限を取得します。

      # note: sample command; adjust paths appropriately

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

  2. このソリューションは、いくつかの事前準備作業の1ステップです。

    1. ワンタイムセットアップ:ユーザー名に/var/www/htmlへの書き込みアクセス権を直接付与します。これはいくつかの方法で実行できます。ここに一つのアプローチがあります:

      # make the HTML directory owned by current user, recursively

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

    2. これで、コピーを1ステップで実行できます。

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

18
Misha Brukman

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したくありません...

2
Dr. Max Völkel

私は同じ問題を抱えていましたが、他の回答で提案された方法を使用しても機能しませんでした。最終的に機能したのは、公式の 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にログインしたときに使用したユーザー名です。

2
Nekroz

更新

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

2
Victor