リモート Linux サーバーでローカル スクリプトを実行する方法
公開: 2022-09-10
反復タスクをスクリプト化すると、システム管理の効率が向上します。 これはローカル マシンには最適ですが、リモート サーバーを監視する場合はどうでしょうか。 リモートコンピューターでローカルスクリプトを実行できますか? はい!
リモート接続
リモート システム管理では、通常、安全なシェル接続を介してリモート コンピュータに接続します。 SSH 接続により、リモート コンピューターにコマンド プロンプトが表示されます。 その後、すぐに進んで、必要なシステム メンテナンスを実行できます。
シェル スクリプトは、一連のコマンドをプログラムのように実行できるスクリプトにラップし、多くのアクションを 1 つのコマンド ライン命令にまとめることで役立ちます。
時間が経つにつれて、スクリプトを微調整して改善します。 管理するリモート マシンが多数ある場合、各サーバーの各スクリプトのコピーを最新の状態に保つのは面倒であり、厄介なオーバーヘッドです。 それ自体が管理タスクになり、スクリプトを使用することで得られる時間の節約が台無しになります。
理想的なソリューションは、スクリプトをローカル マシンに保持し、SSH 接続を介してリモート コンピューターで実行できるようにすることです。 これにより、一元化されたスクリプトのコレクションで管理が簡素化され、同じ最新のスクリプトがすべてのコンピューターで実行されます。
Bash と SSH はまさにそれを行う方法を提供します。
パスワードなしの SSH 接続
これを行う最善の方法は、SSH キーを使用したパスワードなしの接続です。 ローカル コンピューターで SSH キーを生成し、それらを各リモート コンピューターに送信することで、毎回パスワードの入力を求められることなく、安全かつ便利にリモート コンピューターに接続できます。
初めて使用するユーザーにとっては威圧的かもしれませんが、SSH キーは実際には難しくありません。 それらは簡単に生成でき、リモート サーバーに簡単にインストールでき、SSH で使用する場合は摩擦がありません。 唯一の前提条件は、リモート コンピューターで SSH デーモンsshdが実行されていることと、リモート コンピューターにユーザー アカウントがあることです。
すでにリモート システム管理を行っている場合は、これらの両方の要件が既に満たされている必要があります。
SSH キー ペアを生成するには、次のように入力します。
ssh-keygen
「fedora-36.local」という名前のコンピューターに「dave」という名前のアカウントがある場合、次のコマンドで SSH 公開鍵を送信してインストールできます。
ssh-copy-id [email protected]
これで、通常の方法で SSH 接続を行うと、SSH キーを使用して認証が行われます。 パスワードの入力を求めるプロンプトが表示されずに、リモート サーバーのコマンド プロンプトが表示されます。
ssh [email protected]
ローカル スクリプトをリモートで実行する
これらのテストでは、リモート サーバーは「fedora-36.local」と呼ばれる Linux コンピューターです。 SSH キーをセットアップし、ローカル コンピューターからリモート サーバーへのパスワードなしの接続をテストしました。
スクリプトは非常に単純です。 リモートサーバー上の「timestamp.txt」というファイルにタイムスタンプを書き込みます。 スクリプトは終了コマンドで終了することに注意してください。 これは重要です。一部の古いシステムでは、スクリプトを最後まで実行することができますが、SSH 接続は開いたままになります。
#!/ビン/バッシュ 日付 >> タイムスタンプ.txt 出口0
このテキストをエディターにコピーし、「local.sh」として保存してから、 chmodを使用して実行可能にします。
chmod +x local.sh

ローカル マシンで、次のようにスクリプトを起動します。
ssh [email protected] 'bash -s' < local.sh

これがどのように機能するかです。
- ssh [email protected] : リモート マシンへの SSH 接続。 これは、
sshコマンド、リモート サーバー上の既存のユーザー アカウント、およびリモート サーバーのアドレスを使用します。 - 'bash -s' : これにより、Bash は標準入力ストリームからコマンドを読み取ります。 これにより、Bash はリダイレクトまたはパイプされた入力を読み取ることができます。
- < local.sh : スクリプトを Bash にリダイレクトしています。
スクリプトが実行されると、ローカル コンピューターのコマンド プロンプトに戻ります。 リモート マシンに移動し、cat を使用して「timestamp.txt」ファイル内を確認できます。
猫のタイムスタンプ.txt


