Linux で最も一般的な SSH コマンドの使用法と構成


簡単: このガイドでは、SSH の一般的な使用例について説明します。また、生産性を高めるために日常生活で使用できる一般的に使用される SSH 構成についても説明します。

セキュア シェル (SSH) は広く採用されているネットワーク プロトコルであり、リモート ホストと安全にやり取りすることができます。それらの間のすべての通信を暗号化することにより、セキュリティを提供します。

Linux で SSH コマンドを使用する方法

このセクションでは、SSH プロトコルの一般的なユース ケースのいくつかについて説明します。

telnet、netcat などのプロトコルを使用してリモートの Linux ホストと対話する方法はいくつかあります。ただし、これらは暗号化されていないため安全ではありません。 SSH プロトコルを使用して、ホスト間の安全な通信を許可できます。

リモートホストと対話するには、SSH クライアントを使用する必要があります。 Linux で使用できる GUI および CLI ベースのクライアントは多数あります。ただし、このガイドでは、ssh というコマンド ライン ユーティリティを使用します。デフォルトでは、ほとんどの Linux ディストリビューションで ssh ユーティリティを使用できます。

SSH コマンドの構文は次のとおりです。

$ ssh [OPTIONS]  [COMMANDS] [ARGS]

ここで、角括弧 ([]) はオプションの引数を表し、角括弧 (<>) は必須の引数を表します。

ssh クライアントを使用してリモート ホストに接続しましょう。

$ ssh -l root 192.168.19.130

この例では、-l オプションを使用してログイン名を指定し、宛先は 192.168.19.130 です。正しいパスワードを入力すると、SSH 接続が確立されます。これで、ローカル システムと同じように、リモート ホストでコマンドを実行できます。

# hostname

セッションを終了するには、exit コマンドまたは ctrl+D キーの組み合わせを使用できます。

新しいセッションごとにリモート ホストで認証する必要があることに注意することが重要です。毎回パスワードを入力することを避けるために、SSH パスワードなしのログインを設定できます。

前のセクションでは、リモート ホストとの接続を確立する方法について説明しました。これは、リモート ホストを長時間使用する場合にのみ適しています。場合によっては、リモート ホストで 1 つまたは 2 つのコマンドを実行するだけで済みます。このような場合、長時間のセッションを作成せずにこれらのコマンドを実行できます。

リモートホストで hostname コマンドを実行しましょう:

$ ssh -l root 192.168.19.130 hostname

同様に、リモートの Linux マシンで複数のコマンドを実行できます。

$ ssh -l root 192.168.19.130 'hostname; pwd'

コマンドは引用符で囲み、セミコロン (;) 文字で区切る必要があることに注意してください。複数のリモート Linux ホストでコマンドを実行する場合は、記事「Pssh – 複数のリモート Linux ホストでコマンドを実行する」をお読みください。

コマンドと同様に、リモート ホストでローカル スクリプトを実行することもできます。例でこれを理解しましょう。

まず、ローカル マシン上に実行権限のある単純なシェル スクリプトを作成します。

$ cat script.sh 

hostname
pwd

それでは、リモートホストで実行してみましょう:

$ ssh [email protected] 'bash -s' < ./script.sh 

この例では、bash の -s オプションを使用して、標準入力からスクリプトを読み取りました。

ファイルとディレクトリを頻繁に使用します。ユーザーが実行する一般的な操作の 1 つは、ディレクトリとファイルのコピーです。ローカル マシンと同様に、scp コマンドを使用してリモート ホスト間でファイルとディレクトリをコピーできます。このコマンドは、SSH プロトコルを使用してファイルを安全にコピーします。

script.sh ファイルをリモート ホストの /tmp ディレクトリにコピーしましょう。

$ scp script.sh [email protected]:/tmp

次に、ファイルがコピーされたことを確認します。

$ ssh [email protected] 'ls /tmp/script.sh'

同様に、scp コマンドを使用してディレクトリをコピーできます。ただし、コマンドで -r オプションを使用する必要があります。

SSH は、gzip 圧縮アルゴリズムを使用したデータ圧縮をサポートしています。このアルゴリズムは、stdin、stdout、stderr など、考えられるすべてのデータ ストリームを圧縮します。このオプションは、低速のネットワーク接続を使用しているときに非常に便利です。

-C オプションを使用して、SSH で圧縮を有効にできます。

$ ssh -C -l root 192.168.19.130 'hostname' 

Linux ユーザーは、多くの場合、SSH セッションをデバッグして、さまざまな SSH 接続および構成関連の問題を調査する必要があります。このような場合、現在のセッションのデバッグ ログを出力する詳細モードを有効にすることができます。

-v オプションを使用して冗長モードを有効にしましょう。

$ ssh -v -l root 192.168.19.130 hostname

これに加えて、複数の -v オプションを使用して詳細レベルを上げることができます。

  • -v – 詳細レベルを 1 に設定し、クライアント側のアクティビティに関する詳細を提供します。
  • -vv – 詳細レベルを 2 に設定し、クライアント側とサーバー側のアクティビティに関する詳細を提供します。
  • -vvv – 詳細レベルを 3 に設定し、クライアント側とサーバー側のアクティビティに関する詳細情報を提供します。

SSH でサポートされる最大の詳細レベルは 3 です。これを実際に見てみましょう。

