ssh-spring-boot-starter is a java client for SSH designed for performance and ease of use.
- 🎯 Easy to Use: This is a spring-boot-starter project, just need add it to the maven pom.xml.
 - 🚀 High Performance: Use Apache Commons Pool2 to realize the pooling of session and realize the reusability of session.
 - 📈 Monitor: It can realize the control of the file upload rate and size, and realize the transmission process can be monitored
 
To get started with ssh-spring-boot-starter, first add it as a dependency in your Spring-boot project. If you're using Maven, that looks like this:
<dependency>
    <groupId>io.github.DarkAssassinator</groupId>
    <artifactId>ssh-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>If you're using Gradle, that looke like this:
implementation group: 'io.github.DarkAssassinator', name: 'ssh-spring-boot-starter', version: '1.0.0'And you should add ssh session configuration in your yml file:
ssh:
  session:
    # ACP session pool config
    pool:
      # The maximum number of active ssh session instances in the pool.
      maxTotal: 20
      # The maximum number of active ssh session of per ssh host in the pool.
      maxTotalPerKey: 10
      # The maximum number of sleeping instances of per ssh host in the pool.
      maxIdlePerKey: 4
      # When borrow an ssh session, whether to block waiting for a session when the pool is exhausted
      blockWhenExhausted: true
      # The maximum waiting time for the caller when the pool session is exhausted, it will be ignored if blockWhenExhausted is false
      maxWaitDuration: 500ms
      # The minimum time to allow idle session to live (or not be evicted)
      minEvictableIdleDuration: 60s
      # The interval at which the eviction thread pool scans the pool for free sessions
      durationBetweenEvictionRuns: 60s
      # Whether borrowObject performs abandoned session removal
      removeAbandonedOnBorrow: true
      # How long the object has been unused and returned after it was lent out and used for the last time is considered a leak
      removeAbandonedTimeoutDuration: 30s
    sftp:
      # enable upload monitor thread when upload files to remote host
      enableUploadMonitor: true
      # max upload rate (KB), if negative, will not limit
      maxUploadRate: 256
      # max file size (MB), if negative, will not limit
      maxFileSize: 100Please check the :
| Parameter | Default | Desc | 
|---|---|---|
| ssh.session.pool.maxTotal | 20 | The maximum number of active ssh session instances in the pool. | 
| ssh.session.pool.maxTotalPerKey | 10 | The maximum number of active ssh session of per ssh host & account in the pool. | 
| ssh.session.pool.maxIdlePerKey | 4 | The maximum number of sleeping instances of per ssh host in the pool. | 
| ssh.session.pool.blockWhenExhausted | true | When borrow an ssh session, whether to block waiting for a session when the pool is exhausted | 
| ssh.session.pool.maxWaitDuration | 500ms | The maximum waiting time for the caller when the pool session is exhausted, it will be ignored if blockWhenExhausted is false | 
| ssh.session.pool.minEvictableIdleDuration | 60s | The minimum time to allow idle session to live (or not be evicted) | 
| ssh.session.pool.durationBetweenEvictionRuns | 60s | The interval at which the eviction thread pool scans the pool for free sessions | 
| ssh.session.pool.removeAbandonedOnBorrow | true | Whether borrowObject performs abandoned session removal | 
| ssh.session.pool.removeAbandonedTimeoutDuration | 30s | How long the object has been unused and returned after it was lent out and used for the last time is considered a leak | 
| ssh.session.sftp.enableUploadMonitor | true | enable upload monitor thread when upload files to remote host | 
| ssh.session.sftp.maxUploadRate | 256 | max upload rate (KB), if negative, will not limit | 
| ssh.session.sftp.maxFileSize | 100 | max file size (MB), if negative, will not limit | 
Next, you can instantiate a SSH Session pool like
@Autowired
private SshSessionPool sessionPool;Then you should create a SSH Session Host Entity named SshSession. See the example below:
SshSession sshSession = new SshSession();
sshSession.setIp("xx.xx.xx.xx");
sshSession.setPort(22);
sshSession.setAccount("root");
sshSession.setPassword("this is a password");Next, you can borrow a session holder from SessionPool.
SshSessionHolder sessionHolder = null;
try {
   sessionHolder = sessionPool.getSessionHolder(sshSession);
} catch (Exception e) {
   log.error("cannot borrowObject ssh session holder", e);
} finally {
   sessionPool.returnSshSessionHolder(sshSession, sessionHolder);
}How to execute shell command:
sessionHolder.execCommand("echo 'hello world'");