SSHでリモートマシン上でローカルシェルスクリプトを実行する際の例と解説
SSHでリモートマシン上でローカルシェルスクリプトを実行する方法
前提条件:
- SSHクライアントがインストールされていること。
- リモートマシンのSSHサーバーが稼働していること。
- ローカルに実行したいシェルスクリプトが存在すること。
手順:
ターミナルを開く:
リモートマシンにSSH接続:
スクリプトをリモートマシンに転送:
リモートマシン上でスクリプトを実行:
例:
- ローカルマシンで
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