$ ssh -vvv -l root 192.168.19.130 hostname

上記の例では、debug1 は詳細レベル 1 によって有効化されたデバッグ メッセージを表します。同様に、debug2 と debug3 は、それぞれ詳細レベル 2 と 3 によって有効化されたデバッグ メッセージを表します。

SSH でエスケープ シーケンスを使用して、クライアント ターミナル セッションを管理できます。一般的に使用されるエスケープ シーケンスと適切なユース ケースについて説明します。

現在の SSH セッションを終了せずに、ローカル マシンでいくつかのアクティビティを実行する必要がある場合があります。このようなシナリオでは、~ + ctrl+z キー シーケンスを使用して現在のセッションを中断できます。

まず、リモート ホストにログインし、hostname コマンドを実行します。

$ ssh -l root 192.168.19.130
# hostname

次に、現在のセッションを一時停止するには、最初にチルダ (~) 文字を入力し、ctrl+z キーを押します。 ctrl+z を押すまで、チルダ (~) 文字は stdout に表示されないことに注意してください。

それでは、セッションが中断されたことを確認しましょう。

$ jobs

ここでは、現在の SSH セッションがバックグラウンドで実行されていることがわかります。

fg コマンドを使用してセッションを再開し、hostname コマンドを実行します。

$ fg %1

不安定なネットワークによってセッションが中断されたときに発生するフリーズした SSH セッションを見たことがあるはずです。ここでは、exit コマンドを使用してセッションを中止することはできません。ただし、\~ + .\ キー シーケンスを使用して終了できます。

まず、リモート ホストにログインします。

$ ssh -l root 192.168.19.130

\~ + .\ キーの組み合わせを使用して、現在のセッションを終了します。

この例では、SSH が「192.168.19.130 への接続が閉じられました」というメッセージを表示していることがわかります。

興味深い点の 1 つは、サポートされているすべてのエスケープ シーケンスを一覧表示するエスケープ シーケンスがあることです。 \~ + ? エスケープ シーケンスを使用して、サポートされているエスケープ シーケンスを一覧表示できます。

ここで、ヘルプ メニューから出るにはエンター キーを押す必要があります。

Linux で SSH を構成する方法

このセクションでは、SSH サーバーを強化するためのサーバー側の構成について説明します。 SSH サーバーはすべての構成を /etc/ssh/sshd_config ファイルに保存します。 SSH 構成を更新するには、root ユーザー アクセスが必要であることに注意してください。

ベスト プラクティスとして、SSH 接続を確立する前に常にバナーを表示する必要があります。場合によっては、許可されていないユーザーがリモート ホストにアクセスするのを思いとどまらせます。この設定を段階的に有効にする方法を見てみましょう。

最初に、警告メッセージを含むテキスト ファイルをリモート サーバー上に作成します。

# vi /etc/banner.txt 

次に、次のバナー メッセージを追加します。

*********************************************************************
Warning !!! You are trying to log in to techmint.com's server.
All the activities on this server are monitored.
Terminate the session immediately if you are not an authorized user.
*********************************************************************

次に、/etc/ssh/sshd_config ファイルを開き、Banner ディレクティブでファイルを指定します。

Banner /etc/banner.txt

次に、sshd サービスを再起動し、exit コマンドを使用してセッションを終了します。

# systemctl restart sshd
# exit

最後に、リモート ホストにログインしてバナーを確認します。

$ ssh -l root 192.168.19.130

ここで、サーバーが SSH バナーを正しく表示することができます。

これまでは、root ユーザーを使用してリモート ホストにアクセスしていました。ただし、これは最小権限の原則に反します。運用環境では、セキュリティを強化するために、root ユーザー アクセスは常に制限されています。

PermitRootLogin ディレクティブを使用して、root ユーザーのログインを無効にすることができます。

まず、/etc/ssh/sshd_config ファイルを開き、PermitRootLogin ディレクティブでオプション no を使用します。

PermitRootLogin no

次に、sshd サービスを再起動し、exit コマンドを使用してセッションを終了します。

# systemctl restart sshd
# exit

最後に、新しい SSH セッションを作成してこれを確認します。

$ ssh -l root 192.168.19.130

ここで、root ユーザーでリモート ホストにログインできないことがわかります。 root ユーザーのログインを許可するには、同じディレクティブでオプション yes を使用できます。

デフォルトでは、SSH は TCP ポート 22 を使用します。ただし、SSH を別のポート、つまり 8088 で実行するように設定できます。

まず、/etc/ssh/sshd_config ファイルを開き、Port ディレクティブで 8088 値を使用します。

Port 8088

次に、sshd サービスを再起動してセッションを終了します。

# systemctl restart sshd
# exit

それでは、リモートホストにログインしましょう:

$ ssh -p 8088 -l root 192.168.19.130

この例では、-p オプションを使用してポート番号を指定しています。

場合によっては、デフォルト以外のポートでの通信を許可するために、いくつかの他の手順を実行する必要があります。利用可能なポートの特定、ファイアウォール ルールの更新、SELinux 設定など。

この記事では、SSH プロトコルとその一般的なユース ケースについて説明しました。次に、いくつかの一般的なオプションについて説明しました。最後に、SSH サーバーを保護するためのいくつかの設定について説明しました。

Linux での SSH コマンドの最適な使用法を他に知っていますか?以下のコメント欄でご意見をお聞かせください。