Skip to content

CLI ​

利用できるオプションはバージョンによって異なります。インストール済みのsshc helpで全体の一覧を、sshc <command...> --helpまたはsshc help <command...>で各コマンドの正確な引数を確認できます。例: sshc sync push --help、sshc help terminal send

値を取るオプションは、--jobs 4と--jobs=4のどちらの形でも指定できます。-jのような短い名前は-j 4の形だけです。同じオプションを2回指定するとエラーになります。

SSH接続、SFTP転送、同期、Terminal操作の各コマンドは、起動中のsshcエンジンを通して、OpenSSH設定、Vault、セッションを使います。sshc infoやsshc completionなど、情報をローカルで読み取るだけのコマンドはsshcエンジンを必要としません。自動化では、人向けの表示文を解析せず、対応するコマンドの--jsonを利用できます。

CodexなどのAIエージェントからも直接実行できます。非対話SSHは、Vaultのロックを解除し、接続ルートにあるすべてのホスト鍵と必要な認証情報を保存してから実行してください。サーバーがOTPの入力を明示的に求めるプロンプトには、接続先に割り当てたTOTPを自動入力します。未登録のホスト鍵や未保存の認証情報など、利用者の入力や判断が必要な接続は実行できません。条件を満たす場合はsshcが認証するため、AIエージェントへ認証情報そのものを渡す必要はありません。

--jsonの出力 ​

--jsonを付けたコマンドは、成功しても失敗しても、標準出力へ次の形のJSONを1つだけ出します。

json
{"schemaVersion":1,"success":true,"result":{}}
{"schemaVersion":1,"success":false,"failure":{"kind":"engine_not_running","retryable":true}}

successがtrueならresultにコマンドの結果が入ります。falseならfailureに失敗の種類(kind)と、時間をおいて同じ操作をやり直せば成功する見込みがあるか(retryable)が入り、終了コードは0以外になります。人向けの表示文は解析せず、successとkindで判断してください。Serial/Telnetの非対話の自動処理(--non-interactive)の結果だけは、送受信の記録を含む独自の形で出します。

引数を解釈できずにコマンドを始められない場合(必要な引数が無い、値の形が合わない、同じオプションを2回指定したなど)は、--jsonを付けていてもJSONを出しません。理由と使い方を標準エラー出力へ出し、終了コード2で終わります。このとき標準出力は空なので、JSONとして読む前に終了コードを確認してください。

エンジンとVault ​

sh
sshc engine
sshc engine --port 60001
sshc engine --replace
sshc engine --background
sshc
sshc open
sshc open --no-browser
sshc open <alias>
sshc stop
sshc status --json
sshc version
sshc vault status
sshc vault create
sshc vault unlock
sshc vault lock
sshc vault change-password
sshc service install
sshc service status
sshc service restart
sshc service disable
sshc update

引数なしのsshcとsshc openは、sshcエンジンが停止中ならバックグラウンドで起動します。準備ができてから、一度限りのURLを表示してブラウザで開きます。sshc open --no-browserも必要なら起動しますが、URLの表示だけで終了します。画面のないマシンやSSH経由で使う場合に指定してください。

sshc open <alias>は、SSHの接続先で動いているsshcエンジンを、このマシンのブラウザで開きます。このマシンのsshcエンジンが接続先へSSHで接続し、接続先のsshc open --no-browserが表示した一度限りのURLを受け取ります。そのURLを、このマシンの127.0.0.1で待ち受ける中継のポートに置き換えて表示し、ブラウザで開きます。接続先のターミナルとワークスペースは接続先のsshcエンジンが持つので、ブラウザを閉じても接続先で動き続けます。

  • 中継のポートは接続先ごとに覚えて、次も同じポートを使います。ブラウザに保存される設定がポートごとに分かれるためです。
  • 中継はこのマシンのsshcエンジンが止まるまで続きます。止まったあとや、接続先のsshcエンジンが起動し直したあとは、もう一度sshc open <alias>を実行してください。
  • SSH接続は確認を求めずに行います。初めての接続先は、先にsshc ssh <alias>でホスト鍵を確認してください。パスフレーズやパスワードが必要な接続先は、Connectionsで保存しておいてください。
  • 接続先のSSHサーバーが、接続先の127.0.0.1へのTCP転送を許可している必要があります(sshd_configのAllowTcpForwardingがyesかlocal)。許可されていなければ、URLを表示する前にその旨を表示して終了します。
  • 接続先には、先にsshcをインストールしておく必要があります。PATHのほか、~/.local/bin、/home/linuxbrew/.linuxbrew/bin、/opt/homebrew/bin、/usr/local/binから探します。接続先はmacOSかLinuxに限ります。
  • どちらのマシンでも、待ち受けは127.0.0.1だけです。Linuxでは、このマシンの別のOSユーザーからの接続は中継しません。
  • このマシンのsshcの画面と接続先の画面は、同じブラウザで同時に開けます。

