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 ssh
は ssh
のラッパコマンドで,裏でインスタンスのドメイン取得や鍵の選択などよしなにやってくれているわけですが,tramp-mode
を使う時だってその仕組みに乗っかりたいわけです.
tramp-mode
でファイルを開く際のパスを思い返してみますと, /ssh:hostname:path
といった入力をすることと思います.となると当然気になるのは先頭の ssh:
でして,少し調べると他にも rsync
や smb
など様々なバックエンドがサポートされていることがわかります.こうなってくると直感的に独自定義の方法が追加できそうですね.gcloud compute ssh
の場合はそれ自体が ssh
のラッパですから,ほとんどエイリアスみたいなものでいいはずです.それではやっていきましょう.
tramp-mode の ユーザマニュアル1を開いてみますと,5.10 Using Non-Standard Methods という記述がありますからこれを読みます.すると help を開いて v
キーを押下し,tramp-methods
と入力して RET
をキメろと言われますからその通りにします.
なにやら出てきました.良かったですね.適当によみつつスクロールしていきましょう.
おやおや,なにやら参考になりそうな感じです.恥を忍んで申し上げますと,私は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 変わったとき追従できない気がしていて,ちゃんと試してないんですけどどういう挙動するのでしょう.気になってます.
-
設定の再読み込みとか.gcloud コマンドのパスがうまく通ってないってパタンもあるとおもいますから,よしなにやってあげてください. ↩