前回の、そして現在のみの接続のタイムスタンプを確認できます。 ローカル スクリプトをさらに数回実行すると、対応するタイムスタンプがリモート ファイルに追加されます。
猫のタイムスタンプ.txt

もちろん、実際の状況では、スクリプトはもっと便利なことを行います。 しかし、この簡単な例でさえ、ローカル スクリプトがリモート サーバーで実行されていることを示しています。
スクリプトに引数を渡す
コマンドライン引数をスクリプトに渡すことができます。 スクリプトを変更して、3 つのコマンド ライン パラメーターを受け取るようにします。 これらは、タイムスタンプとともに「timestamp.txt」ファイルにリダイレクトされます。
このスクリプトを「local2.sh」として保存し、 chmodで実行可能にします。
#!/ビン/バッシュ echo "$1 $2 $3" >> タイムスタンプ.txt 日付 >> タイムスタンプ.txt 出口0
使用する必要があるコマンドは、前の例と似ていますが、いくつか変更があります。
ssh [email protected] "bash -s" -- < local2.sh "How-To\ Geek" "Linux" "Articles"

2 つのハイフン「 -- 」は、Bash に、その後に続くものがsshコマンドのコマンド ライン パラメーターと見なされるべきではないことを伝えます。 スクリプトの 3 つのパラメーターは、通常どおり、スクリプト名の後に続きます。 「How-To\ Geek」パラメータでスペースをエスケープするためにバックスラッシュ「 \ 」を使用していることに注意してください。
リモートサーバーでパラメーターが正しく受信および処理されたことをcatで確認できます。
猫のタイムスタンプ.txt

スクリプトのセクションをリモートで実行する
リモート サーバーで必要なアクションを判断するためにローカル処理を実行する必要があるスクリプトがある場合は、そのスクリプトにセクションを追加して、リモート アクションを実行することができます。
これは、ヒア ドキュメントを使用して実現できます。 ヒアドキュメントを使用すると、スクリプトのラベル付きセクションからコマンドに行をリダイレクトできます。 ローカル処理は、ヒアドキュメントの上下で実行できます。
これは、ヒア ドキュメントを含むスクリプト「local3.sh」です。
#!/ビン/バッシュ # ローカル処理はここでできます # リモート処理はここで行う ssh -T [email protected] << _remote_commands # リモートで実行するコマンドはここに追加されます cd /ホーム/デイブ/ドキュメント # など # 最後に、タイムスタンプ ファイルを更新します echo "Script3.sh:" $(日付) >> /home/dave/timestamp.txt # これはリダイレクトの終了を示すラベルです _remote_commands # ここでさらにローカル処理を行うことができます 出口0
以前と同じ接続の詳細でsshコマンドを使用しています。 「fedora-36.local」というリモートサーバーにユーザー「dave」として接続しています。 -T (疑似端末の割り当てを無効にする) オプションも使用しています。 これにより、リモート サーバーがこの接続用の対話型端末を提供できなくなります。
リダイレクト「 << 」の後には、ラベルの名前が続きます。 この例では、「_remote_commands」を使用しています。 このラベルに特別なことは何もありません。単なるラベルです。
リダイレクト後の行に表示されるすべてのコマンドは、SSH 接続を介して送信されます。 ラベルが検出されると、リダイレクトは停止します。 スクリプトの実行は、ラベルに続く行から続行されます。
混合ローカル/リモート処理スクリプトを実行してみましょう。
./local3.sh

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

リーチを拡大
ローカルで作成、保存、保守されているスクリプトをリモートで実行できるため、便利な管理ツールが提供されます。 すべてのリモート サーバーでまったく同じバージョンのスクリプトが実行されることがわかっていると、管理がはるかに簡単になります。
関連: Cockpit Web インターフェイスを使用して Linux サーバーを管理する方法