sshc stopは、起動中のsshcエンジンへ停止を要求し、終了するまで待ちます。開いているターミナルや転送も終了します。停止中なら終了コード0で終了します。Linux・macOS・Windowsでログイン時の自動起動を有効にしている場合は、次のログインで再び起動します。停止したままにするにはsshc service disableを実行してください。

バックグラウンド起動のログは~/.ssh/sshc/logs/engine.log(Windowsは%USERPROFILE%\.ssh\sshc\logs\engine.log)へ追記します。起動前に5MiBを超えていた場合はengine.log.1へ移し、以前の.1を置き換えます。フォルダとファイルは本人だけが読める権限で作り、暗号化同期から除外します。準備ができる前に終了した場合は、終了コードとログの末尾20行を表示します。

  • sshc engineはフォアグラウンドで動作します。
  • --backgroundはサービスやバックグラウンド起動から使うオプションです。標準出力・標準エラーとログを上記のファイルへ追記します。Windowsではコンソールを手放します。
  • sshc engine --port <n>(1024〜65535)は待ち受けポートを固定します。
  • sshc version(-v、--version)はこのバイナリのバージョンを表示します。
  • sshc vault statusはsshc statusと同じ表にVaultの状態を含めて表示します。

Vaultのマスターパスワードなどを対話入力すると、入力した値の代わりに*を表示します。入力値がTerminalのスクロールバックへ平文で残ることはありません。

sshc serviceはLinuxではsystemdユーザーサービス、macOSではlaunchdユーザーエージェント、Windowsではログオン時のタスクを管理します。

サブコマンド動作
installHomebrew、install.sh、Windowsのinstall.ps1で導入された安定パスを登録する
restartこの導入と定義が一致する稼働中のサービスを再起動する
disablesshcが作成した定義だけを削除する

install、restart、disable、updateは変更内容を表示してから確認を求めます。自動化で確認を省略する場合だけ-yまたは--yesを付けてください。

sshc service restartは、停止中・未登録・管理外・古い定義・別の実行ファイルを指すサービスを拒否し、終了コード1で終わります。接続中のセッションと転送は再起動で終了します。再起動後のsshcエンジンの起動情報と応答を照合してから成功と表示します。Windowsでは、起動情報のPIDの実行ファイルが登録先と一致することも確認します。詳しい対処はインストールを参照してください。

sshc vault change-passwordは、現在のパスワードを入力してEnterを押すと、検証後に新しいパスワードの入力を求めます。パスワードなしのVaultでは、現在のパスワードの入力を省きます。新しいパスワードと確認を両方空欄にすると、パスワード保護を外せます。パスワードなしのVaultでは、sshc vault lockを実行してもロックされません。ロックを使う場合はマスターパスワードを設定してください。CLI更新後はsshcエンジンも再起動して変更を反映してください。

OTP ​

sh
sshc otp list [--json]
sshc otp <name>
sshc otp show <name> --json
sshc otp add <name>
sshc otp edit <name>
sshc otp remove <name> [-y|--yes]

listは保存名と割り当て先だけを表示します。sshc otp <name>またはshowは、時刻の境界付近でも確認できるよう、ひとつ前・現在・ひとつ後のコードと現在コードの残り秒数を表示します。セットアップキーはsshcエンジン内に留まり、表示結果やJSONには含めません。

addとeditは対話ターミナルでBase32セットアップキーまたはotpauth:// URIを受け取り、入力中は値の代わりに*を表示します。使用中のTOTPは、先にConnectionsで割り当てを解除しない限りremoveできません。

