今回は Emacs の Trampという機能についてです。これを使えば使いなれたローカルのEmacs 環境からリモートのファイルを直接編集できます!


リモート上のファイルをローカルの Emacs で編集したい

リモートで他のマシン上のファイルを編集をするとき、どのようにしていますでしょうか?例えば下記の2つの方法が考えられますね。

  • sshでリモートにログインして、そのマシン上で編集する
  • ftpscp で編集したいファイルをローカルへ落としてきて編集した後、ftp, scp などでリモートマシンへ転送

前者は直接的な方法ですが、例えば Emacsが普段使用してない設定だったりで何かと面倒です。 数行変える程度なら我慢できますが、使い慣れていない設定のEmacs はストレスが溜まります。 C-hでヘルプが出てきたりしたら殺意すらおぼえますね。

vinano? 起動したら最後、終了させることもママなりません。 後者は使いなれたローカルの環境で編集できるというメリットがありますが、いちいちリモートからファイルを落としてきたりアップしたりとするのが面倒です。 うっかりするとそのうちローカルとリモートと、どちらが最新のファイルかわからなくなったりします。

Emacs Tramp を使おう

そこで Emacs の Tramp機能の出番です!使い方は至極簡単です。いつも通りC-x C-fでファイルを開くときに、

1
/ssh:username@hostname:/path/to/file

とするだけです。これでローカルの Emacs上から直接リモートのファイルを編集できます! もちろんリモートマシンのホスト名のところはIPアドレスでも OK です。

ファイル名のところは ~/hoge.cのようにホームディレクトリからの相対パスも使えます。 また、リモート上のファイルの場所を覚えていない場合、ファイル名を指定せずにディレクトリ名だけ指定すればdired が開きますので、そこからファイルを選択すれば OKです。 例えばユーザ名が tarou ホスト名が remotehost で、ホームディレクトリを diredで開く場合は下記のようにします。

1
/ssh:tarou@remotehost:~/

下記のようにすればホームディレクトリ直下のhoge.cが直接開きます。

1
/ssh:tarou@remotehost:~/hoge.c

また、 sshconfig設定がしてあればもっと便利です。たとえば下記のように設定しておいたとします。

1
2
3
4
5
6
$ cat .ssh/config
Host xserver
Hostname svNNNNN.xserver.jp
User hangstuck
Port 10022
IdentityFile ~/.ssh/id_rsa

これならいちいち/ssh:hangstuck@svNNNNN.xserver.jp:~/.bashrcとせずとも/ssh:xserver:~/.bashrcでアクセスできます。便利。

Windows の場合の注意点

ただし Windows 環境の場合は注意が必要です。Windows の場合は ssh ではTrampが動作しません。ここでは2つの方法を紹介します。

sshx を使う

以前は Windowsでは PuTTY/Plink が一般的でしたが、いまはWindows標準のsshx が使えます。 PuTTY/Plinkインストールするのがめんどくさい、Windowsの機能だけでTrampを使いたいひとはsshxがおすすめです。

ただし制限としてパスワードでのログインができません。 SSH鍵でのログインになります。公式のマニュアルにも 「Note that sshx does not bypass authentication questions.」と記載があります。

念のため、鍵の生成の方法を書いておきます。すでに作成済みなら飛ばしてOKです。 サーバ側にて ssh-keygen コマンドで作成します。下記では暗号方式に RSA を指定しています。 途中でパスフレーズを聞かれますがよくわからなければ空のままでも作成できます。 鍵は~/.ssh/ ディレクトリ以下に作られます。 id_rsaが秘密鍵、id_rsa.pubが公開鍵です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/shinya/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/shinya/.ssh/id_rsa
Your public key has been saved in /home/shinya/.ssh/id_rsa.pub
The key fingerprint is:
(略)

$ ls .ssh/
id_rsa  id_rsa.pub

公開鍵をauthorized_keysに追加します。これでサーバ側の設定はOKです。

