您的位置:首页 > 运维架构 > Apache

Java SSH库使用简介:Apache sshd和JSch(Java Secure Channel)

2015-09-15 19:27 871 查看

1.Apache sshd

Apache sshd是一个SSH协议的100%纯Java库,支持客户端和服务器。sshd库基于Apache MINA项目(可伸缩高性能的异步IO库)。

官方网站:http://mina.apache.org/sshd-project/documentation.html

客户端示例代码:

public void clentTest() throws IOException
{
String cmd="ifconfig";
SshClient client=SshClient.setUpDefaultClient();
client.start();
ClientSession session=client.connect("bellring", "10.2.48.179", 22).await().getSession();
 session.addPasswordIdentity("bellring");
     //session.addPublicKeyIdentity(SecurityUtils.loadKeyPairIdentity("keyname", new FileInputStream("priKey.pem"), null));
if(!session.auth().await().isSuccess())
System.out.println("auth failed");

ChannelExec ec=session.createExecChannel(cmd);
ec.setOut(System.out);
ec.open();
ec.waitFor(ClientChannel.CLOSED, 0);
ec.close();

client.stop();
}


public void sshdClientSftpTest() throws IOException, InterruptedException
{
Path src=Paths.get("src_sshd.txt");
Files.deleteIfExists(src);
Files.createFile(src);
Files.write(src, "adsfa\nsdfs".getBytes());

SshClient client=SshClient.setUpDefaultClient();
client.start();
ClientSession session=client.connect("bellring", "10.2.48.179", 22).await().getSession();
//session.addPasswordIdentity("bellring");
     session.addPublicKeyIdentity(SecurityUtils.loadKeyPairIdentity("keyname", new FileInputStream("priKey.pem"), null));

if(!session.auth().await().isSuccess())
System.out.println("auth failed");

SftpClient sftp=session.createSftpClient();

for(DirEntry de:sftp.readDir("."))
System.out.println(de.filename+" "+de.attributes.type);

OutputStream os=sftp.write("test/dst_sshd.txt");
Files.copy(src, os);
os.close();

//sftp.remove("delete_file.txt");

InputStream is=sftp.read("test/dst_sshd.txt");
Path dst=Paths.get("dst1_sshd.txt");
Files.deleteIfExists(dst);
Files.copy(is, dst);
is.close();

sftp.close();
client.stop();
}


服务器端示例代码:

public void serverTest() throws IOException, InterruptedException
{
 SshServer sshd = SshServer.setUpDefaultServer();
sshd.setPort(22);

//*give host key generator a path, when sshd server restart, the same key will be load and used to authenticate the server
sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(Paths.get("hostkey.ser")));

sshd.setPasswordAuthenticator(new PasswordAuthenticator(){
@Override
public boolean authenticate(String username, String password, ServerSession session) {
System.out.println("authen:  user="+username+"  password="+password);
if("bellring".equals(username) && "123456".equals(password))
return true;
return false;
}});

//use file ~/.ssh/authorized_keys
sshd.setPublickeyAuthenticator(new DefaultAuthorizedKeysAuthenticator(false));

//* CommandFactory can be userd in addition to the ShellFactory,
//*  it can also be used instead of the ShellFactory.
//*  The CommandFactory is used when direct commands are sent to the SSH server,
//*  as this is the case when running ssh localhost shutdown or scp xxx
ScpCommandFactory scpCmdFactory=new ScpCommandFactory();
scpCmdFactory.setDelegateCommandFactory(new CommandFactory() {
public Command createCommand(String command) {
System.out.println("command = \"" + command + "\"");
return new ProcessShellFactory(("cmd /c "+command).split(" ")).create();
}
});
sshd.setCommandFactory(scpCmdFactory);

sshd.start();
}


2.JSch(Java Secure Channel)

jsch也是SSH2的纯Java实现。依赖于JavaTm Cryptography Extension(JCE)。JSch支持客户端。

官网:http://www.jcraft.com/jsch/

示例:http://www.jcraft.com/jsch/examples/

客户端远程命令执行示例:

public void testJschClient() throws JSchException, InterruptedException
{
JSch jsch=new JSch();

     //set private key for auth
     jsch.addIdentity("yangtianxin_pc");

Session session=jsch.getSession("bellring", "10.2.48.179", 22);
session.setConfig("StrictHostKeyChecking", "no");

//set auth info interactively
//session.setUserInfo(new UserInfo(){.....});

//session.setPassword("bellring");
session.connect();

com.jcraft.jsch.ChannelExec ec=(com.jcraft.jsch.ChannelExec)session.openChannel("exec");
ec.setCommand("ifconfig");
ec.setInputStream(null);
ec.setErrStream(System.err);
ec.setOutputStream(System.out);
ec.connect();

while(!ec.isClosed())
Thread.sleep(500);

 ec.disconnect();
session.disconnect();
}


sftp文件操作示例

public void testJschClientSftp() throws JSchException, InterruptedException, SftpException, IOException
{
JSch jsch=new JSch();
    
     //add private key for auth
     //jsch.addIdentity("yangtianxin_pc");

Session session=jsch.getSession("bellring", "10.2.48.179", 22);
session.setConfig("StrictHostKeyChecking", "no");

//set auth info interactively
//session.setUserInfo(new UserInfo(){.....});

session.setPassword("bellring");
session.connect();

 com.jcraft.jsch.ChannelSftp sftpChannel=(com.jcraft.jsch.ChannelSftp)session.openChannel("sftp");
sftpChannel.connect();

Path src=Paths.get("src.txt");
Files.deleteIfExists(src);
Files.createFile(src);
Files.write(src, "adsfasdfs".getBytes());

@SuppressWarnings("unchecked")
Vector<LsEntry> vector=sftpChannel.ls(".");
for(LsEntry entry: vector)
System.out.println(entry.getFilename()+"    "+entry.getAttrs().getSize());

sftpChannel.cd("test");
sftpChannel.put("src.txt", "dst.txt");
sftpChannel.get("dst.txt", "dst1.txt");
sftpChannel.rm("dst.txt");

sftpChannel.disconnect();
session.disconnect();
System.out.println("done");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: