技術ノート Linux リモート Linux サーバーでローカル スクリプトを実行する方法

リモート Linux サーバーでローカル スクリプトを実行する方法

リモート Linux サーバーでローカル スクリプトを実行する方法

反復的なタスクをスクリプト化すると、システム管理の効率が向上します。これはローカル マシンには最適ですが、リモート サーバーを監視する場合はどうなるでしょうか?リモート コンピュータ上でローカル スクリプトを実行できますか?はい!

リモート接続

リモート システム管理には、通常、 セキュア シェル 接続を介してリモート コンピュータに接続することが含まれます。 SSH 接続により、 リモート コンピュータ上にコマンド プロンプトが表示されます。その後、必要なシステム メンテナンスをすぐに実行できます。

シェル スクリプトを 使用すると、一連のコマンドをプログラムのように実行できるスクリプトにラップし、多くのアクションを 1 つのコマンド ライン命令に組み合わせることができます。

時間が経つにつれて、スクリプトを微調整して改善していきます。管理するリモート マシンが多数ある場合、各サーバー上の各スクリプトのコピーを最新の状態に保つのは面倒で、煩わしいオーバーヘッドが発生します。それ自体が管理タスクとなり、スクリプトを使用することで得られるはずの時間の節約が無駄になってしまいます。

理想的なソリューションは、スクリプトをローカル マシン上に保持し、SSH 接続経由でリモート コンピュータ上で実行できるようにすることです。これにより、スクリプトの集中コレクションによる管理が簡素化され、すべてのコンピューターで同じ最新のスクリプトが実行されます。

Bash と SSH はまさにそれを行う方法を提供します。

リモート Linux サーバーでローカル スクリプトを実行する方法

パスワードなしの SSH 接続

これを行う最善の方法は、SSH キーを使用したパスワードなしの接続です。ローカル コンピュータで SSH キーを生成し 、各リモート コンピュータに送信すると、毎回パスワードの入力を求められることなく、安全かつ便利にリモート コンピュータに接続できます。

初めてのユーザーにとって SSH キーは難しいかもしれませんが、実際には難しいものではありません。これらは生成が簡単で、リモート サーバーにインストールするのも簡単で、SSH で使用する場合もスムーズです。唯一の前提条件は、リモート コンピュータに SSH デーモンがあることです。

 sshd

実行中であること、およびリモート コンピュータにユーザー アカウントがあることを確認します。

すでにリモート システム管理を行っている場合は、これらの要件が両方とも満たされている必要があります。

SSH キー ペアを生成するには、次のように入力します。

 ssh-keygen

「fedora-36.local」というコンピュータ上に「dave」というアカウントがある場合は、次のコマンドを使用して SSH 公開キーを送信してインストールできます。

 ssh-copy-id dave@fedora-36.local

通常の方法で SSH 接続を行うと、SSH キーを使用して認証が行われます。パスワードの入力を求められることなく、リモート サーバーのコマンド プロンプトにドロップされます。

 ssh dave@fedora-36.local 

リモート Linux サーバーでローカル スクリプトを実行する方法

ローカルスクリプトをリモートで実行する

これらのテストでは、リモート サーバーは「fedora-36.local」という Linux コンピューターです。 SSH キーを設定し、ローカル コンピューターからリモート サーバーへのパスワードなしの接続をテストしました。

私たちのスクリプトは非常にシンプルです。リモート サーバー上の「timestamp.txt」というファイルにタイムスタンプを書き込みます。スクリプトは exit コマンドで終了することに注意してください。これは重要です。一部の古いシステムでは、スクリプトが最後まで実行される可能性がありますが、SSH 接続は開いたままになります。

 #!/bin/bash

日付 >> タイムスタンプ.txt

0番出口

このテキストをエディタにコピーし、「local.sh」として保存し、 chmod を使用して実行可能にします

 chmod +x ローカル.sh

ローカル マシンで、次のようなスクリプトを起動します。

 ssh dave@fedora-36.local 'bash -s' < local.sh

これがどのように機能するかです。

  • ssh dave@fedora-36.local : リモート マシンに対して行っている SSH 接続。これには、 ssh コマンド、リモート サーバー上の既存のユーザー アカウント、およびリモート サーバーのアドレスが使用されます。
  • ‘bash -s’ : これにより、Bash は標準入力ストリームからコマンドを読み取ります。これにより、Bash はリダイレクトされた入力またはパイプされた入力を読み取ることができます。
  • < local.sh : スクリプトを Bash にリダイレクトしています。

