netrwでリモートサーバのファイルを直接編集する(SCP/SFTP)
設定を入れていないサーバにSSHでログインして、慣れないviで最低限の編集をする、という場面があります。ローカル側のVimさえ設定してあれば、netrwのプロトコル機能でリモートのファイルをローカルの使い慣れた環境のまま直接編集できます。
目次(5項目)
| 書き方 | これだけ覚える |
|---|---|
vim scp://user@host/path | SCPでリモートファイルを開く |
vim sftp://user@host/path | SFTPでリモートファイルを開く |
:edit scp://host/path | 起動中のVimから接続する |
:Nread / :Nwrite | 今のバッファに対して部分的に読み書き |
対応プロトコル
netrwはHTTP/HTTPS、RCP/RSYNC、SSH/SCP/SFTPなど複数のプロトコルに対応していますが、実用上使う機会があるのはSSH系(SCP/SFTP)にほぼ限られます。他のプロトコルは今どき他の手段で代替できることが多いためです。ただし、リモート側でroot権限が必要な操作(sudoが必要な操作)はできない点は覚えておく必要があります。セキュリティ上rootで直接SSH接続する運用は避けたいので、この制約は実質的に許容範囲と考えられます。
ディレクトリ一覧を開く
vim scp://server1.com/
vim scp://user@server1.com/
vim sftp://user@server1.com/
ユーザー名を省略すると、接続元のアカウント名がそのまま使われます。~/.ssh/configに登録済みのホスト名も使えるので、事前にSSH接続できる状態になっていれば追加の設定は不要です。逆に言うと、netrwで開けないときはVim側を疑う前にSSH接続そのものを確認したほうが早く済みます。サーバを再構築したあとにホスト鍵の変更で接続を弾かれているようなケースは、netrwの設定をいくら見直しても解決しません。
vim scp://server1/
ファイルを直接開く
パスが分かっているファイルは、ディレクトリを経由せず直接指定して開けます。
vim scp://server1.com/.vimrc
vim sftp://server1.com/.vimrc
Vimを起動した状態から接続する
すでにVimを開いている状態からでも、同じ書式でリモートに接続できます。
:edit scp://server1/path
:Nread scp://server1/path
:Nwrite scp://server1/path
:Nread/:Nwriteはそれぞれリモートのファイルを読み込む・書き込む専用のコマンドで、現在のバッファに対して部分的に読み書きしたい場合に使います。
scp://やsftp://を頭に付けるだけでリモートファイルを編集できます。使い捨てサーバや設定未整備のサーバでの作業に向いています。
検証用に立てた設定なしのサーバで、素のviの操作感に戸惑いながら編集するよりは、と思ってscp://接続を試したところ、ローカルの補完やシンタックスハイライトがそのまま使えて驚きました。sudoが必要な設定ファイルだけは結局サーバ側で編集する必要がありましたが、それ以外の用途はほぼこれで事足りています。複数台のサーバを行き来する検証作業では、~/.ssh/configにホストをまとめて登録しておくと接続の手間がさらに減りました。
まとめ
netrwのプロトコル機能を使えば、リモートサーバの設定に依存せず、ローカルのVim環境のままリモートファイルを編集できます。root権限が必要な操作だけは別途対応が必要になる点を覚えておくと安心です。