ssh-agentに鍵を一括登録するsshhの開発とsubprocessパッケージの使い方

By Takayuki Shimizukawa

Elevator Pitch

私は、ssh-agentに必要な分のssh秘密鍵を一括登録するツール sshh を開発しました。このツールで使っているPythonのsubprocessパッケージは、Pythonから外部コマンドを起動して標準入出力を操作できます。このトークでは、subprocessについて概要を紹介し、起動したプログラムの標準入出力とPythonをPIPEで繋ぎ対話的に入出力する方法を紹介します。そして、PIPEの出力を効率的にストリーミング処理する方法と、subprocessで扱えないssh-addの入出力を制御する方法を紹介します。

Description

私が開発した sshh は、ssh-agentに登録している鍵の数が一定数を超えると発生する ssh: Too many authentication failures (試行回数上限を超えると発生するエラー)を回避します。このエラーは、サーバー側で秘密鍵の試行回数上限を厳しく設定している場合に発生します。この問題は、ssh-agentに登録されている鍵を全てクリアして必要数分だけ登録するか、都度パスフレーズを入力することで回避できますが、複数の鍵とサーバーがある状況ではssh接続が非常に煩わしい作業になります。sshhは、Pythonの subprocess パッケージを使って新しいssh-agentを起動し、さらにssh-addを呼びだして必要な分の秘密鍵を一括登録します。これで煩わしい作業から開放されます。

Pythonのsubprocessパッケージは、外部コマンドを起動するのに非常に便利なライブラリです。単に外部コマンドを起動するだけでなく、標準入出力をPIPEで繋ぐことで、外部コマンドのコンソール入出力を制御して処理を対話的に進められます。また、PIPEで受け取った外部コマンドの出力をストリーミング処理して、順次処理することもできます。ssh-addコマンドもsubprocessで呼びだしてパスフレーズをPIPEで渡すつもりでしたが、これは簡単ではありませんでした。

このトークでは、subprocessについて概要を紹介し、起動したプログラムの標準入出力とPythonをPIPEで繋ぎ対話的に入出力する方法を紹介します。そして、PIPEの出力を効率的にストリーミング処理する方法と、subprocessで扱えないssh-addの入出力を制御する方法を紹介します。

アジェンダ

  1. sshhの紹介
  2. 外部コマンドを起動するsubprocessパッケージの紹介
  3. os.systemやos.spawnとの違い
  4. 外部コマンドの標準出力を効率的にストリーミング処理する
  5. PIPEによる外部コマンドの対話的な制御
  6. 標準入出力で扱えないsshコマンドのパスフレーズ入力の制御