スクリプトを実行すると、ローカル マシンのコマンド プロンプトに戻ります。リモート マシンに移動すると、cat を使用して「timestamp.txt」ファイルの内部を調べることができます。

猫のタイムスタンプ.txt

最後に、そして現時点では唯一の接続のタイムスタンプを確認できます。ローカル スクリプトをさらに数回実行すると、対応するタイムスタンプがリモート ファイルに追加されます。

猫のタイムスタンプ.txt

もちろん、現実の状況では、スクリプトはもっと便利なことを行うでしょう。しかし、この簡単な例でも、ローカル スクリプトがリモート サーバー上で実行されていることを示しています。

リモート Linux サーバーでローカル スクリプトを実行する方法

スクリプトに引数を渡す

コマンドライン引数をスクリプトに渡すことができます。 3 つのコマンド ライン パラメーターを想定するようにスクリプトを変更します。これらはタイムスタンプとともに「timestamp.txt」ファイルにリダイレクトされます。

このスクリプトを「local2.sh」として保存し、 chmod で実行可能にします。

 #!/bin/bash

echo “$1 $2 $3” >> タイムスタンプ.txt

日付 >> タイムスタンプ.txt

0番出口

使用する必要があるコマンドは前の例と似ていますが、いくつかの変更があります。

 ssh dave@fedora-36.local "bash -s" -- < local2.sh "ハウツー\ オタク" "Linux" "記事"

二重ハイフン「 -- 」は、その後の内容が ssh コマンドのコマンド ライン パラメーターとみなされるべきではないことを Bash に伝えます。いつものように、スクリプト名の後にスクリプトの 3 つのパラメーターが続きます。 「How-To\ Geek」パラメータ内のスペースをエスケープするためにバックスラッシュ「 \ 」を使用していることに注意してください。

cat を使用して、パラメータがリモート サーバー上で正しく受信され、処理されたことを確認できます。

猫のタイムスタンプ.txt 

リモート Linux サーバーでローカル スクリプトを実行する方法

スクリプトのセクションをリモートで実行する

リモート サーバーでどのようなアクションが必要かを判断するためにローカル処理を行う必要があるスクリプトがある場合は、そのスクリプトにセクションを直接追加して、リモート アクションを実行できます。

これは 、 here ドキュメント を使用することで実現できます。 Here ドキュメントを使用すると、スクリプトのラベル付きセクションの行をコマンドにリダイレクトできます。ローカル処理は、ヒアドキュメントの上下で実行できます。

これはスクリプト「local3.sh」で、ヒアドキュメントが含まれています。

 #!/bin/bash

# ローカル処理はここで実行できます

# リモート処理はここで行われます

ssh -T dave@fedora-36.local << _remote_commands

# リモートで実行されるコマンドがここに追加されます

cd /ホーム/デイブ/ドキュメント

#など

# 最後にタイムスタンプファイルを更新します

echo “Script3.sh:” $(date) >> /home/dave/timestamp.txt

# これはリダイレクトの終わりを示すラベルです

_remote_commands

# さらにローカル処理をここで実行できます

0番出口

以前と同じ接続詳細で ssh コマンドを使用しています。 「fedora-36.local」というリモートサーバーにユーザー「dave」として接続しています。 -T (擬似端末割り当てを無効にする) オプションも使用しています。これにより、リモート サーバーはこの接続に対話型端末を提供できなくなります。

リダイレクト「 << 」の後にラベル名が続きます。この例では、「_remote_commands」を使用しています。このラベルには特別なことは何もなく、単なるラベルです。

リダイレクト後の行に表示されるすべてのコマンドは、SSH 接続経由で送信されます。ラベルが検出されると、リダイレクトは停止します。スクリプトの実行は、ラベルに続く行から続行されます。

ローカル/リモート混合処理スクリプトを実行してみましょう。

 ./local3.sh

予想どおり、「timestamp.txt」ファイルに新しいエントリが表示されます。

猫のタイムスタンプ.txt 

リモート Linux サーバーでローカル スクリプトを実行する方法

リーチを拡大する

ローカルで作成、保存、保守されるスクリプトをリモートで実行できるため、便利な管理ツールが提供されます。すべてのリモート サーバーでまったく同じバージョンのスクリプトが実行されることがわかれば、管理がはるかに簡単になります。

「リモート Linux サーバーでローカル スクリプトを実行する方法」に関するベスト動画選定!

【丁寧に学ぶLinux入門】 ⑧リモート接続(SSH, Xサーバ)
【Ubuntu 22.04】RDP接続(リモートデスクトップ)を試す