1 JSch介绍
JSch是SSH2的纯Java实现 。JSch允许您连接到sshd服务器并使用端口转发,X11转发,文件传输等,您可以将其功能集成到您自己的Java程序中。本文主要介绍利用JSch实现sftp通过ssh上传下载文件和一些相关配置。
2 编码使用
2.1 JSch的引用
1)项目中导入jsch-0.1.53.jar包
下载地址:https://sourceforge.net/projects/jsch/files/jsch/0.1.53/jsch-0.1.53.zip/download
2)Maven中引用的pom.xml配置
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.53</version> </dependency>
gradle: compile group: 'com.jcraft', name: 'jsch', version: '0.1.53'
2.2 JSch连接配置代码
public class SFTP{ private Session session;//会话 private Channel channel;//连接通道 private ChannelSftp sftp;// sftp操作类 public Session getSession() { return session; } public void setSession(Session session) { this.session = session; } public Channel getChannel() { return channel; } public void setChannel(Channel channel) { this.channel = channel; } public ChannelSftp getSftp() { return sftp; } public void setSftp(ChannelSftp sftp) { this.sftp = sftp; } } public static void getConnect(SFTP s) throws Exception { /** 密钥的密码 */ // String privateKey ="key"; // /** 密钥文件路径 */ // String passphrase ="path"; /** 主机 */ String host ="127.0.0.1"; /** 端口 */ int port =22; /** 用户名 */ String username ="test"; /** 密码 */ String password ="test"; Session session = null; Channel channel = null; ChannelSftp sftp = null;// sftp操作类 JSch jsch = new JSch(); //设置密钥和密码 //支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息 // if (privateKey != null && !"".equals(privateKey)) { // if (passphrase != null && "".equals(passphrase)) { // //设置带口令的密钥 // jsch.addIdentity(privateKey, passphrase); // } else { // //设置不带口令的密钥 // jsch.addIdentity(privateKey); // } // } session = jsch.getSession(username, host, port); session.setPassword(password); Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey session.setConfig(config); try { session.connect(); } catch (Exception e) { if (session.isConnected()) session.disconnect(); } channel = session.openChannel("sftp"); try { channel.connect(); } catch (Exception e) { if (channel.isConnected()) channel.disconnect(); } sftp = (ChannelSftp) channel; s.setChannel(channel); s.setSession(session); s.setSftp(sftp); } /*断开连接*/ public static void disConn(Session session,Channel channel,ChannelSftp sftp)throws Exception{ if(null != sftp){ sftp.disconnect(); sftp.exit(); sftp = null; } if(null != channel){ channel.disconnect(); channel = null; } if(null != session){ session.disconnect(); session = null; } }
2.3 使用JSch上传下载删除文件代码
1)上传文件代码
/** * 上传文件 * @param directory 上传的目录-相对于SFPT设置的用户访问目录, * 为空则在SFTP设置的根目录进行创建文件(除设置了服务器全磁盘访问) */ public static void upload(String directory,InputStream in,String name) throws Exception { SFTP s=new SFTP(); getConnect(s);//建立连接 Session session = s.getSession(); Channel channel = s.getChannel(); ChannelSftp sftp = s.getSftp();// sftp操作类 try{ sftp.cd(directory); //进入目录 }catch(SftpException sException){ if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){ //指定上传路径不存在 sftp.mkdir(directory);//创建目录 sftp.cd(directory); //进入目录 } } sftp.put(in, name); in.close(); disConn(session,channel,sftp); }
2)下载文件代码
/** * 下载文件 * @param directory 下载目录 根据SFTP设置的根目录来进行传入 * @param downloadFile 下载的文件 * @param saveFile 存在本地的路径 */ public static void download(String directory, String downloadFile,String saveFile) throws Exception { SFTP s=new SFTP(); getConnect(s);//建立连接 Session session = s.getSession(); Channel channel = s.getChannel(); ChannelSftp sftp = s.getSftp();// sftp操作类 try { sftp.cd(directory); //进入目录 File file = new File(saveFile); boolean bFile; bFile = false; bFile = file.exists(); if (!bFile) { bFile = file.mkdirs();//创建目录 } OutputStream out=new FileOutputStream(new File(saveFile,downloadFile)); sftp.get(downloadFile, out); out.flush(); out.close(); } catch (Exception e) { throw new Exception(e.getMessage(),e); } finally { disConn(session,channel,sftp); } }
3)删除文件代码
/** * 删除文件 * @param directory 要删除文件所在目录 * @param deleteFile 要删除的文件 */ public static void delete(String directory, String deleteFile) throws Exception { SFTP s=new SFTP(); getConnect(s);//建立连接 Session session = s.getSession(); Channel channel = s.getChannel(); ChannelSftp sftp = s.getSftp();// sftp操作类 try { sftp.cd(directory); //要删除的目录的上一级 sftp.rm(deleteFile);//删除目录 } catch (Exception e) { throw new Exception(e.getMessage(),e); } finally { disConn(session,channel,sftp); } }
2.4 拓展功能java使用命令操作linux
#添加用户 useradd -d /home/test -m fgb #-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。 创建fgb用户 指定主目录为/home/test #修改用户密码 echo password | passwd --stdin username 示例:把root用户的密码修改成123456 echo "123456" | passwd --stdin root #删除用户 userdel -r username 示例:把fgb用户删除 userdel -r fgb #给用户赋予某个文件夹权限 chown 700 fgb /usr/local/test 给fgb用户赋予/usr/local/test目录700权限
首先pom文件导入依赖
<dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency>
工具类
public class SshBasic{ //连接,登陆 public Connection login(String hostname,int port,String username,String password){ //获取连接 Connection conn = new Connection(hostname, port); try { //连接 conn.connect(); //输入账号密码登陆 boolean isAuthenticated = conn.authenticateWithPassword(username, password); //登陆失败,返回错误 if(isAuthenticated == false){ throw new IOException("isAuthentication failed."); } } catch (IOException e) { e.printStackTrace(); } return conn; } //获取Session public Session getSession(Connection conn){ Session sess = null; try { sess = conn.openSession(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sess; } }
代码调用
public static void main(String[] args) { SshBasic m = new SshBasic(); //连接并登陆 Connection conn = m.login("132.122.1.51", 22, "srglweb", "srglweb123"); //获取Session Session sess = m.getSession(conn); //执行命令 下面命令是删除用户fgb try{ sess.execCommand("userdel -r fgb") }catch(IOException e){ e.printStackTrace(); } //判断会话是否成功 int result = sess.getExitStatus();//如果成功返回0 System.out.println("result:"+result); //释放资源 sess.close(); conn.close(); } }