1
2
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

次にクライアント側のWindowsの設定です。先程サーバで作成した秘密鍵 id_rsaC:\Users\username\.ssh\ に置きます。 usernameのところはご自身のユーザ名に置き換えてください。

次に ssh-agentエージェントサービスを起動させます。まずサービスの管理画面を開きます。 「スタートメニュー」→「Windows管理ツール」→「サービス」とたどってください。

すると下記のようなウィンドウが開きます。その中から「OpenSSH Authentication Agent」 を探してください。

Windowsサービス管理画面でOpenSSH Authentication Agentを検索

「OpenSSH Authentication Agent」を見つけたらそれを右クリックして「プロパティ」を選択してください。すると下記のウィンドウが開きます。 そこで「全般タブ」の「スタートアップの種類」を「自動」に設定しOKをクリックしてください。

OpenSSH Authentication Agentのスタートアップの種類を自動に設定

再度「OpenSSH Authentication Agent」を探して右クリックし「開始」をクリックしてください。下図を参考にしてください。 これでssh-agent エージェントが使えるようになります。

OpenSSH Authentication Agentを右クリックして開始する

次に PowerShell を起動してください。そして下記のように ssh-add に秘密鍵を渡してください。 これで鍵でSSHにログインできるようになりました。

1
2
PS C:\Users\username> ssh-add .\.ssh\id_rsa
Identity added: .\.ssh\id_rsa (.\.ssh\id_rsa)

ここで一度SSHでパスワード無しでログインできるか確認してください。 これをやらないとなぜかTrampがこけます。一度だけ、明示的にssh.exe でログインしておいてください

1
2
3
PS C:\Users\username> ssh.exe username@hostname
Last login: Fri Oct 28 00:43:08 2022 from hoge
[username:~]$

これで準備は完了です。下記のように sshx でTrampが使えるようになっているはずです。

1
/sshx:username@hostname:~/

以前から Windows でよく使われるSSHクライアントといえばPuTTYがあります。 そのコマンドラインインタフェースのPlinkを使えばEmacs Tramp が動作します。 plink はputtyをインストールすれば使えるようになります。 PATHを通しておくのを忘れずに。

1
/plink:username@hostname:/path/to/file

最初が違うだけですね。あとは ssh のときと同様です。

ssh のポート番号がデフォルトの22でない場合

基本的にこれで事足りるかと思いますが、時々、sshのポートがデフォルトの22でないマシンがあります。 セキュリティ上、あえてデフォルトから変えているわけですね。

例えば今現在わたしが使っているエックスサーバー(xserver) はポート番号は22でなく10022です。こういう場合、ポート番号を明示的に指定してあげる必要があります。その方法は下記の通りです。

1
/ssh:username@hostname#port:/path/to/file

ホスト名の後にポート番号を書きます。例えばsshのポート番号が10022の場合は下記のようになります。

1
/ssh:tarou@remotehost#10022:~/

rootでファイルを開きたい場合

普通に一般ユーザでファイルを開く方法は上記に述べた通りです。ですがroot権限でファイルを開きたいときがありますよね? その場合の方法を下記に書きます。やり方は簡単で、パイプでsudoに渡すだけです。

1
/ssh:username@hostname|sudo:hostname:/path/to/file

まとめ

Emacs Trampを使って、ローカルから直接リモート上のファイルを編集する方法をご紹介しました。 ザクッとポイントをまとめると下記の通りです。簡単。

  • C-x C-f のときにちょっとだけファイルの指定方法を変えるだけ
  • Windows の場合は ssh でなく sshxplink を使う
  • sshポート番号がデフォルト22でない場合は「#」でポート番号を指定
  • root でファイルを開くときはパイプで\sudo\する

以上、Emacs Tramp についでした。

Note

オートセーブの設定によっては動作が重い場合があるので、その解決法をWindows & Emacs Tramp でオートセーブに失敗するときの対処法に記載しました!