前の記事(<YAS.03No...@kirk.is.tsukuba.ac.jp> )は、
Eclipse の話でした。
この記事は、JCTerm という Java で書かれた SSH の端末ソフトウェ
アの話です。
http://www.jcraft.com/jsch/ -- SSH のエンジン
http://www.jcraft.com/jcterm/ -- 端末
(http://www.jcraft.com/eclipse-cvsssh2/ -- Eclipse のプラグイン)
JCTerm 0.1.8 を MacOSX 10.2.8 で動かし、接続しようとすると、
こんな感じのエラーが出ます。
------------------------------------------------------------
% java -classpath ../jsch-0.1.8/src:./src com.jcraft.jcterm.JCTerm
java.lang.ClassNotFoundException: com.jcraft.jsch.jce.Random
java.net.BindException: Can't assign requested address
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:331)
at java.net.Socket.bind(Socket.java:472)
at java.net.Socket.<init>(Socket.java:289)
at java.net.Socket.<init>(Socket.java:119)
at com.jcraft.jsch.Session.connect(Session.java:165)
at com.jcraft.jcterm.JCTerm.run(JCTerm.java:216)
at java.lang.Thread.run(Thread.java:554)
------------------------------------------------------------
どうしたものでしょうか。Random とあるので乱数回りのような気
もしますし、address がどうこうと Native Method で出ているの
で、その辺りの問題のような気もします。これが直ると、Esclipse
の方もなんとかなるかもしれません。
今使っている Java は、こんな感じです。
------------------------------------------------------------
% java -version
java version "1.4.1_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-69.1)
Java HotSpot(TM) Client VM (build 1.4.1_01-24, mixed mode)
%
------------------------------------------------------------
続きは、一応、Followup-To: fj.sys.mac.os-x としておきます。
よろしくお願いします。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
(1) クラスファイルがうまくロードできないので,公開鍵暗号に基づく認証が使えない.
(2) HostBasedAuthenticationをしようとして,特権ポートがbindできない.
という順でエラーになっているのではないでしょうか.
examples/READMEによると,CLASSPATHの設定が必要みたいですが,これは行なっ
てみましたでしょうか?
前田敦司
> examples/READMEによると,CLASSPATHの設定が必要みたいですが,これは行なっ
> てみましたでしょうか?
失礼しました.
> % java -classpath ../jsch-0.1.8/src:./src com.jcraft.jcterm.JCTerm
> java.lang.ClassNotFoundException: com.jcraft.jsch.jce.Random
CLASSPATHは指定してるんですね.
./src/com/jcraft/jsch/jch/Random.class は存在するのでしょうか?
前田敦司
In article <m3he1a5...@maedapc.cc.tsukuba.ac.jp>
maeda...@ialab.is.tsukuba.ac.jp writes:
> > % java -classpath ../jsch-0.1.8/src:./src com.jcraft.jcterm.JCTerm
> > java.lang.ClassNotFoundException: com.jcraft.jsch.jce.Random
> ./src/com/jcraft/jsch/jch/Random.class は存在するのでしょうか?
あ、これは存在しませんでした。javac com/jcraft/jsch/*.java
はしたのですが、その子供までは javac していませんでした。そ
の部分を javac *java して Random.class を作るとRandom 云々の
エラーは消えましたが、状況はあまり変りません。
In article <m3llqm5...@maedapc.cc.tsukuba.ac.jp>
maeda...@ialab.is.tsukuba.ac.jp writes:
> (2) HostBasedAuthenticationをしようとして,特権ポートがbindできない.
root でやってみても、この通りです。メニューから接続に行くと
こうなります。
------------------------------------------------------------
# java -classpath ../jsch-0.1.8/src:./src com.jcraft.jcterm.JCTerm
java.net.BindException: Can't assign requested address
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:331)
at java.net.Socket.bind(Socket.java:472)
at java.net.Socket.<init>(Socket.java:289)
at java.net.Socket.<init>(Socket.java:119)
at com.jcraft.jsch.Session.connect(Session.java:165)
at com.jcraft.jcterm.JCTerm.run(JCTerm.java:216)
at java.lang.Thread.run(Thread.java:554)
------------------------------------------------------------
この部分のソース・プログラムを見てみました。
------------------------------------------------------------
public void connect() throws JSchException{
...
if(proxy==null){
...
if(socket_factory==null){
if(timeout==0){
165: socket=new Socket(host, port);
}
else{
...
new Thread(new Runnable(){
sockp[0]=new Socket(host, port);
...
------------------------------------------------------------
まあ普通ですよね。しかし、上のバックとレースを見ると、
Socket() (クライアント側)なのに、bind しているということにな
ります。何か変な感じ。サーバ側なら bind は、必須として
クライアント側ではやらなくてもいいはずなのに。
ktrace で確認するとたしかに bind(2) していました。
------------------------------------------------------------
2313 java CALL socket(0x1e,0x1,0)
2313 java RET socket 11/0xb
2313 java CALL listen(0xb,0x1)
2313 java RET listen -1 errno 49 Can't assign requested address
2313 java CALL close(0xb)
2313 java RET close 0
2313 java CALL socket(0x1e,0x1,0)
2313 java RET socket 11/0xb
2313 java CALL bind(0xb,0xf06bc560,0x1c)
2313 java RET bind -1 errno 49 Can't assign requested address
2313 java CALL shutdown(0xb,0x2)
2313 java RET shutdown 0
2313 java CALL close(0xb)
2313 java RET close 0
2313 java CALL write(0x2,0xf06b8160,0x36)
2313 java GIO fd 2 wrote 54 bytes
"java.net.BindException: Can't assign requested address"
2313 java RET write 54/0x36
------------------------------------------------------------
> examples/READMEによると,CLASSPATHの設定が必要みたいですが,これは行なっ
> てみましたでしょうか?
java -classpath ではなくて setenv しても同じでした。
なんなんでしょうね。
> > (2) HostBasedAuthenticationをしようとして,特権ポートがbindできない.
>
> root でやってみても、この通りです。メニューから接続に行くと
> こうなります。
> ------------------------------------------------------------
> # java -classpath ../jsch-0.1.8/src:./src com.jcraft.jcterm.JCTerm
> java.net.BindException: Can't assign requested address
> at java.net.PlainSocketImpl.socketBind(Native Method)
> at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:331)
> at java.net.Socket.bind(Socket.java:472)
> at java.net.Socket.<init>(Socket.java:289)
> at java.net.Socket.<init>(Socket.java:119)
> at com.jcraft.jsch.Session.connect(Session.java:165)
> at com.jcraft.jcterm.JCTerm.run(JCTerm.java:216)
> at java.lang.Thread.run(Thread.java:554)
> ------------------------------------------------------------
良く見たらEACCESSじゃなくてEADDRNOTAVAILですね.
> sockp[0]=new Socket(host, port);
> ...
> ------------------------------------------------------------
> まあ普通ですよね。しかし、上のバックとレースを見ると、
> Socket() (クライアント側)なのに、bind しているということにな
> ります。何か変な感じ。サーバ側なら bind は、必須として
> クライアント側ではやらなくてもいいはずなのに。
Socket.javaのソースを見ると,
new java.net.Socket(host, port)
すると,
new java.net.Socket(new InetSocketAddress(host, port),
new InetSocketAddress(InetAddress.anyLocalAddress, 0),
true)
が呼ばれるみたいです.
で,InetAddress.anyLocalAddress (要するにINADDR_ANY) の port 0 に対し
てbindを行ないます.ここでEADDRNOTAVAIL (そんなインターフェースはない
or ローカルじゃない)が返ってきています.
# ところで,お使いのJavaは,どのOS用ですか? (MacOS-X用ってあるんですか?)
前田敦司
In article <m3k7654...@maedapc.cc.tsukuba.ac.jp>
MAEDA Atusi <maeda...@ialab.is.tsukuba.ac.jp> writes:
> # ところで,お使いのJavaは,どのOS用ですか? (MacOS-X用ってあるんですか?)
はい。MacOSX 用の Java は、Apple が出していて、バージョンは、
こんな感じです。
------------------------------------------------------------
% java -version
java version "1.4.1_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-69.1)
Java HotSpot(TM) Client VM (build 1.4.1_01-24, mixed mode)
% uname -a
Darwin sharon 6.8 Darwin Kernel Version 6.8: Wed Sep 10 15:20:55 PDT 2003; root:xnu/xnu-344.49.obj~2/RELEASE_PPC Power Macintosh powerpc
%
------------------------------------------------------------
> Socket.javaのソースを見ると,
> new java.net.Socket(host, port)
> すると,
> new java.net.Socket(new InetSocketAddress(host, port),
> new InetSocketAddress(InetAddress.anyLocalAddress, 0),
> true)
> が呼ばれるみたいです.
> で,InetAddress.anyLocalAddress (要するにINADDR_ANY) の port 0 に対し
> てbindを行ないます.ここでEADDRNOTAVAIL (そんなインターフェースはない
> or ローカルじゃない)が返ってきています.
Java が悪いか、MacOSX が悪いか。Cで書いて見ればどうなるかと
いうと、、、クライアントで bind しても動くなあ。MacOSX の
Java の問題か。
Java で簡単なプログラムを書いてみた所、Socket(host,port)が怪
しいです。Socket() して、connect() なら動きます。
------------------------------------------------------------
// Socket s = new Socket(host, port); // ダメ。
Socket s = new Socket();
InetSocketAddress addr = new InetSocketAddress( host, port );
s.connect( addr, 0 );
------------------------------------------------------------
J2SE で、Socket(host,port)の意味が変ったとか、そんな話はない
ですよね。
http://java.sun.com/j2se/1.4.1/docs/api/index.html
Java で書かれた JCTerm という SSH の端末ソフトウェアが、
MacOSX で動かないという話ですが、問題は解決しました。どうも、
それが依存している jsch-0.1.8 から呼んでいる、MacOSX の java
の Socket(host,port) が動作しない(1.4.1_01) ということのよう
です。変りに Socket() してconnect() してあげると動きました。
パッチを末尾に付けます。
それで動くのは動いたのですが、だいぶ遅いですね。漢字も表示は
できるみたいです。その辺りは、Java の恐ろしい所。打ち込むの
はできないみたいですけれど。あと vt100 のエミュレーションは
していないみたいです。端末としては、まだまだ未熟かなあと思い
ます。Java なので、バッファ・オーバーフローの心配もないし、
OpenSSH のバグが出た時などの緊急時に備えて手元に用意しておく
といいかと思います。
そういえば、JCTerm には sftp も付いていますね。メニューから
は、トンネリング(ポートフォワーディング)もできそうです。ロー
カル、リモート、X11の3種類。socks の proxy はいいとして、
HTTP の proxy って何なんでしょう?
日常的に JCTerm を使っている人はいますか?
OpenSSH の ssh-agent と交信する機能があるといいんだけどなあ。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
jsch-0.1.8/src/com/jcraft/jsch/
*** Session.java.~1~ Wed Sep 17 19:56:14 2003
--- Session.java Sat Nov 15 03:36:55 2003
***************
*** 165 ****
! socket=new Socket(host, port);
--- 165,168 ----
! // socket=new Socket(host, port);
! socket=new Socket();
! InetSocketAddress isaddr = new InetSocketAddress(host, port);
! socket.connect(isaddr, 0);
***************
*** 176 ****
! sockp[0]=new Socket(host, port);
--- 179,182 ----
! // sockp[0]=new Socket(host, port);
! sockp[0]=new Socket();
! InetSocketAddress isaddr = new InetSocketAddress(host, port);
! socket.connect(isaddr, 0);
> socks の proxy はいいとして、
> HTTP の proxy って何なんでしょう?
たぶん,ローカルのWebブラウザからのhttpリクエストを,リモートを経るよ
うに中継してくれるんじゃないでしょうか.こんな感じ.
ブラウザ←→ローカルssh←→リモートssh←→Webサーバ
特定の範囲のIPアドレスからしか見られないページとかにアクセスするために,
こういう機能が欲しい,という話がfjでも出ていたと思います.sshクライア
ントがhttpリクエストを見て,Webサーバにフォワーディングしてくれないと
いけません.
リモートssh側にsquidとかのhttp proxyが動いていれば,普通のsshクライア
ントで(ローカルポート→リモートポートのフォワーディングを1つ指定するだ
けで)実現できます.
ブラウザ←→ローカルssh←→リモートssh←→squid←→Webサーバ
sshクライアントにこの機能があれば,squidとかを動かす必要はありませんね.
前田敦司