SSHでリモートマシン上でローカルシェルスクリプトを実行する際の例と解説

2024-08-21

SSHでリモートマシン上でローカルシェルスクリプトを実行する方法

前提条件:

  • SSHクライアントがインストールされていること。
  • リモートマシンのSSHサーバーが稼働していること。
  • ローカルに実行したいシェルスクリプトが存在すること。

手順:

  1. ターミナルを開く:

  2. リモートマシンにSSH接続:

  3. スクリプトをリモートマシンに転送:

  4. リモートマシン上でスクリプトを実行:

例:

  • ローカルマシンで my_script.shというスクリプトがある場合、リモートマシン example.comのユーザー userとして実行するには、以下のようにします。
    ssh [email protected]
    scp my_script.sh [email protected]:/home/user
    ./home/user/my_script.sh
    
  • SSH接続の認証には、パスワード認証または鍵認証を使用できます。
  • scpコマンドは、sshコマンドと同じ認証方式を使用します。
  • リモートマシン上でスクリプトを実行する前に、スクリプトファイルに実行権限を付与する必要があります。
  • scpコマンドでファイルを転送する際、リモートマシンのディレクトリが存在しない場合は自動的に作成されます。
  • scpコマンドでファイルを転送する際、ファイル名が衝突した場合には上書きされます。



SSH接続とスクリプト転送、実行

# リモートマシンにSSH接続
ssh user@remote_hostname

# ローカルのスクリプトをリモートマシンにコピー
scp local_script.sh user@remote_hostname:/home/user/

# リモートマシン上でスクリプトを実行
cd /home/user
./local_script.sh
  • ssh user@remote_hostname: リモートマシンにユーザー名とホスト名で接続します。
  • scp local_script.sh user@remote_hostname:/home/user/: ローカルの local_script.sh をリモートマシンの /home/user/ ディレクトリにコピーします。
  • cd /home/user; ./local_script.sh: リモートマシン上でスクリプトのあるディレクトリに移動し、スクリプトを実行します。

SSH接続内で直接スクリプトを実行

ssh user@remote_hostname 'bash -s' < local_script.sh
  • ssh user@remote_hostname 'bash -s': リモートマシンに接続し、bash -s を実行します。-s オプションは、標準入力をスクリプトとして実行するように指示します。
  • < local_script.sh: ローカルのスクリプトの内容を ssh コマンドにパイプします。

SSH接続内でスクリプトをバックグラウンドで実行

ssh user@remote_hostname 'nohup ./local_script.sh & > /dev/null 2>&1'
  • nohup: スクリプトが切断されても実行し続けます。
  • &: バックグラウンドで実行します。
  • > /dev/null 2>&1: 出力とエラー出力を破棄します。

SSHキーを用いた接続(より安全な方法)

# SSHキーペアの作成(初回のみ)
ssh-keygen
# 生成した公開鍵をリモートマシンにコピー
ssh-copy-id user@remote_hostname
# パスワードなしで接続
ssh user@remote_hostname

SSHキーを使用することで、パスワード入力を省略でき、より安全な接続が可能になります。

Expectを用いた自動化(複雑な操作の場合)

Expectは、対話型のプログラムを自動化するためのツールです。SSH接続のパスワード入力を自動化したり、スクリプトの実行結果に応じて処理を分岐させることができます。

expect -c '
spawn ssh user@remote_hostname
expect "password:"
send "your_password\r"
expect "#"
send "cd /home/user\r"
send "./local_script.sh\r"
interact
'

解説:

  • 各例は、異なる状況や目的に合わせたSSHを用いたリモートスクリプト実行の方法を示しています。
  • どの方法を選ぶかは、スクリプトの複雑さ、セキュリティ要件、実行頻度などによって異なります。
  • SSHキーを用いた接続は、セキュリティ面から推奨される方法です。
  • Expectは、より高度な自動化が必要な場合に有効なツールです。

注意点:

  • リモートマシンの環境によっては、上記のコマンドがそのまま動作しない場合があります。
  • スクリプトの実行権限に注意してください。
  • セキュリティには十分注意し、不要なポート開放などは行わないようにしましょう。

リモートシェルスクリプト実行

リモートマシン上に既に存在するシェルスクリプトを実行する場合、SSH接続後に直接パスを指定して実行します。

ssh user@remote_hostname './path/to/remote_script.sh'
  • ssh コマンドのオプションや、スクリプトの内容によって、実行方法はさらに多様化します。



SSHを用いたリモートシェルスクリプト実行の代替方法

SSHを用いたリモートシェルスクリプト実行は、一般的な方法ですが、他にも様々な選択肢があります。それぞれの方法には、メリットとデメリットがあり、利用シーンによって最適な方法が異なります。

SSH以外のプロトコルを利用

  • SCP(Secure Copy Protocol): ファイル転送に特化しており、SSH接続後にスクリプトをコピーし、リモートマシン上で直接実行する。
  • SFTP(SSH File Transfer Protocol): SSHのセキュアなチャネル上でファイル転送を行う。SFTPクライアントを利用して、ファイルのアップロードやダウンロード、リモートディレクトリでの操作などが可能。
  • rsync: ファイルの同期に特化しており、差分のみ転送することで高速な転送を実現する。
  • rsync over SSH: rsyncをSSH上で実行することで、より安全なファイル同期を行う。

