Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

Running JCTerm on MacOSX

閲覧: 9 回
最初の未読メッセージにスキップ

Yasushi Shinjo

未読、
2003/11/11 10:10:492003/11/11
To:
新城@筑波大学情報です。こんにちは。

前の記事(<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 としておきます。
よろしくお願いします。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

maeda...@ialab.is.tsukuba.ac.jp

未読、
2003/11/11 20:18:102003/11/11
To:
推測ですが,

(1) クラスファイルがうまくロードできないので,公開鍵暗号に基づく認証が使えない.
(2) HostBasedAuthenticationをしようとして,特権ポートがbindできない.

という順でエラーになっているのではないでしょうか.

examples/READMEによると,CLASSPATHの設定が必要みたいですが,これは行なっ
てみましたでしょうか?

前田敦司

maeda...@ialab.is.tsukuba.ac.jp

未読、
2003/11/11 20:28:402003/11/11
To:
maeda...@ialab.is.tsukuba.ac.jp writes:

> 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 は存在するのでしょうか?

前田敦司

Yasushi Shinjo

未読、
2003/11/12 5:15:212003/11/12
To:
新城@筑波大学情報です。こんにちは。

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 しても同じでした。
なんなんでしょうね。

MAEDA Atusi

未読、
2003/11/12 11:01:532003/11/12
To:
y...@is.tsukuba.ac.jp (Yasushi Shinjo) 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)
> ------------------------------------------------------------

良く見たら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用ってあるんですか?)

前田敦司

Yasushi Shinjo

未読、
2003/11/12 12:44:262003/11/12
To:
新城@筑波大学情報です。

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 の問題か。

Yasushi Shinjo

未読、
2003/11/12 13:04:352003/11/12
To:
新城です。ちょっと捕捉。

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

Yasushi Shinjo

未読、
2003/11/14 14:14:432003/11/14
To:
新城@筑波大学情報です。こんにちは。

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);

MAEDA Atusi

未読、
2003/11/15 3:27:402003/11/15
To:
y...@is.tsukuba.ac.jp (Yasushi Shinjo) writes:

> 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とかを動かす必要はありませんね.

前田敦司

新着メール 0 件