SSH ​

sh
sshc ssh
sshc ssh --list
sshc ssh <alias>
sshc ssh <alias> --non-interactive -- <command...>
sshc info <alias> --json

Homebrew版ではbash、zsh、fishの補完が一緒に導入されます。その他の導入方法では、利用中のシェルに合わせて次のいずれかをシェルの初期化ファイルへ追加してください。

  • サブコマンド、オプション、列挙値に加え、sshc ssh、sshc info、sshc terminal create ssh、sshc sftp、sshc vpn bind/unbindでは接続先も補完します。
  • 接続先候補は、Tabを押した時点の~/.ssh/configと到達可能なIncludeから取得されます。
  • シェル展開やコマンド連結につながるメタ文字、空白、先頭の-などを含むエイリアスは、sshc ssh --listと補完候補から除外し、理由を標準エラー出力へ表示します。

コマンドの解釈、個別ヘルプ、bash/zsh/fishの補完は、同じコマンド定義から作られています。補完に表示される名前や選択肢は、そのバージョンのsshc helpと一致します。

sh
# bash
source <(sshc completion bash)

# zsh
source <(sshc completion zsh)

# fish
sshc completion fish | source

Linuxでは、システムのBash補完がHomebrewの補完フォルダを探さない場合があります。ファイル名しか出ないときは、現在のシェルでsource <(sshc completion bash)を実行してください。同じ行を~/.bashrcに追加すれば、新しいシェルでも現在のコマンド定義を読み込みます。更新後も古い候補が残る場合は、現在のシェルでも読み込み直してください。

sshc infoでは、sshcエンジンを起動せずに、実際の接続時と同じ規則でInclude、Match、ProxyJump、文字コード、使用するVPNルートを読み込み、最終的に使われる値を確認できます。保存済みの認証情報、SetEnvの値、ProxyCommandの本文は表示されません。

非対話コマンドは次の形式です。

sh
sshc ssh bastion --non-interactive -- uname -a

終了コード ​

sshc ssh <alias>と、sshc sshの選択画面から始めた対話接続は、次の終了コードで終わります。

  • 接続したあとは、リモートのシェルの終了コード
  • 引数が正しくない場合は2
  • sshcエンジンに接続できない、Vaultのロックが解除されていない、sshcエンジンに断られた、SSH設定を読めないなど、SSH接続を始める前に失敗した場合は1
  • SSH接続(VPNルート、名前解決、TCP接続、ハンドシェイク、認証)に失敗した場合は、OpenSSHのsshと同じ255。接続中の質問(ホスト鍵、パスワード)でCtrl+Cを押した場合も255
  • sshcエンジンが動いているか、Vaultのロックが解除されているかを確かめている間や、選択画面でCtrl+Cを押した場合は130。接続したあとのCtrl+Cはリモートへ送ります
  • SIGTERMかSIGHUP(ターミナルのウィンドウを閉じた場合など)で止めた場合は0。Windowsでは、ウィンドウを閉じたとき、サインアウトしたとき、シャットダウンしたときが当たります
  • 選択画面で接続先を選ばずに閉じた場合は0

SIGTERMとSIGHUPで0を返す規則は、Serial/Telnetの対話接続とsshc engineも同じです。対話の接続をシグナルで止めるのは、利用者がターミナルを閉じたときや、プロセスを管理する側が止めたときなので、失敗として扱いません。

自動処理向けの実行は、シグナルで止めても0を返しません。sshc ssh --non-interactiveは、リモートのコマンドの終了コードを返します。引数が正しくない場合は2、接続できなかった場合はOpenSSHのsshと同じ255です。シグナルを受けるとそのまま終了するので、シェルからは130(Ctrl+C)、143(SIGTERM)、129(SIGHUP)に見えます。Serial/Telnetの自動処理は130を返します(SerialとTelnet)。

Sync ​

sh
sshc sync setup
sshc sync --json
sshc sync push [--force] [--json]
sshc sync pull [--force] [--json]
sshc sync now [--json]
sshc sync auto on|off [--json]

sshc sync pushとsshc sync pullは、転送量の要約に続けて、転送したファイルを1行ずつadded、modified、removedの区分付きで表示します。競合または削除があって通常のpullが止まった場合は、適用されなかった変更のプレビューを同じ形で標準エラー出力へ表示します。--jsonでは、pullはwritten、added、removed、conflictsを、pushはadded、modified、removedをパスの配列として返します。

sshc sync setupは、設定済みのエンドポイント、バケット、パス、リージョン、同期方向を既定値として表示します。同期方向はboth、push、pullから選びます。

  • Access Key IDは末尾5文字以外を伏せ字にして表示します。
  • Secret Access Keyと同期の暗号化キー(CLIの表示はSync key)は値を表示せずconfiguredと示します。
  • 再設定時にシークレットの入力欄を空のままEnterキーを押すと、sshcエンジンに保存済みの値を維持します。
  • 新しい値の入力中は、平文の代わりに*を表示します。

VPN ​

VPNプロファイルを付けた接続の通信だけを専用のVPN経由にします。プロファイルは接続先を持たず、接続先は付けた接続のHostNameとPortです。Dockerが動作しているマシンで利用できます。詳しくは接続ごとのVPNを参照してください。

sh
sshc vpn [--json]
sshc vpn add <名前>
sshc vpn edit <名前>
sshc vpn remove <名前> [-y|--yes]
sshc vpn rename <古い名前> <新しい名前> [--json]
sshc vpn up <名前> [--json]
sshc vpn down <名前> [--json]
sshc vpn logs <名前> [--json]
sshc vpn proxy <名前> <host> <port>
sshc vpn bind <alias> <名前> [--json]
sshc vpn unbind <alias> [--json]

sshc vpn addは新しいプロファイルを作成します。同じ名前のプロファイルがすでにある場合は何も変更せずにエラーになり、sshc vpn editで編集するか、sshc vpn renameで名前を変更するよう案内します。

設定はターミナルで対話的に入力します。HostNameをホスト名で書いた接続に使う場合は、その名前解決に使うVPN内のDNSサーバーも入力します。方式ごとの入力は次のとおりです。

方式入力するもの
WireGuard設定ファイル([Interface]と[Peer])のパス。DNSサーバーは設定ファイルのDNSを使う。sshc vpn editでは、空欄なら保存済みの設定ファイルをそのまま使う
OpenConnectパスワードのあとに追加の認証を求めるサーバーのために、二要素認証の方法(none/approve/totp)
OpenVPN設定ファイル(.ovpn)のパスと、任意のユーザー名。読み込んだ時点で中身を確認し、使用できない指示があれば、何行目のどの指示かを表示して中止する
IKEv2/IPsec認証方式(eap-mschapv2/psk)と、サーバーの証明書を検証するCAの証明書のファイルの場所(空欄なら公的な認証局)

シークレットの扱いは次のとおりです。

  • 秘密鍵、VPNのパスワード、IPsecの事前共有鍵は入力時に表示せず、コマンド引数や環境変数からは受け取りません。保存先はVaultです。
  • OpenVPNとWireGuardの設定ファイルは、鍵を含むため、全体をシークレットとしてVaultに保存します。
  • sshc vpn editは保存済みのシークレットを表示しません。空欄のまま入力すると、保存済みの値を使います。

sshc vpn editは保存済みのプロファイルを編集します。各項目の初期値は保存済みの値です。空欄のシークレットは保存済みの値のまま残し、任意の項目は-を入力すると消せます。方式を変えた場合だけ、新しい方式のシークレットを入力します。

sshc vpnの一覧には、VPNが接続中であれば、トンネルのインターフェース名、トンネルのアドレス、接続開始時刻も表示されます。

sshc vpn downはルートを切断します。そのルートを使っている接続も切断され、Terminalでは自動再接続しません。

sshc vpn removeとsshc vpn renameにはVaultのロック解除が必要です。sshc vpn renameは、設定、シークレット、接続に付けた設定をまとめて新しい名前へ移します。接続中のルートはいったん切断しますが、新しい名前が使用できない場合は切断しません。

sshc vpn logsは、そのプロファイルについて、sshcエンジンがVPNルートを用意した記録と、コンテナの直近のログを表示します。保存済みのシークレットは[REDACTED]に置き換えます。接続できないときは、まずこのログを確認してください。

