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”(長さゼロ)の略で、変数が空または未定義の場合にtruessh-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