🐧

Ubuntu / WSL Ubuntu 版 ssh:Linux 使い(略)Advent Calendar 2024

2024/12/07に公開

はじめに

これは「Linux 使いになりたい人のための Advent Calendar 2024」の記事です。

筆者は、Web エンジニアを志望する人には、セルフホスト Git サービスを稼働させて利用することをオススメしています。もし Git を使ったことがないなら、Git を学ぶときに、セルフホスト Git サービスを稼働させることも視野に含めながら学習するのが効率的だと考えています。

Ubuntu / WSL Ubuntu 版 ssh

前回はセルフホスト Git サービスを使うにあたり、OpenSSH を使うことが多いといった説明の流れから、Windows 用の OpenSSH クライアントアプリについて紹介をしました。

今回は Ubuntu や WSL Ubuntu で ssh コマンドを使うときによく使っているものを紹介します。

openssh-client

Ubuntu / WSL Ubuntu で ssh コマンドを使うには、APT の openssh-client パッケージをインストールするのが普通です。

sudo apt -y install openssh-client

このパッケージでインストールされる実行ファイルで /usr/bin に置かれるものは、次のようにして確認することができます。

# dpkg -L openssh-client | grep -e "^/usr/bin"
/usr/bin
/usr/bin/scp
/usr/bin/sftp
/usr/bin/ssh
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-argv0
/usr/bin/ssh-copy-id
/usr/bin/ssh-keygen
/usr/bin/ssh-keyscan
/usr/bin/slogin

結果をみるとわかるように、リモートシェル用の ssh 以外に、ファイル転送用の sftpscp、パスフレーズ入力を簡易化するためのエージェント機能を提供する ssh-agent、エージェント機能用に使う秘密鍵の追加ができる ssh-add が含まれています。

ssh-copy-id は、SSH 用の公開鍵をリモートマシンへ転送して登録するときに便利なコマンドです。ssh-keygenssh-keyscan は SSH 用の鍵に関する処理で使えるコマンドです。

slogin コマンドは ssh コマンドへのシンボリックリンクなので、ssh コマンドと同じ機能を提供するコマンドです。

# ls -l /usr/bin/slogin 
lrwxrwxrwx 1 root root 3 Jun 26 13:11 /usr/bin/slogin -> ssh

ssh-argv0 コマンドは自分は使ったことがありません。ヘルプを見ると、古いシステムやスクリプトを使っているときに役に立つコマンドのようです。

dnf や apk

Ubuntu / WSL Ubuntu 以外でのインストール方法も確認しておきましょう。ここでは root ユーザーでインストールする前提としてありますが、一般ユーザーを使う場合は sudo 権限のあるユーザーで sudo コマンドを使って、各コマンドを実行する必要があります。

REHL 系の Alma Linux や Rocky Linux では dnf コマンドを使って openssh-clients パッケージをインストールします。こちらは s が最後についています。

dnf install -y openssh-clients

Docker を使っていると、お世話になることが多い Alpine では apk コマンドを使って openssh-client パッケージをインストールします。

apk add openssh-client

tmux

さて、ここで、リモート作業をするときは、作業中にネットワーク回線が切れてしまうときのことも考慮が必要になります。

コマンド単位で対策する場合は nohup コマンドというものがありますが、リモート作業中にいちいち nohup コマンドをつけてコマンド実行するのは大変です。

そういった作業時によく使われるものに tmux コマンドというものがあります。

これは、端末多重接続ソフトウェアで、単一のウィンドウで複数の端末セッションを利用することができます。tmux を使うと、端末用のプロセスを起動して、リモート作業用の SSH セッション用プロセスと分離させて動かすことができます。つまり、リモートシェル用のプロセスと、リモート通信用のプロセスを別々にすることができます。

そのため、リモート作業の途中で完了するまで長い時間が必要な処理を実行した場合でも、それを動かしている tmux のプロセスからデタッチして、SSH 接続を切断し、処理が完了した頃に SSH 接続を再開してから tmux のプロセスへアタッチして、作業を再開するといったことができます。

これを使うと、突然の通信断があっても、リモートで実行している tmux のプロセスが停止しなければ、サーバー処理が停止せずに済むので重宝しています。たとえば、パッケージアップデートなどの作業をしている最中に、通信断で処理が中途半端な状態で終わると、環境を修復するのが大変になりますが、これを使っていれば、そういった心配がありません。

Ubuntu / WSL Ubuntu では tmux というパッケージをインストールすると使えるようになります。

sudo apt -y isntall tmux

なお、1つの端末画面内で、複数の端末画面を表示させたり、切り替えができたりするのも便利です。GUI を使っていると感謝することはあまりないかもしれませんが、リモート接続をしてターミナル内での作業をしているときに複数のターミナルが欲しいときに、ものすごくありがたいと感じる機能です。