sshc vpn proxyは、標準入出力をそのルートへ中継します。このマシンのssh、scp、gitからVPNルートを使うためのコマンドで、~/.ssh/configに次のように書きます。

text
Host lab
  HostName 10.9.9.1
  ProxyCommand sshc vpn proxy tundra %h %p

接続先は%h %pで渡します。省略できません。接続先へ届かない場合は、通常のネットワークへ切り替えずに接続を中止し、原因を標準エラーに表示します。SSHのハンドシェイクと鍵はssh側で扱い、sshcはデータを中継するだけです。

bindでプロファイルを付けた接続は、Terminal、SFTP、sshc ssh <alias>のどれから開いても同じルートを使います。ルートを用意できないときは、通常のネットワークへ切り替えずに接続を中止します。

bindとunbindでプロファイルを付ける、外す、別のプロファイルに変えると、その接続に割り当てた保存済みパスワード、ワンタイムパスワード、起動スニペットは停止中になります。Web UIの[Connections]で基本設定を保存し直し、[Snippets]で起動スニペットを割り当て直してください。sshc vpn renameで名前を変更した場合と、sshc vpn editで編集した場合は、割り当てはそのまま使えます。

SFTP転送 ​

起動中のsshcエンジンと、Web UIと同じOpenSSH設定、ホスト鍵の検証、Vaultの認証情報を使って転送します。リモートパスは/var/log/app.logのような絶対POSIXパスか、~/で始まるパスで指定します。~/は、SFTPサーバーのログイン先(通常はホームフォルダ)から数えます。~は'~/logs/app.log'のように引用してください。引用しないと、シェルが手元のホームフォルダに置き換えてからsshcに渡します。手元のパスでは、引用した~も手元のホームフォルダとして読みます。

sh
sshc sftp get bastion /var/log/app.log ./app.log
sshc sftp put bastion ./release.tar.gz /tmp/release.tar.gz
sshc sftp get bastion /srv/data ./data --recursive
sshc sftp put bastion ./public /var/www/public --recursive
sshc sftp get bastion /srv/archive ./archive --recursive --jobs 4
sshc sftp get bastion /srv/archive ./archive --recursive --max-total-size 8192
sshc sftp settings
sshc sftp settings --split-size 73 --split-jobs 6 --chunk-size 41
sshc sftp get bastion /backup/disk.img ./disk.img --split-size 100 --split-jobs 4 --chunk-size 512
sshc sftp put bastion ./disk.img /backup/disk.img --split-size 100 --split-jobs 4 --chunk-size 512

sshc sftp settingsは、WebとCLIが共通で使う分割転送を始めるサイズ、1ファイルの接続数、チャンクサイズを表示します。同じコマンドへ--split-size(16〜1024 MiB)、--split-jobs(1〜128)、--chunk-size(8〜4096 MiB)を付けると、指定した項目だけを既定値として保存します。--jsonでは保存後の値を機械可読形式で取得できます。

-jまたは--jobsには、同時に転送するファイル数を1〜8で指定します。既定は1です。通常ファイルはアップロード、ダウンロードともに512 GiBまで転送できます。

get/putへ分割オプションを付けた場合は、保存済みの既定値をその実行だけ上書きします。初期値は100 MiB以上、1接続(分割しない)、32 MiBチャンクです。

  • --split-jobs 1は分割しません。
  • 並列にするには--split-jobsでその実行の接続数を指定するか、sshc sftp settings --split-jobsかWebの転送マネージャーで既定値を変えてください。
  • --split-jobsは最大128まで指定できますが、実際の接続数は未転送チャンク数までです。
  • ワンタイムコードで認証するホストは、指定に関わらず1接続で転送します。
  • 複数ファイルを同時に分割転送すると合計接続数が増えるため、接続先とこのマシンの上限に合わせて指定してください。

再帰ダウンロードは、選択したルート以下の深さ64段、ファイルとフォルダを合わせて10,000項目、合計1,024 MiBを既定の安全上限とします。上限に達した場合は何も転送せずに停止します。意図して大きなツリーを取得する場合だけ、--max-depth(最大256)、--max-entries(最大1,000,000)、--max-total-size(MiB単位、最大8 TiB)でその実行の上限を引き上げてください。これらはget --recursive専用です。

