今回は Emacs の Tramp という機能についてです。これを使えば使いなれたローカルの Emacs 環境からリモートのファイルを直接編集できます!
リモート上のファイルをローカルの Emacs で編集したい!
リモートで他のマシン上のファイルを編集をするとき、どのようにしていますでしょうか?例えば下記の2つの方法が考えられますね。
前者は直接的な方法ですが、例えば Emacs が普段使用してない設定だったりで何かと面倒です。数行変える程度なら我慢できますが、使い慣れていない設定の Emacs はストレスが溜まります。C-h でヘルプが出てきたりしたら殺意すらおぼえますね。vi?nano?起動したら最後、終了させることもママなりません。
後者は使いなれたローカルの環境で編集できるというメリットがありますが、いちいちリモートからファイルを落としてきたりアップしたりとするのが面倒です。うっかりするとそのうちローカルとリモートと、どちらが最新のファイルかわからなくなったりします。
Emacs Tramp を使おう!
そこで Emacs の Tramp 機能の出番です!使い方は至極簡単です。いつも通りC-x C-f でファイルを開くときに、
/ssh:username@hostname:/path/to/file
とするだけです。これでローカルの Emacs 上から直接リモートのファイルを編集できます!もちろんリモートマシンのホスト名のところは IPアドレスでも OK です。ファイル名のところは ~/hoge.c のようにホームディレクトリからの相対パスも使えます。また、リモート上のファイルの場所を覚えていない場合、ファイル名を指定せずにディレクトリ名だけ指定すれば dired が開きますので、そこからファイルを選択すれば OKです。
例えば ユーザ名が tarou、ホスト名が remotehost で、ホームディレクトリを dired で開く場合は下記のようにします。
/ssh:tarou@remotehost:~/
下記のようにすればホームディレクトリ直下のhoge.cが直接開きます。
/ssh:tarou@remotehost:~/hoge.c
また、 ssh の config 設定がしてあればもっと便利です。たとえば下記のように設定しておいたとします。
$ 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が公開鍵です。
$ 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です。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys
次にクライアント側のWindowsの設定です。先程サーバで作成した秘密鍵 id_rsa を C:\Users\username\.ssh\
に置きます。username のところはご自身のユーザ名に置き換えてください。
次に ssh-ad エージェントサービスを起動させます。まずサービスの管理画面を開きます。「スタートメニュー」→「Windows 管理ツール」→「サービス」とたどってください。すると下記のようなウィンドウが開きます。その中から「OpenSSH Authentication Agent」 を探してください。
「OpenSSH Authentication Agent」 を見つけたらそれを右クリックして「プロパティ」を選択してください。すると下記のウィンドウが開きます。そこで「全般タブ」の「スタートアップの種類」を「自動」に設定しOKをクリックしてください。
再度「OpenSSH Authentication Agent」を探して右クリックし「開始」をクリックしてください。下図を参考にしてください。これでssh-adエージェントが使えるようになります。
次に PowerShell を起動してください。そして下記のように ssh-add に秘密鍵を渡してください。これで鍵でSSHにログインできるようになりました。
PS C:\Users\username> ssh-add .\.ssh\id_rsa Identity added: .\.ssh\id_rsa (.\.ssh\id_rsa)
ここで一度SSHでパスワード無しでログインできるか確認してください。これをやらないとなぜかTrampがこけます。一度だけ、明示的に ssh.exe でログインしておいてください
PS C:\Users\username> ssh.exe username@hostname Last login: Fri Oct 28 00:43:08 2022 from hoge [username:~]$
これで準備は完了です。下記のように sshx で Trampが使えるようになっているはずです。
/sshx:username@hostname:~/
PuTTY/Plink を使う
以前から Windows でよく使われるSSHクライアントといえば PuTTY があります。そのコマンドラインインタフェースのPlinkを使えば Emacs Tramp が動作します。
plink は putty をインストールすれば使えるようになります。PATH を通しておくのを忘れずに。もし msys2 を使っているなら pacman でインストール可能です。使い方はsshの時とほぼ同じです。
/plink:username@hostname:/path/to/file
最初が違うだけですね。あとは ssh の時と同様です。
ssh のポート番号がデフォルトの22でない場合
基本的にこれで事足りるかと思いますが、時々、ssh のポートがデフォルトの22でないマシンがあります。セキュリティ上、あえてデフォルトから変えているわけですね。例えば今現在わたしが使っているエックスサーバー(xserver)
はssh ポート番号は22でなく10022です。こういう場合、ポート番号を明示的に指定してあげる必要があります。その方法は下記の通りです。
/ssh:username@hostname#port:/path/to/file
ホスト名の後にポート番号を書きます。例えばsshのポート番号が10022の場合は下記のようになります。
/ssh:tarou@remotehost#10022:~/
rootでファイルを開きたい場合
普通に一般ユーザでファイルを開く方法は上記に述べた通りです。root権限でファイルを開きたいときがありますよね?
その場合の方法を下記に書きます。やり方は簡単で、パイプでsudoに渡すだけです。
/ssh:username@hostname|sudo:hostname:/path/to/file
まとめ
Emacs Tramp を使って、ローカルから直接リモート上のファイルを編集する方法をご紹介しました。ザクッとポイントをまとめると下記の通りです。簡単。
以上、Emacs Tramp についでした。
オートセーブの設定によっては動作が重い場合があるので、その解決法を下記に投稿しました!
コメント