日期:2014-05-16  浏览次数:20541 次

Jsch使用

?

?

Jsch shell模式下的代码示例:

参考:http://stackoverflow.com/questions/6770206/what-is-the-difference-between-the-shell-channel-and-the-exec-channel-in-jsc

?

import java.io.OutputStream;
import java.io.PrintStream;

import javax.swing.JOptionPane;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;

public class JschShellTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Session session = null;
		Channel channel = null;
		String host = "127.0.0.1", user = "conkeyn", passwd = "123456";

		Integer port = 2222;

		JSch jsch = new JSch();

		try {
			String dir = Shell.class.getClassLoader().getResource(".").getFile();
			//把已经连接过的主机保存到known_hosts文件中。
			jsch.setKnownHosts(dir + ".ssh/known_hosts");
			session = jsch.getSession(user, host, port);
			session.setPassword(passwd);
			UserInfo ui = new MyUserInfo() {
				public void showMessage(String message) {
					JOptionPane.showMessageDialog(null, message);
				}

				public boolean promptYesNo(String message) {
					Object[] options = { "yes", "no" };
					int foo = JOptionPane.showOptionDialog(null, message, "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]);
					return foo == 0;
				}

				// If password is not given before the invocation of
				// Session#connect(),
				// implement also following methods,
				// * UserInfo#getPassword(),
				// * UserInfo#promptPassword(String message) and
				// * UIKeyboardInteractive#promptKeyboardInteractive()

			};

			session.setUserInfo(ui);
			session.connect(30000);

			channel = session.openChannel("shell");

			//相对channel与sshd端,channel输出流是用于输出命令到sshd。
			OutputStream inputstream_for_the_channel = channel.getOutputStream();
			PrintStream commander = new PrintStream(inputstream_for_the_channel, true);

			channel.setOutputStream(System.out, true);
			
			// 可以使用以下注释的代码替代“channel.setOutputStream(System.out, true);”
			//相对channel与sshd端,channel输入流是用于接收sshd输出结果的
			// InputStream outputstream_from_the_channel = channel.getInputStream();
			// BufferedReader br = new BufferedReader(new InputStreamReader(outputstream_from_the_channel));
			// String line;
			// while ((line = br.readLine()) != null)
			// System.out.print(line+"\n");

			channel.connect();

			commander.println("ls -la");
			commander.println("cd ~");
			commander.println("ls -la");
			commander.println("exit");
			commander.close();

			//如果输出到结尾,则可以退出等待。
			do {
				Thread.sleep(1000);
			} while (!channel.isEOF());
		} catch (Exception e) {
			e.printStackTrace();
		}

		session.disconnect();

	}

}
?

?