Edited at

gcloud compute ssh でも tramp したい!

More than 3 years have passed since last update.


Tramp Mode について

みなさんリモートマシンのファイルを直接編集したいときは何を使っていますか? 私は Tramp Mode を使っています.いつものEmacsでリモートのファイルが編集できて本当に便利.TrampModeを使い始めてからemacs: command not found でヨヨと泣き崩れる……なんてことはなくなりました.Tramp Modeがあって本当に良かった.


gcloud compute ssh について

話は変わりますが,みなさんはGCEのインスタンスへsshでログインするときはどうしていますか? 私は gcloud compute ssh <instance name> を使っています.<instance name> だけでログインできて本当に便利.適切に設定されていれば鍵の自動配布もしてくれますから苦労がありません.gcloud コマンドがあって本当に良かった.


さて

ここからが問題です.GCE で tramp-mode を使いたいときはどうすればいいのでしょうか.gcloud compute sshssh のラッパコマンドで,裏でインスタンスのドメイン取得や鍵の選択などよしなにやってくれているわけですが,tramp-mode を使う時だってその仕組みに乗っかりたいわけです.

tramp-mode でファイルを開く際のパスを思い返してみますと, /ssh:hostname:path といった入力をすることと思います.となると当然気になるのは先頭の ssh: でして,少し調べると他にも rsyncsmb など様々なバックエンドがサポートされていることがわかります.こうなってくると直感的に独自定義の方法が追加できそうですね.gcloud compute ssh の場合はそれ自体が ssh のラッパですから,ほとんどエイリアスみたいなものでいいはずです.それではやっていきましょう.

tramp-mode の ユーザマニュアル1を開いてみますと,5.10 Using Non-Standard Methods という記述がありますからこれを読みます.すると help を開いて v キーを押下し,tramp-methods と入力して RET をキメろと言われますからその通りにします.

Screen Shot 2016-04-17 at 16.44.03.png

なにやら出てきました.良かったですね.適当によみつつスクロールしていきましょう.

Screen Shot 2016-04-17 at 16.44.38.png

おやおや,なにやら参考になりそうな感じです.恥を忍んで申し上げますと,私はEmacs Lispが書けません.なので余計なことを考えないように意識を殺して適当にinit.elへコピペしてそれらしく編集してみます.

(require 'tramp)

;; for gcloud ssh
(add-to-list 'tramp-methods
'("gcssh"
(tramp-login-program "gcloud compute ssh")
(tramp-login-args (("%h")))
(tramp-async-args (("-q")))
(tramp-remote-shell "/bin/sh")
(tramp-remote-shell-args ("-c"))
(tramp-gw-args (("-o" "GlobalKnownHostsFile=/dev/null")
("-o" "UserKnownHostsFile=/dev/null")
("-o" "StrictHostKeyChecking=no")))
(tramp-default-port 22)))

こんな感じになりました.この後適切な処置2を施し C-x f /gcssh:<instance name> と入力するとあら不思議! インスタンスのファイルを直接編集できるようになります.


課題感

default project の default zone ならこれで良いのですが,その辺りを指定する場合,つまり gcloud compute ssh --project <project id> --zone <zone> <instance name> みたいな指定で繋ぎたいときはどうしましょうね.どうしたらいいのでしょうか.教えて偉い人.

config-ssh を使えばいいのでは? という声もありますが,あれなんか ip 変わったとき追従できない気がしていて,ちゃんと試してないんですけどどういう挙動するのでしょう.気になってます.





  1. https://www.gnu.org/software/tramp/#External-methods 



  2. 設定の再読み込みとか.gcloud コマンドのパスがうまく通ってないってパタンもあるとおもいますから,よしなにやってあげてください.