16boke - 一路博客

通过java程序实现scp上传和下载文件

我们对ssh服务器进行文件上传和下载操作以及通过客户端直接发送命令来实现对服务器的操作该怎么实现呢?目前主流的还是直接在客户端使用shell脚本来实现,关于linux中ssh使用rsa免密码登录和下载文件的方法可以查看本站其他文章。今天我们提供另一种通过Java程序来访问ssh服务,并操作文件、传输文件、发执行命令等。

一般操作ssh服务器上的文件需要先进行登录,目前有两种登录方式:一是直接输入服务器的用户名和密码来登录,另一种是提前配置好rsa认证的私钥和公钥,下面我们这段Java程序也提供了这两种方式。

package com;

import java.io.File;
import java.io.IOException;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.SCPClient;

/**
 * ganymed的版本选择build210 
 * <dependency> 
 * <groupId>ch.ethz.ganymed</groupId> 
 * <artifactId>ganymed-ssh2</artifactId>
 * <version>build210</version> 
 * </dependency>
 */
public class TestScp {
	private static String IP = "192.168.1.5";
	private static int PORT = 22;
	private static String USER = "ubuntu";//登录用户名
	private static String PASSWORD = null;//生成私钥的密码和登录密码,这两个共用这个密码
	private static Connection connection = new Connection(IP, PORT);
	private static String PRIVATEKEY = "C:\\Users\\ubuntu\\.ssh\\id_rsa";// 本机的私钥文件
	private static boolean usePassword = false;// 使用用户名和密码来进行登录验证。如果为true则通过用户名和密码登录,false则使用rsa免密码登录

	/**
	 * ssh用户登录验证,使用用户名和密码来认证
	 * 
	 * @param user
	 * @param password
	 * @return
	 */
	public static boolean isAuthedWithPassword(String user, String password) {
		try {
			return connection.authenticateWithPassword(user, password);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * ssh用户登录验证,使用用户名、私钥、密码来认证 其中密码如果没有可以为null,生成私钥的时候如果没有输入密码,则密码参数为null
	 * 
	 * @param user
	 * @param privateKey
	 * @param password
	 * @return
	 */
	public static boolean isAuthedWithPublicKey(String user, File privateKey, String password) {
		try {
			return connection.authenticateWithPublicKey(user, privateKey, password);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}

	public static boolean isAuth() {
		if (usePassword) {
			return isAuthedWithPassword(USER, PASSWORD);
		} else {
			return isAuthedWithPublicKey(USER, new File(PRIVATEKEY), PASSWORD);
		}
	}

	public static void getFile(String remoteFile, String path) {
		try {
			connection.connect();
			boolean isAuthed = isAuth();
			if (isAuthed) {
				System.out.println("认证成功!");
				SCPClient scpClient = connection.createSCPClient();
				scpClient.get(remoteFile, path);
			} else {
				System.out.println("认证失败!");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			connection.close();
		}
	}

	public static void putFile(String localFile, String remoteTargetDirectory) {
		try {
			connection.connect();
			boolean isAuthed = isAuth();
			if (isAuthed) {
				SCPClient scpClient = connection.createSCPClient();
				scpClient.put(localFile, remoteTargetDirectory);
			} else {
				System.out.println("认证失败!");
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			connection.close();
		}
	}

	public static void main(String[] args) {
		try {
			// getFile("/home/users/ubuntu/error.txt", "c://");
			putFile("c://aaa.txt", "/home/users/ubuntu");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Java  scp  ssh  rsa