暗号化同期

sshcは同期用のクラウドストレージを提供せず、同期データを預かりません。利用者が用意したS3互換オブジェクトストレージを同期先として使っています。接続設定、Vault内の認証情報、スニペット、同期対象のSSH鍵は、端末上で1つのスナップショットとして暗号化してから保存します。ストレージ事業者はこれらの内容を平文では取得できません。バケット名、S3オブジェクト名、オブジェクトのサイズと更新時刻は暗号化されません。
最初の端末を設定する
- バケット、エンドポイント、アクセスキーを入力する
- 接続テストを完了する
- 保存先が空なら同期キーを生成する
- 一度だけ表示される同期キーを安全な場所へ保管する
別の端末を追加する
追加する端末にも、同じS3バケット、オブジェクトのパス、同期キーを設定します。リモートに既存のスナップショットがある場合は、正しいキーで復号できたことを確認してから保存できます。データを分ける場合は、別のバケット内パスを指定できます。
同期方向は、送受信、送信専用、受信専用から選べます。
- 送受信では、リモートの更新を受け取り、ローカルの変更も送信します
- 送信専用では、送信前にリモートが更新されていないか確認しますが、リモートの内容は適用しません
- 受信専用では、リモートの内容だけを受け取り、この端末の変更は送信しません
追加した端末を閲覧用にするなら、受信専用が適しています。履歴が分岐した場合も、現在のリモートを確認してから明示的に受信できます。この操作でバケットへ書き込むことはありません。
接続や受信に失敗した場合は、認証拒否、タイムアウト、DNS、TLS、同期キー不一致、未対応形式、破損したスナップショットを区別して表示します。同じ原因には同じエラーコードを返すため、トラブルシューティングで確認箇所を特定できます。分類できない失敗では、問い合わせに使える診断コードも表示します。
受信時のファイルは、リモートスナップショットを正として内容と権限をそのまま復元します。通常ファイルの0600と実行可能ファイルの0700を区別するため、内容が同じで権限だけが変わった場合も同期対象です。sshcが構造化できないOpenSSH設定や構文上の問題が含まれていても同期そのものは止めず、受信後にConnectionsやDiagnosticsで確認できます。
Gitに似た同期操作
- 変更を確認すると、ローカルとリモートの差分を事前に表示します
- Pushは、差分を確認した後に別の端末がリモートを更新していない場合だけ送信します
- Pullは、差分確認後にリモートとローカルが変わっていない場合だけ適用します
- Force Pushは、競合をローカル側の内容で解決します。確認後に保存先やリモートが変わっていれば上書きしません
- Force Pullは、競合や削除をリモート側の内容で解決します。確認後にリモートまたはローカルが変わっていれば適用しません
- 履歴では、バケット内の過去のスナップショットを表示します
自動同期を有効にすると、Vaultのロックが解除されている間、1分ごとにリモートの更新を確認します。送受信または送信専用の端末で設定を変更すると、最後の変更から5秒後に1回だけPushされます。5秒以内に変更を続けた場合は、最後の変更から数え直します。受信専用の端末からはPushしません。
同期しないファイル


Sync画面の[同期するファイル]では、現在のファイルを検索して同期対象を切り替えられます。詳細設定では、ワークスペース直下の.sshcignoreを編集できます。除外パターンには正規表現ではなく、Gitignoreと同様のglob形式を使います。*、**、?と、先頭/によるルート指定に対応しています。除外したファイルを再び含める場合は、パターンの先頭に!を付けます。
初期状態では、次のOSメタデータ、バックアップ、一時ファイル、ロックファイル、SSHの許可鍵・既知ホスト情報、ログイン時の環境変数・初期化スクリプトを除外します。
# OS metadata files
**/.DS_Store
**/Thumbs.db
**/desktop.ini
# Backup and temporary files
*.bak
*.tmp
# Lock files
*.lock
# ssh config
authorized_keys
authorized_keys2
known_hosts
known_hosts.old
known_hosts2
known_hosts2.old
/environment
/rc/environmentと/rcは.ssh直下だけを対象とし、サブディレクトリ内の同名ファイルは除外しません。
この既定値は.sshcignoreが未保存の場合に使われます。保存済みの除外設定はそのまま維持されます。
.sshcignoreを保存すると、その内容自体は同期され、同じ保存先を使う端末で共通の除外設定になります。除外された既存のローカルファイルは、通常のPullでもForce Pullでも削除・上書きされません。接続設定や鍵を除外すると他端末へ届かなくなるため、画面上でも警告します。
.sshcignore自体と、Vault・スニペットの暗号化転送用データは制御ファイルとして常に同期され、*などの広い規則でも除外されません。S3の認証情報、端末固有の履歴、実行中の処理を管理するファイルは、sshcが自動的に除外します。
Sync画面では、普段使う操作と設定を分けています。バケットと同期キーは[同期設定を管理]にまとまり、スナップショットの差分とS3上の履歴は[詳細・履歴]から開けます。履歴は最初に最新5件だけを表示し、必要に応じて全件を開けます。
同期キー
マスターパスワードは端末ごとに異なって構いません。一方、同じ保存先を使う端末には、共通の同期キーが必要です。同期キーを紛失すると、リモートのスナップショットを復号できません。
競合の扱いや履歴については、Push・Pull・履歴で詳しく説明しています。