/* * Copyright (C) 2012 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.crsh.ssh; import org.apache.sshd.ClientSession; import org.apache.sshd.SshClient; import org.apache.sshd.client.channel.ChannelShell; import org.apache.sshd.common.PtyMode; import org.apache.sshd.common.util.SttySupport; import org.crsh.util.Utils; import java.io.*; import java.util.Map; public class SSHClient { static final String TTY = "speed 9600 baud; 36 rows; 180 columns;\n" + "lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl\n" + "\t-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo\n" + "\t-extproc\n" + "iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8\n" + "\t-ignbrk brkint -inpck -ignpar -parmrk\n" + "oflags: opost onlcr -oxtabs -onocr -onlret\n" + "cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow\n" + "\t-dtrflow -mdmbuf\n" + "cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;\n" + "\teol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;\n" + "\tmin = 1; quit = ^\\; reprint = ^R; start = ^Q; status = ^T;\n" + "\tstop = ^S; susp = ^Z; time = 0; werase = ^W;"; /** . */ private OutputStream out; /** . */ private InputStream in; /** . */ private SshClient client; /** . */ private ClientSession session; /** . */ private ChannelShell channel; /** . */ private int port; public SSHClient() { this(2000); } public SSHClient(int port) { this.port = port; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public SSHClient connect() throws Exception { Map<PtyMode, Integer> tty = SttySupport.parsePtyModes(TTY); // SshClient client = SshClient.setUpDefaultClient(); client.start(); // ClientSession session = client.connect("localhost", port).await().getSession(); session.authPassword("root", ""); // ChannelShell channel = (ChannelShell)session.createShellChannel(); channel.setPtyModes(tty); // PipedOutputStream out = new PipedOutputStream(); PipedInputStream channelIn = new PipedInputStream(out); // PipedOutputStream channelOut = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(channelOut); // channel.setIn(channelIn); channel.setOut(channelOut); channel.setErr(new ByteArrayOutputStream()); channel.open(); // this.channel = channel; this.client = client; this.session = session; this.out = out; this.in = in; // return this; } public SSHClient write(CharSequence s) throws IOException { return write(s.toString().getBytes("UTF-8")); } public int read() throws IOException { return in.read(); } public SSHClient write(byte... bytes) throws IOException { out.write(bytes); return this; } public SSHClient flush() throws IOException { out.flush(); return this; } public SSHClient close() { try { Utils.close(out); channel.close(false); session.close(false); client.stop(); return this; } finally { this.client = null; this.channel = null; this.session = null; this.out = null; } } }