remote-server-guide について
特定のツールに依存せず、SSH によるリモートサーバー接続、コマンド実行、コンテナ管理を支援するスキルです。ツール選定からファイル転送、トラブル対応、後片付けまで扱います。
主な機能
- 01SSH 接続情報を収集
- 02認証方式と SSH ツールを選択
- 03ホストやコンテナでコマンドを実行
- 04SSH 経由でファイルを転送
- 05接続問題の診断とリソースの整理
活用シーン
- 01クラウド VM や開発マシンに接続
- 02リモート Docker コンテナ内でコマンドを実行
- 03リモートホストとファイルを送受信
- 04SSH 認証やネットワークの問題を診断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ascend-ai-coding/ awesome-ascend-skills --skill remote-server-guideインストール後、Claude Code で/remote-server-guideを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/container-workflows.mdssh-examples.mdtool-comparison.mdreferences/tools/fabric-advanced.mdfabric-basic.mdparamiko-advanced.mdparamiko-basic.mdsshpass.mdtmux.md詳細
リモートサーバーガイド
SSH を介してリモートサーバーに接続し、コマンドを実行して、コンテナを管理するワークフローです。このスキルは特定のツールに依存しません。目的に合った SSH ツールを選ぶ際に役立ち、接続からクリーンアップまでの全手順を案内します。
このスキルを使う場面
- ユーザーがリモートサーバー(クラウド VM、オンプレミスサーバー、開発マシンなど)への接続を必要としている場合
- ユーザーがリモートホストでコマンドを実行したい場合
- ユーザーがリモートサーバー上の Docker コンテナに接続する必要がある場合
- ユーザーがリモートサーバーとの間でファイルを転送したい場合
- ユーザーが SSH 認証で問題を抱えている場合
認証方法
| 方法 | セキュリティ | 利便性 | 最適な用途 |
|---|---|---|---|
| SSH キー | 最高 | 高 | 本番環境、頻繁な利用 |
| tmux(対話型) | 高(パスワードが AI に知られない) | 中 | 一時的なアクセス、セキュリティを重視するユーザー |
| sshpass | 中(パスワードがコマンド内に含まれる) | 高 | 簡単なスクリプト、信頼できる環境 |
| paramiko/fabric | 中 | 中 | Python による自動化 |
ワークフロー
フェーズ 1:接続情報の収集
接続する前に、ユーザーから次の情報を収集します。
- ホストアドレス(IP またはホスト名)
- SSH ポート(デフォルト:22)
- ユーザー名(例:root、ubuntu、user)
- 認証方法:
- SSH キー(推奨)
- パスワード(ツールの選択が必要です。フェーズ 2 を参照)
- ジャンプホスト(任意。踏み台/プロキシ構成の場合)
フェーズ 2:認証の設定
SSH キー(推奨)
ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no -i <key-path> <user>@<host> -p <port> "echo 'Connection successful'"
パスワード認証
ユーザーがパスワード認証を必要とする場合は、まず利用可能なツールを確認します。
which sshpass >/dev/null 2>&1 && echo "sshpass: available" || echo "sshpass: not found"
python3 -c "import paramiko" 2>/dev/null && echo "paramiko: available" || echo "paramiko: not found"
python3 -c "import fabric" 2>/dev/null && echo "fabric: available" || echo "fabric: not found"
which tmux >/dev/null 2>&1 && echo "tmux: available" || echo "tmux: not found"
ユーザーがパスワードのセキュリティを懸念している場合は、必ず tmux による対話型接続を推奨します。パスワードはユーザー自身が直接入力し、AI に知られることはありません。
ツール選択のガイド:
| シナリオ | 推奨ツール | 理由 |
|---|---|---|
| セキュリティを重視するユーザー | tmux | パスワードが AI に知られない |
| 一時的なアクセス | tmux | 認証情報を保存する必要がない |
| 簡単なシェルスクリプト | sshpass | シンプルで、依存関係がない |
| Python アプリケーション | paramiko | 細かな制御が可能で、低レベル |
| デプロイの自動化 | fabric | 高レベル API で、コードがすっきりする |
| SFTP が必要 | paramiko または fabric | サポートが組み込まれている |
| 対話型ターミナル | tmux または sshpass | ネイティブの TTY をサポート |
利用可能なツールがない場合は、いずれかのインストールを提案します。
# tmux (Ubuntu/Debian)
sudo apt-get install -y tmux
# sshpass (Ubuntu/Debian)
sudo apt-get install -y sshpass
# paramiko
pip install paramiko
# fabric
pip install fabric
フェーズ 3:接続のテスト
次に進む前に、接続が機能することを確認します。
sshpass:
sshpass -p '<password>' ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no <user>@<host> -p <port> "echo 'Connection successful'"
tmux(対話型):
tmux new-session -d -s remote_session "ssh -o StrictHostKeyChecking=no <user>@<host> -p <port>"
# Tell user: "Please run: tmux attach -t remote_session and enter your password"
# After user confirms, verify:
tmux capture-pane -t remote_session -p
paramiko:
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='<host>', port=<port>, username='<user>', password='<password>')
print('Connection successful')
client.close()
fabric:
from fabric import Connection
conn = Connection(host='<host>', user='<user>', connect_kwargs={'password': '<password>'})
conn.run('echo "Connection successful"', hide=True)
conn.close()
接続に失敗した場合は、次の点を確認します。
- ホストアドレスとポートを確認する
- 認証情報を確認する
- ネットワーク/ファイアウォール/VPN を確認する
- ジャンプホストの設定を確認する(使用している場合)
フェーズ 4:実行環境の選択
コマンドを実行する場所をユーザーに確認します。
- ホスト上で直接実行 — 最も一般的で、追加の設定は不要です
- 既存の Docker コンテナ内で実行 — 実行中のコンテナに接続します
- 新しい Docker コンテナ内で実行 — まずコンテナを作成します(専用のワークロードでは、NPU サーバー向けの
npu-docker-launcherなど、ハードウェア固有のスキルを検討してください)
既存のコンテナへの接続
重要:tmux と他のツールでは、コンテナ操作の挙動が大きく異なります。
tmux(永続セッション): 一度コンテナのシェルに入ったら、その後のコマンドはすべて直接送信でき、自動的にコンテナ内で実行されます。セッションでは状態(作業ディレクトリ、環境変数、シェルのコンテキスト)が維持されます。
# List containers
tmux send-keys -t remote_session "docker ps" Enter
tmux capture-pane -t remote_session -p
# Enter container ONCE — all subsequent commands run inside the container
tmux send-keys -t remote_session "docker exec -it <container-name> bash" Enter
# Now you are INSIDE the container — just send commands directly, no need to repeat docker exec
tmux send-keys -t remote_session "cd /workspace" Enter
tmux send-keys -t remote_session "python inference.py" Enter
tmux send-keys -t remote_session "cat result.txt" Enter
tmux capture-pane -t remote_session -p
# Exit container when done (returns to host shell)
tmux send-keys -t remote_session "exit" Enter
他のツール(ステートレス): 各コマンドは共有状態のない個別の SSH 接続になります。すべてのコマンドの前に docker exec を付ける必要があります。
# Every command needs the full docker exec prefix
ssh <user>@<host> "docker exec <container-name> ls /workspace"
ssh <user>@<host> "docker exec <container-name> python inference.py"
ssh <user>@<host> "docker exec <container-name> cat result.txt"
フェーズ 5:コマンドの実行
選択した SSH ツールを、すべての操作で一貫して使用します。
単一コマンド
tmux: tmux はシェルセッションを保持するため、コマンドを直接送信するだけです。以前にコンテナに入っている場合、コマンドはコンテナ内で実行されます。
tmux send-keys -t remote_session "<command>" Enter
tmux capture-pane -t remote_session -p
その他のツール(ステートレスで、各コマンドは独立しています):
| ツール | ホスト上 | コンテナ内 |
|---|---|---|
| SSH キー | ssh -i <key> <user>@<host> "<command>" | ssh -i <key> <user>@<host> "docker exec <container> <command>" |
| sshpass | sshpass -p '<pwd>' ssh <user>@<host> "<command>" | sshpass -p '<pwd>' ssh <user>@<host> "docker exec <container> <command>" |
| paramiko | client.exec_command("<command>") | client.exec_command("docker exec <container> <command>") |
| fabric | conn.run("<command>") | conn.run("docker exec <container> <command>") |
ファイル転送
| ツール | アップロード | ダウンロード |
|---|---|---|
| scp | scp <local> <user>@<host>:<remote> | scp <user>@<host>:<remote> <local> |
| sshpass+scp | sshpass -p '<pwd>' scp <local> <user>@<host>:<remote> | sshpass -p '<pwd>' scp <user>@<host>:<remote> <local> |
| paramiko | sftp.put('local', 'remote') | sftp.get('remote', 'local') |
| fabric | conn.put('local', 'remote/') | conn.get('remote', 'local') |
複数ステップのスクリプト
複雑な操作では、スクリプトをアップロードして実行します。
# Upload script
scp setup.sh <user>@<host>:/tmp/
# Execute
ssh <user>@<host> "bash /tmp/setup.sh"
# Cleanup
ssh <user>@<host> "rm /tmp/setup.sh"
フェーズ 6:クリーンアップ
作業が終わったら、リソースをクリーンアップします。
- SSH 接続を閉じます(
client.close()、conn.close()) - tmux セッションを終了します(
tmux kill-session -t remote_session) - 該当する場合は、一時コンテナを停止/削除します
操作リファレンス
tmux(対話型)
# Create SSH session (user inputs password)
tmux new-session -d -s remote_session "ssh -o StrictHostKeyChecking=no <user>@<host> -p <port>"
# User runs: tmux attach -t remote_session
# Execute command after connection
tmux send-keys -t remote_session "<command>" Enter
# Get output
tmux capture-pane -t remote_session -p
# Kill session when done
tmux kill-session -t remote_session
sshpass
# Execute command
sshpass -p '<password>' ssh <user>@<host> "<command>"
# Upload file
sshpass -p '<password>' scp <local> <user>@<host>:<remote>
# Docker exec on remote
sshpass -p '<password>' ssh <user>@<host> "docker exec <container> <command>"
paramiko
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='<host>', username='<user>', password='<password>')
# Execute command
stdin, stdout, stderr = client.exec_command('<command>')
print(stdout.read().decode())
# SFTP
sftp = client.open_sftp()
sftp.put('local.txt', '/remote/path/remote.txt')
sftp.get('/remote/file.txt', 'local.txt')
client.close()
fabric
from fabric import Connection
conn = Connection(host='<host>', user='<user>',
connect_kwargs={'password': '<password>'})
result = conn.run('<command>', hide=True)
print(result.stdout)
conn.put('local.txt', '/remote/path/')
conn.get('/remote/file.txt', 'local.txt')
conn.close()
エラー処理
| エラー | 原因 | 解決策 |
|---|---|---|
| Connection refused | SSH が実行されていません | リモート側の SSH サービスを確認します |
| Permission denied | 認証情報が正しくありません | ユーザー名/パスワード/キーを確認します |
| Host key verification failed | 初回接続です | -o StrictHostKeyChecking=no を追加します |
| Network unreachable | ネットワークの問題です | ファイアウォールと VPN を確認します |
| Tool not found | インストールされていません | インストールコマンドを実行します |
| Container not found | 名前が正しくありません | docker ps -a ですべてのコンテナを一覧表示します |
セキュリティのベストプラクティス
- 可能な場合は、パスワードよりも SSH キーを優先します
- パスワードのハードコーディングは避けます — 環境変数または
SSHPASS環境変数を使用します - キーの権限を制限します:
chmod 600 ~/.ssh/id_rsa - AI にパスワードを扱わせたくない場合は、tmux 方式を使用します
- 作業が終わったら、一時コンテナとセッションを クリーンアップします
詳細リファレンスファイル
各ツールの詳細な使い方については、以下を参照してください。
- tools/tmux.md — tmux による対話型 SSH(最も安全)
- tools/sshpass.md — sshpass の詳しい使い方
- tools/paramiko-basic.md — Paramiko の基本操作
- tools/paramiko-advanced.md — Paramiko の Docker および踏み台ホスト
- tools/fabric-basic.md — Fabric の基本操作
- tools/fabric-advanced.md — Fabric の Docker および並列実行
- tool-comparison.md — ツールの比較と選択ガイド
- ssh-examples.md — SSH コマンドの一般的な例
- container-workflows.md — コンテナのライフサイクルワークフロー