putとgetの動作は次のとおりです。

  • 転送したファイルに元の更新日時を付けます。
  • シンボリックリンクはWinSCPやscpと同じくリンク先として転送し、フォルダへのリンクはその中身ごと送ります。
  • リンク先が無いリンクと、ファイルでもフォルダでもないものは、その項目だけをskipとして標準エラーへ表示して飛ばし、結果のskippedに数えます。
  • フォルダを--recursiveで送るときは必要なリモートフォルダを作りますが、ファイル1つのputは送り先のフォルダが無ければremote_directory_missingで止まります。
  • 新しく作られるファイルの権限はサーバーの既定(umask)に従い、上書きしたファイルは元の権限を保ちます。

対話ターミナルでsshc sftp getを実行すると、sshcエンジンがリモートファイルを準備している間の進捗を接続ごとに表示します。分割している場合は接続ごとの進捗バーになります。分割しない場合は進捗バーが1本です。表示するのは転送中のファイルだけで、終わったファイルの行は消えます。複数のファイルを転送するときは、先頭の1行に終わったファイルの数を表示します。--jsonを付けた場合や出力先が対話ターミナルでない場合は進捗を表示しないため、機械処理向けの出力に進捗表示が混ざりません。

既定では既存ファイルを上書きしません。上書きする場合は--overwriteを付けると実行前にまとめて確認し、--yesを併用した場合だけ確認を省略します。既存ファイルを残す場合は--skip-existing、変更せず転送計画だけ確認する場合は--dry-runを利用できます。自動化では--jsonを付けると標準出力へ1つのJSON結果を出し、進捗は標準エラー出力へ分離します。Ctrl+Cで中断したアップロードでは、sshcがリモート側に作成した一時ファイルも削除します。

Serial / Telnet ​

sh
sshc serial
sshc serial /dev/ttyUSB0 --baud 9600
sshc telnet console.example:23

SerialとTelnetの対話接続はCtrl+]で切断できます。Telnetは通信を暗号化せず、サーバーも認証しません。

Terminal操作 ​

起動中のsshcエンジンが管理するTerminalセッションを別のプロセスから確認、作成、操作できます。

sh
sshc terminal list --json
sshc terminal create ssh bastion --json
sshc terminal create shell --json
sshc terminal create shell --workspace "sshc開発"
sshc terminal show <session-id> --json
sshc terminal read <session-id> --cursor 0 --limit 4096 --json
sshc terminal send <session-id> --text 'uptime' --json
sshc terminal send <session-id> --text 'partial input' --no-enter
sshc terminal wait <session-id> --for connected --timeout 30s --json
sshc terminal rename <session-id> deploy
sshc terminal rename <session-id> --auto
sshc terminal close <session-id>

create shellはsshcエンジン側のローカルシェルを開きます。sendは既定で末尾にEnter(CR)を付け、--no-enterで付けません。

createで開いたセッションは、既定で非表示の「エージェント」のワークスペースに入ります。LLMやスクリプトが開いた接続を、画面のサイドバーに混ぜないためです。--workspaceにワークスペースのIDか名前を指定すると、そのワークスペースに入れます。名前を変更していない「メイン」と「エージェント」は、画面に出る名前(英語の画面ではMainとAgents)か、IDのdefaultとagentsで指定できます。listは、各セッションが入っているワークスペースのIDも表示します。

readでは、保持しているスクロールバックと次回指定する読み取り位置を取得できます。指定した位置の出力がすでに破棄されている場合は、現在残っている先頭から返し、そのことを警告に含めます。sendは、確認後にセッション内のプロセスが入れ替わっていた場合には何も送信しません。

renameで付けた名前は固定され、プログラムが設定するタイトルでは変わりません。

  • --autoを付けると固定を外し、画面の[自動の名前に戻す]と同じく、プログラムが設定したタイトル、無ければ接続エイリアスまたはシェル名を表示します。名前と--autoは同時に指定できません。
  • -で始まる名前は、sshc terminal rename <session-id> --json -- -devのように--の後ろに書いてください。--より後ろはオプションとして読みません。
  • --jsonの結果では、presentation.titlePinnedで名前が固定されているかを確認できます。