Java通过ssh向服务器上传下载删除文件和操作Linux
Posted 赵广陆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java通过ssh向服务器上传下载删除文件和操作Linux相关的知识,希望对你有一定的参考价值。
目录
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();
以上是关于Java通过ssh向服务器上传下载删除文件和操作Linux的主要内容,如果未能解决你的问题,请参考以下文章
java使用Jsch实现远程操作linux服务器进行文件上传下载,删除和显示目录信息