Byobu

tmux をより使いやすくしたソフトウェアに Byobu というものがあります。Byobu をインストールすると tmux もインストールされて、Byobu の裏側で tmux が動作します。筆者も tmux をそのまま使うのではなく、Byobu を使うことが多いです。

Ubuntu / WSL Ubuntu では byobu というパッケージをインストールすると使えるようになります。

sudo apt -y isntall byobu

起動後の画面表示において、Byobu の方がステータスバー表示が充実していて、キーバインドのプレフィックスが tmux のような Ctrl + b ではなく、F12 を使うので個人的には使いやすい印象です。

とはいえ、ファンクションキーが使いにくいキーボードだと F12 の入力がしにくくなるので、ノートパソコンでは tmux を使うことも多いです。また、Byobu は tmux へプログラムを追加したものなので、軽量構成にしたいサーバーだと tmux だけインストールとなることもあり、必ずしも Byobu が使えるとは限らないということもあります。

autossh

サーバーを運用していると、定常的に SSH 接続でポートフォワードを有効化しておくことがあります。そういった場合は autossh を使うと設定や復旧処理が楽になります。

サーバー間で暗号化通信路を確率するには SSL 通信路を使えば良いのですが、サーバー証明書を必要とするものは証明書の管理が大変になります。

OpenSSH のポートフォワード機能を使うと、サーバー証明書の管理をすることなく、暗号化通信路を用意できるので、重宝しています。その代わり、通信路の切断があったときの自動復旧などは自分で追加処理を用意するなど、面倒が増える場合もあります。

ここで、通信路の切断があったときの自動復旧について、単純に自動復旧しさえすれば良い場合は、autossh が便利です。これを使うと、SSH 接続が切断された場合に自動的に再接続してくれます。

Ubuntu / WSL Ubuntu では autossh というパッケージをインストールすると使えるようになります。

sudo apt -y isntall autossh

これを使うときは、基本的に ssh コマンドを autossh コマンドへ置き換えれば良いだけです。

よくあるのは、ポートフォワードで、アプリケーションサーバーと DB サーバーとの通信路を暗号化するといったときに使えます。最近はイントラネット内でもアプリケーションサーバーと DB サーバー間の通信路は暗号化している場合が多いでしょう。サーバー証明書関連の管理が自動化されている環境なら、DB サーバーの設定でサーバー証明書を設定して SSL 通信を有効化すれば良いですが、そこまでできない環境もあります。OpenSSH のポートフォワード機能を使えば対応できます。

手元で、OpenSSH のポートフォワード機能を使った例がすぐに用意できなかったのですが、似たようなものにリバースポートフォワード機能があります。こちらはサンプルがあるので、それを紹介します。

ここでは、OpenSSH サーバーが稼働している ssh.example.jp サーバーから、host001.internal サーバーへポート番号 11022 で SSH 接続ができるようにしたいとします。host001.internal サーバーでも OpenSSH サーバーは稼働しているとします。

その場合は、次のようなリバースポートフォワード用の通信路を用意するためのスクリプトを用意して、host001.internal サーバーで実行します。

$ cat /usr/local/bin/systemd-autossh-example.jp.sh
autossh -i /home/user001/.ssh/id_ed25519-autossh \
    -N -R 11022:localhost:22 \
    user001@ssh.example.jp

これをサーバー起動時に自動で起動するように設定するには、systemd 用のサービスファイルとして次のようなものを用意します。

$ cat /etc/systemd/system/autossh-example-jp.service 
[Unit]
Description=autossh-example-jp
After=network-online.target
Wants=network-online.target

[Service]
User=user001
ExecStart=/usr/bin/sh /usr/local/bin/systemd-autossh-example.jp.sh
Type=simple

[Install]
WantedBy=multi-user.target

リバースポートフォワードはファイアウォールで守られているネットワークへ外部から一時的に接続できるようにするときに使うものなので、必要なときにしか利用しません。しかし、このネットワークを有効化している間、通信断があったときに人力で対応をするというのは大変です。

こういったツールを使って、運用負担も軽く動かすことができるということを知っておくのは良いことだと考えています。

おわりに

今回は、Ubunt / WSL Ubuntu で ssh コマンドを使うにあたって、知っておくと良いだろうと思うことを紹介しました。

前回まで説明していた「セルフホスト Git サービス」から話題がずれている感じがしますが、「セルフホスト Git サービス」を稼働させるマシンをリモートから管理しようとした場合には、今回の話が深く関わってきます。

実際に「セルフホスト Git サービス」を個人で運用しようと思わないと、なかなか、こういったものには目が向きません。ささやかながらも、運用作業を経験することで、今回紹介したようなソフトウェアにも興味を持てるようになるのではないでしょうか。

Discussion