37

Currently, if I want to execute something on a VM, I copy files over like this:

gcloud compute --project <project_id> copy-files --zone <zone_name> /home/roman/source/dir roman@<vm_name>:/some/path

Then I need to SSH into it manually like this:

gcloud compute --project <project_id> ssh --zone <zone_name> <vm_name>

And then go and run some command:

cd /some/path
python example.py

How do I combine step 2 and 3 together and execute a command remotely?

Note: I want to use gcloud or the python api. I don't want to use 3rd party packages like Fabric.

Roman
  • 8,826
  • 10
  • 63
  • 103
  • I don't think it's possible. You can maybe add some metadata to the project and get it to run automatically on instance restart. – Sridhar Aug 23 '16 at 10:40

3 Answers3

60

Try:

$ gcloud compute ssh --zone ZONE INSTANCE -- 'cd /tmp && python some.py'

From gcloud compute ssh --help:

 [-- IMPLEMENTATION-ARGS ...]
    Flags and positionals passed to the underlying ssh implementation.

    The '--' argument must be specified between gcloud specific args on the
    left and IMPLEMENTATION-ARGS on the right. Example:

        $ gcloud compute ssh example-instance --zone us-central1-a -- -vvv \
            -L 80:%INSTANCE%:80
Zachary Newman
  • 20,014
  • 4
  • 39
  • 37
51

A gcloud update that landed a week ago blocked passing ssh commands after '--' and effectively forces use of --command option for this. In this case use:

gcloud compute ssh --zone ZONE INSTANCE --command 'cd /tmp && python some.py'.

Doru C.
  • 850
  • 9
  • 7
3

Did it with a bit of a tangent; using the normal ssh client instead of gcloud compute:

ssh -i ~/.ssh/google_compute_engine roman@<vm_IP> 'python /some/path/example.py'

The gcloud ssh key is located at ~/.ssh/google_compute_engine, which it uses. It also requires the external IP address of the instance instead of its name.

Roman
  • 8,826
  • 10
  • 63
  • 103