サンプルプログラムは, githubのharuyama/ssh_client_sampleにあります.

このWikiでの解説は, 20110713 branch を元に行ないます.

目的


このプログラムは, SSHプロトコルの理解を助けることを目的としています. 実用的なSSHの実装を作成するつもりはありません.

src/main/scala/org/unixuser/haruyama/ssh/SSHClientSample.scala at master from haruyama/ssh_client_sample - GitHub を眺めるとなんとなくSSHプロトコルについてわかる, このWikiを見るともうちょっとわかる, というのが目的です.

ライセンス


Public domain です.

Byte列のパースのために以下に挙がっている実装を利用しています. Scala本体のForumに挙がっているものなので, 自由に利用してよいと解釈しました.

暗号の実装は, Ganymed SSH-2 for Java を利用しています(私は再配布していません).

制約

  • テストで利用したサーバの出力するメッセージの順番に依存しています. 特にコネクションプロトコルの実装は, 別の環境では動作しないかもしれません.
    • 各メッセージの受信時に Scalaの asInstance で型を指定しているのは, ソース閲覧時に理解しやすくするためです. プロトコル上問題がない別のメッセージが来る可能性があるので, 本来はもっと柔軟に処理できなければなりません.

ビルド

sbt 0.10.* を利用します.
Ganymed SSH-2 for Java を取得し 'ganymed-ssh2-build210/ganymed-ssh2-build210.jar' を 'lib/ganymed-ssh2-build210.jar' として配置する必要があります.


sbt compile でビルドできます.

実行例


ローカルホストにid:test, password:test というユーザを作成して, 「ls」コマンドを実行してみた結果です. 外からアクセスできるホストにこのようなユーザは作らないようにしましょう.

% ls -l ~test
合計 0
-rw-r--r-- 1 test test 0 2011-06-21 13:33 a
-rw-r--r-- 1 root root 0 2011-06-21 13:25 hotate
-rw-r--r-- 1 root root 0 2011-07-04 15:11 ほげ

% scala -cp lib/ganymed-ssh2-build210.jar target/scala-2.9.0.final/ssh-client-sample_2.9.0-1.0.jar localhost 22 test test "ls -l" 
合計 0
-rw-r--r-- 1 test test 0 2011-06-21 13:33 a
-rw-r--r-- 1 root root 0 2011-06-21 13:25 hotate
-rw-r--r-- 1 root root 0 2011-07-04 15:11 ほげ

メンバーのみ編集できます