スクリプト実行ツール

  • Puppet: Ansibleと同様に、複数のホストに対して構成管理を行う。
  • Chef: Rubyベースの構成管理ツール。
  • SaltStack: Pythonベースの構成管理ツール。

クラウドプラットフォームの機能を利用

  • AWS: EC2インスタンスへのSSH接続、S3へのファイルアップロード、Lambdaによるスクリプト実行など、様々な機能を提供。
  • GCP: Compute EngineインスタンスへのSSH接続、Cloud Storageへのファイルアップロード、Cloud Functionsによるスクリプト実行など、様々な機能を提供。
  • Azure: Virtual MachinesへのSSH接続、Blob Storageへのファイルアップロード、Functionsによるスクリプト実行など、様々な機能を提供。

コンテナ技術を利用

  • Docker: Dockerイメージを作成し、リモートマシンにデプロイすることで、一貫した実行環境を提供する。
  • Kubernetes: Dockerコンテナを大規模にオーケストレーションするためのプラットフォーム。

スクリプト言語の機能を利用

  • Python: Paramikoモジュールを利用してSSH接続を行い、スクリプトを実行できる。
  • Go: sshパッケージを利用してSSH接続を行い、スクリプトを実行できる。

各方法の比較

方法メリットデメリット適しているケース
SSHシンプルで使いやすい毎回接続が必要少数のホストに対して簡単なスクリプトを実行する場合
SCP/SFTPファイル転送に特化SSH接続が必要ファイル転送と実行を分離したい場合
rsync差分転送で高速設定が複雑になる場合がある大量のファイルを同期する場合
Ansible, Puppet, Chef, SaltStack構成管理に特化学習コストが高い複数のホストに対して大規模な構成管理を行う場合
クラウドプラットフォーム多様な機能を提供ベンダーロックインのリスククラウド環境で開発・運用する場合
Docker, Kubernetes一貫した実行環境を提供学習コストが高い大規模なコンテナオーケストレーションを行う場合
Python, Ruby, Go柔軟性が高いプログラミングスキルが必要高度な自動化やカスタマイズが必要な場合

どの方法を選ぶかは、以下の要素によって決まります。

  • 実行するスクリプトの複雑さ
  • ホストの数
  • セキュリティ要件
  • 自動化の程度
  • チームのスキルセット

選択のポイント

  • シンプルなスクリプト: SSHが最も簡単
  • 大規模な構成管理: Ansibleなどの構成管理ツール
  • クラウド環境: クラウドプラットフォームの機能
  • 高度な自動化: Pythonなどのスクリプト言語
  • セキュリティ: SSHキー認証や、パスワードの適切な管理など、セキュリティ対策は常に意識しましょう。
  • エラー処理: スクリプト実行時のエラー処理を適切に行いましょう。
  • ログ: スクリプトの実行ログを記録することで、トラブルシューティングに役立ちます。

shell ssh system-administration



Bash で文字列に部分文字列が含まれるかチェックする

Bashスクリプトにおいて、ある文字列に特定の部分文字列が含まれるかどうかを判定する方法はいくつかあります。ここでは、最も一般的な方法をいくつか紹介します。最もシンプルで一般的な方法です。[[ ]]: 条件式を評価します。*: 任意の文字列とマッチするワイルドカードです。...


SSH キーのパスフレーズの削除 (日本語)

前提条件:SSH キーペアが既に生成されている。パスフレーズが設定されている。手順:ターミナルを開く:ターミナルを開く:SSH エージェントを起動:SSH エージェントは、SSH キーをメモリにロードして、パスワードの入力を求めずにSSH接続を可能にします。以下のように入力して、SSH エージェントを起動します:eval "$(ssh-agent -s)"...



shell ssh system administration

Rubyからシェルコマンドを実行する際のコード例解説

Rubyからシェルコマンドを実行するには、主に次の方法があります。最も単純な方法です。コマンドを実行し、その終了ステータスを返します。コマンドを実行し、その出力を文字列として返します。より柔軟な制御と入出力の処理が可能です。%x演算子と同じですが、古い書き方です。


Bashスクリプトでのディレクトリ存在チェックのコード解説

Bashスクリプトでディレクトリの存在を確認するには、主に次の方法が使用されます。testコマンド(または [ ] )-d オプションdirectory_path 変数にチェックしたいディレクトリのパスを指定します。test コマンドまたは [ ] を使用して、-d オプションとともにディレクトリパスの存在をチェックします。


Bash での数値範囲の繰り返し: その他の方法

Bash で変数で定義された数値範囲を繰り返す方法はいくつかあります。最も一般的な方法は for ループと seq コマンドを利用することです。start と end には繰り返しの開始と終了の数値をそれぞれ設定します。for ((i=$start; i<=$end; i++)) は C スタイルの for ループで、i を start から end まで 1 ずつ増やしながら繰り返します。


grepコマンドによるファイル検索の除外と包含:詳細なコード例と解説

grepは、テキストファイル内の特定のパターンを検索するための強力なコマンドラインツールです。UnixやLinuxのシェル環境で広く使用されています。--excludeオプションを使用することで、特定のファイルやディレクトリを検索から除外することができます。


日本語解説: シェルスクリプトでの Yes/No/Cancel 入力 (代替方法)

日本語解説:Linuxのシェルスクリプトでユーザーに Yes/No/Cancel の選択肢を提供し、その入力を受け取る方法はいくつかあります。ここでは、一般的な方法を解説します。read choice: ユーザーの入力を変数choiceに格納します。