WSLはサーバー用途じゃないので、簡潔な方法でSSHの設定をします。
基本的に、レンタルサーバーにSSH接続できればOK。
過剰にセキュリティを気にしても仕方がない。

我はWSLぞ。
という気持ちで軽く。

SSHのカギを登録

まずは、レンタルサーバーでカギを発行するか、カギを登録してるのが前提。
そこの説明は省略。

ディレクトリ作成

mkdir ~/.ssh

まあ、私のような初心者が使うのはエックスサーバーでしょう。
Windowsと共有せずに、WSL専用に新たにカギを発行した方がいいらしいよ。

SSHのカギを移動

mv /mnt/c/Users/xxxxx/Downloads/xserver.key ~/.ssh/

所有者を確認

カギの所有者が自分じゃない場合は、変更。
ちなみに、私の場合は変更する必要なしだった。

chown $USER:$USER ~/.ssh/xserver.key

パーミッションの設定

# .ssh ディレクトリ自体は「自分だけが見れる・入れる」
chmod 700 ~/.ssh

# 秘密鍵(.key)は「自分だけが読める」
chmod 600 ~/.ssh/xserver.key

接続テスト

ssh -p 10022 -i ~/.ssh/xserver.key xxxxx@xxxxx.xsrv.jp

パスフレーズを設定していたら、パスフレーズを求められる。
接続できたら、configファイルを作成

~/.ssh/configファイル

Host xs
    HostName xxxxx.xsrv.jp
    User xxxxx
    Port 10022
    IdentityFile ~/.ssh/xserver.key
ssh xs

これで接続できるようになる。
パスフレーズは求められる。

.bashrcの設定

以上でSSH接続はできるようにはなる。
だがしかし、
Neovimからrsyncしようとするとエラーになる。

  • ssh-agentが起動していない
  • パスフレーズ入力へ対応していない

よく分からないけど、Neovimからは接続できない。

このままじゃNeovim上から、サクッとrsyncでアップロードができない。

せっかくWindowsからWSLに移行したのに、
これなら、面倒なままじゃねーか。

ということで、Neovim上からrsyncできるように、
.bashrcを設定していく。

.bashrc

# --- ssh-agent auto start ---
if [ -z "$SSH_AUTH_SOCK" ]; then
    eval "$(ssh-agent -s)" >/dev/null
fi

# 鍵が登録されていない場合のみ追加
ssh-add -l &>/dev/null
if [ $? -ne 0 ]; then
    ssh-add ~/.ssh/xserver.key 2>/dev/null
fi
  • [ -z "$SSH_AUTH_SOCK" ] : $SSH_AUTH_SOCKが空文字列かどうかをチェック

  • -z : “zero length”(長さゼロ)の略で、変数が空または未定義の場合にtrue

  • ssh-agent -s : ssh-agentを起動し、環境変数の設定コマンドを出力

    • 出力例: SSH_AUTH_SOCK=/tmp/ssh-xxx; export SSH_AUTH_SOCK; SSH_AGENT_PID=1234; export SSH_AGENT_PID;
  • eval : その出力をシェルコマンドとして実行(環境変数を設定)

  • >/dev/null : 出力メッセージを捨てる

  • ssh-add -l : 登録済みの鍵を一覧表示

  • $? -ne 0 : 終了コードが0以外(鍵が登録されていない)

  • 鍵が既に登録されていればssh-addを実行しない

  • 2>/dev/null の意味

    • 2> : 標準エラー出力(stderr)をリダイレクト
    • /dev/null : 何も出力しない「ゴミ箱」のような場所

これで、Neovim上からrsyncができるようになる。
何のためのSSH接続だっけ。
そう、すべてはrsyncのためです。

そのために、WindowsからWSLに移行してきたんだ。
めんどい。ほんとに、めんどい。

でも、一度設定さえ済ませれば、
Windowsよりもラクだから良しとしよう。

ちなみに、.bashrcをこのように設定しても、
Neovim上からは、:!ssh xsでSSH接続できません。

Pseudo-terminal will not be allocated because stdin is not a terminal.

rsyncは使えるので、諦めましょう。
そもそもの始まりが、
rsyncのためのWSL移行なんだから。

これでよし。

※ 全体的に環境に合わせて読み替えてほしい。
一般的な例をコピペした名残があるかもしれない。

.bashrc全体

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]; then
    PATH="$HOME/.local/bin:$PATH"
fi
export PATH

# ssh-agent auto start
if [ -z "$SSH_AUTH_SOCK" ]; then
    eval "$(ssh-agent -s)" >/dev/null
fi

# 鍵が登録されていない場合のみ追加
ssh-add -l &>/dev/null
if [ $? -ne 0 ]; then
    ssh-add ~/.ssh/xserver.key 2>/dev/null
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
    for rc in ~/.bashrc.d/*; do
        if [ -f "$rc" ]; then
            . "$rc"
        fi
    done
fi
unset rc