Emacs Tramp でリモート上のファイルを直接編集する方法|Windowsにも対応

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

スポンサーリンク

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

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

  • sshでリモートにログインして、そのマシン上で編集する
  • ftp や scp で編集したいファイルをローカルへ落としてきて編集した後、ftp, scp などでリモートマシンへ転送
  • 前者は直接的な方法ですが、例えば 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つの方法を紹介します。

    PuTTY/Plink を使う

    Windows でよく使われるSSHクライアントといえば PuTTY があります。そのコマンドラインインタフェースのPlinkを使えば Emacs Tramp が動作します。

    plink は putty をインストールすれば使えるようになります。PATH を通しておくのを忘れずに。もし msys2 を使っているなら pacman でインストール可能です。使い方はsshの時とほぼ同じです。

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

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

    sshx を使う

    上記の PuTTY/Plink で問題ありませんが、インストールするのがめんどくさい、Windowsの機能だけでTrampを使いたいひとは sshx で接続するという方法が有ります。これは Windows標準の SSH を使用します。ただし制限としてパスワードでのログインができません。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でパスワード無しでログインできるか確認してください。

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

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

    /sshx:username@hostname:~/
    
    スポンサーリンク

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

  • C-x C-f の時にちょっとだけファイルの指定方法を変えるだけ
  • Windows の場合は ssh でなくsshx か plink を使う
  • sshポート番号がデフォルト22でない場合は「#」でポート番号を指定
  • root でファイルを開くときはパイプでsudoする
  • 以上、Emacs Tramp についでした。

    オートセーブの設定によっては動作が重い場合があるので、その解決法を下記に投稿しました!

    https://hangstuck.com/emacs-tramp-auto-save/

    コメント