public override void init() { try { io=new IO(); if(lport==-1) { Class c=Class.forName(target); ForwardedTCPIPDaemon daemon=(ForwardedTCPIPDaemon)c.newInstance(); daemon.setChannel(this); Object[] foo=getPort(session, rport); daemon.setArg((Object[])foo[3]); new Thread(daemon).start(); connected=true; return; } else { Socket socket=(factory==null) ? new Socket(target, lport) : factory.createSocket(target, lport); socket.setTcpNoDelay(true); io.setInputStream(socket.getInputStream()); io.setOutputStream(socket.getOutputStream()); connected=true; } } catch(Exception e) { Console.WriteLine("target={0},port={1}",target,lport); Console.WriteLine(e); } }
/* public void finalize() throws Throwable{ disconnect(); super.finalize(); session=null; } */ public virtual void disconnect() { //System.Out.println(this+":disconnect "+io+" "+io.in); if(!connected) { return; } connected=false; close(); _eof_remote=eof_local=true; thread=null; try { if(io!=null) { io.close(); } } catch(Exception e) { //e.printStackTrace(); } io=null; Channel.del(this); }
public ChannelSession():base() { type=_session; io=new IO(); }
public override void init() { try { io=new IO(); } catch(Exception e) { Console.WriteLine(e); } }
internal ChannelX11() : base() { setLocalWindowSizeMax(LOCAL_WINDOW_SIZE_MAX); setLocalWindowSize(LOCAL_WINDOW_SIZE_MAX); setLocalPacketSize(LOCAL_MAXIMUM_PACKET_SIZE); type=Util.getBytes("x11"); try { IPEndPoint ep = new IPEndPoint(Dns.GetHostByName(host).AddressList[0], port); socket=new Socket(ep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1); socket.Connect(ep); io=new IO(); NetworkStream ns = new NetworkStream( socket ); io.setInputStream(ns); io.setOutputStream(ns); } catch(Exception e) { Console.WriteLine(e); } }
/* public void finalize() throws Throwable{ disconnect(); jsch=null; } */ public void disconnect() { if(!_isConnected) return; //System.Console.WriteLine(this+": disconnect"); //Thread.dumpStack(); /* for(int i=0; i<Channel.pool.size(); i++){ try{ Channel c=((Channel)(Channel.pool.elementAt(i))); if(c.session==this) c.eof(); } catch(Exception e){ } } */ Channel.disconnect(this); _isConnected=false; PortWatcher.delPort(this); ChannelForwardedTCPIP.delPort(this); lock(connectThread) { connectThread.yield(); connectThread.interrupt(); connectThread=null; } thread=null; try { if(io!=null) { if(io.ins!=null) io.ins.Close(); if(io.outs!=null) io.outs.Close(); if(io.outs_ext!=null) io.outs_ext.Close(); } if(proxy==null) { if(socket!=null) socket.close(); } else { lock(proxy) { proxy.close(); } proxy=null; } } catch(Exception e) { // e.printStackTrace(); } io=null; socket=null; // lock(jsch.pool){ // jsch.pool.removeElement(this); // } jsch.removeSession(this); //System.gc(); }
public void connect(int connectTimeout) { if(_isConnected) { throw new JSchException("session is already connected"); } io=new IO(); if(random==null) { try { Class c=Class.forName(getConfig("random")); random=(Random)(c.newInstance()); } catch(Exception e) { System.Console.Error.WriteLine("connect: random "+e); } } Packet.setRandom(random); try { int i, j; int pad=0; if(proxy==null) { proxy=jsch.getProxy(host); if(proxy!=null) { lock(proxy) { proxy.close(); } } } if(proxy==null) { Stream In; Stream Out; if(socket_factory==null) { socket=Util.createSocket(host, port, connectTimeout); In=socket.getInputStream(); Out=socket.getOutputStream(); } else { socket=socket_factory.createSocket(host, port); In=socket_factory.getInputStream(socket); Out=socket_factory.getOutputStream(socket); } //if(timeout>0){ socket.setSoTimeout(timeout); } socket.setTcpNoDelay(true); io.setInputStream(In); io.setOutputStream(Out); } else { lock(proxy) { proxy.connect(this, host, port, connectTimeout); io.setInputStream(proxy.getInputStream()); io.setOutputStream(proxy.getOutputStream()); socket=proxy.getSocket(); } } if(connectTimeout>0 && socket!=null) { socket.setSoTimeout(connectTimeout); } _isConnected=true; i=0; j=0; while(i<buf.buffer.Length) { j=io.getByte(); if(j<0)break; buf.buffer[i]=(byte)j; i++; if(j==10)break; } if(j<0) { throw new JSchException("connection is closed by foreign host"); } if(buf.buffer[i-1]==10) { // 0x0a i--; if(buf.buffer[i-1]==13) { // 0x0d i--; } } if(i==buf.buffer.Length || i<7 || // SSH-1.99 or SSH-2.0 (buf.buffer[4]=='1' && buf.buffer[6]!='9') // SSH-1.5 ) { throw new JSchException("invalid server's version String"); } V_S=new byte[i]; Fireball.Ssh.java.System.arraycopy(buf.buffer, 0, V_S, 0, i); //System.Console.WriteLine("V_S: ("+i+") ["+new String(V_S)+"]"); //io.put(V_C, 0, V_C.Length); io.put("\n".getBytes(), 0, 1); { // Some Cisco devices will miss to read '\n' if it is sent separately. byte[] foo=new byte[V_C.Length+1]; Fireball.Ssh.java.System.arraycopy(V_C, 0, foo, 0, V_C.Length); foo[foo.Length-1]=(byte)'\n'; io.put(foo, 0, foo.Length); } buf=read(buf); //System.Console.WriteLine("read: 20 ? "+buf.buffer[5]); if(buf.buffer[5]!=SSH_MSG_KEXINIT) { throw new JSchException("invalid protocol: "+buf.buffer[5]); } KeyExchange kex=receive_kexinit(buf); while(true) { buf=read(buf); if(kex.getState()==buf.buffer[5]) { bool result=kex.next(buf); if(!result) { //System.Console.WriteLine("verify: "+result); in_kex=false; throw new JSchException("verify: "+result); } } else { in_kex=false; throw new JSchException("invalid protocol(kex): "+buf.buffer[5]); } if(kex.getState()==KeyExchange.STATE_END) { break; } } try{ checkHost(host, kex); } catch(JSchException ee) { in_kex=false; throw ee; } send_newkeys(); // receive SSH_MSG_NEWKEYS(21) buf=read(buf); //System.Console.WriteLine("read: 21 ? "+buf.buffer[5]); if(buf.buffer[5]==SSH_MSG_NEWKEYS) { receive_newkeys(buf, kex); } else { throw new JSchException("invalid protocol(newkyes): "+buf.buffer[5]); } bool auth=false; bool auth_cancel=false; UserAuthNone usn=new UserAuthNone(userinfo); auth=usn.start(this); String methods=usn.getMethods().toLowerCase(); // methods: publickey,password,keyboard-interactive if(methods==null) { methods="publickey,password,keyboard-interactive"; } loop: while(true) { //System.Console.WriteLine("methods: "+methods); while(!auth && methods!=null && methods.Length()>0) { //System.Console.WriteLine(" methods: "+methods); UserAuth us=null; if(methods.startsWith("publickey")) { //System.Console.WriteLine(" jsch.identities.size()="+jsch.identities.size()); lock(jsch.identities) { if(jsch.identities.size()>0) { us=new UserAuthPublicKey(userinfo); } } } else if(methods.startsWith("keyboard-interactive")) { if(userinfo is UIKeyboardInteractive) { us=new UserAuthKeyboardInteractive(userinfo); } } else if(methods.startsWith("password")) { us=new UserAuthPassword(userinfo); } if(us!=null) { try { auth=us.start(this); auth_cancel=false; } catch(JSchAuthCancelException ee) { //System.Console.WriteLine(ee); auth_cancel=true; } catch(JSchPartialAuthException ee) { methods=ee.getMethods(); //System.Console.WriteLine("PartialAuth: "+methods); auth_cancel=false; continue;//loop; } catch(RuntimeException ee) { throw ee; } catch(Exception ee) { System.Console.WriteLine("ee: "+ee); // SSH_MSG_DISCONNECT: 2 Too many authentication failures } } if(!auth) { int comma=methods.indexOf(","); if(comma==-1) break; methods=methods.subString(comma+1); } } break; } if(connectTimeout>0 || timeout>0) { socket.setSoTimeout(timeout); } if(auth) { isAuthed=true; connectThread=new Thread(this); connectThread.setName("Connect thread "+host+" session"); connectThread.start(); return; } if(auth_cancel) throw new JSchException("Auth cancel"); throw new JSchException("Auth fail"); } catch(Exception e) { if(_isConnected) { try { packet.reset(); buf.putByte((byte)SSH_MSG_DISCONNECT); buf.putInt(3); buf.putString(new String(e.ToString()).getBytes()); buf.putString(new String("en").getBytes()); write(packet); disconnect(); } catch(Exception ee) { } } _isConnected=false; //e.printStackTrace(); if(e is RuntimeException) throw (RuntimeException)e; if(e is JSchException) throw (JSchException)e; throw new JSchException("Session.connect: "+e); } }