netrwでリモートサーバのファイルを直接編集する(SCP/SFTP)
設定を入れていないサーバにSSHでログインして、慣れないviで最低限の編集をする、という場面があります。ローカル側のVimさえ設定してあれば、netrwのプロトコル機能でリモートのファイルをローカルの使い慣れた環境のまま直接編集できます。
リモート編集はnetrwが持っている機能です。Neovim 0.13で置き換わるのはローカルのディレクトリ一覧の部分だけなので、この記事の内容は引き続き使えます。ただし入り口の見え方は変わります。Vim側は変わりません。Neovimで0.13以降を使っていて、この記事の操作が見当たらない場合は:Exploreを打つと従来どおりnetrwが開きます。詳しくはNeovim 0.13でnetrwが標準の一覧から外れる件にまとめています。
目次(9項目)
| 書き方 | これだけ覚える |
|---|---|
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にホストをまとめて登録しておくと接続の手間がさらに減りました。
接続の設定は .ssh/config が効く
netrwは自前で接続するのではなく、手元の scp や ssh を呼び出します。そのため ~/.ssh/config に書いたホストの別名・ユーザー名・鍵・ポート・踏み台の設定がそのまま使えます。
Host web1
HostName 192.0.2.10
User deploy
IdentityFile ~/.ssh/id_ed25519
ProxyJump bastion
この設定があれば vim scp://web1/etc/nginx/nginx.conf だけで開けます。URLにユーザー名やポートを書かずに済むので、打ち間違いも減ります。まず端末から ssh web1 で入れることを確かめてから、netrw側を試してください。
開けない・保存できないときに見るところ
接続はできるのに転送だけ失敗する場合、いちばん多いのが scp のプロトコル変更です。OpenSSH 9.0以降の scp は内部でSFTPを使うようになったため、SFTPを許可していない古いサーバーでは転送に失敗します。この場合は sftp:// ではなく従来の方式を強制するか、接続方法自体を変える必要があります。
もう1つは書き込み権限です。読み込めたファイルが保存できないときは、リモート側のユーザーにそのファイルへの書き込み権限がありません。netrwは sudo を挟めないので、この場合はサーバー側で権限を直すか、書き込めるパスに置き直すことになります。
パスワード認証のサーバーでは、接続のたびに入力を求められます。回数が増えるようなら鍵認証に切り替えるか、ControlMaster で接続を使い回す設定を入れると待ち時間が減ります。
この方法が向かない作業
netrw経由の編集は、開くたびにファイル全体を転送し、保存のたびに書き戻します。設定ファイル1つを直すような用途には向きますが、数MBのログを開く、複数ファイルを横断して検索する、といった作業では待ち時間が積み上がります。
プロジェクト全体を触るなら、リモートで作業するのではなく手元にcloneして編集し、結果だけを転送するほうが速く済みます。ファイルの検索を伴う作業は特に差が出るので、vimgrepでの横断検索を使いたい場面はローカルに寄せてください。
まとめ
netrwのプロトコル機能を使えば、リモートサーバの設定に依存せず、ローカルのVim環境のままリモートファイルを編集できます。root権限が必要な操作だけは別途対応が必要になる点を覚えておくと安心です。開いたあとの操作はローカルのファイルと変わらないので、分割やタブでの開き方もブックマークもそのまま使えます。