Class SSHClient
java.lang.Object
net.schmizz.sshj.SocketClient
net.schmizz.sshj.SSHClient
- All Implemented Interfaces:
RemoteAddressProvider, Closeable, AutoCloseable, SessionFactory
Secure SHell client API.
Before connection is established, host key verification needs to be accounted for. This is done by
specifying one or more HostKeyVerifier objects. Database of known
hostname-key pairs in the OpenSSH "known_hosts" format can be loaded for host
key verification.
User authentication can be performed by any of the auth*() method.
startSession() caters to the most typical use case of starting a session channel and executing a
remote command, starting a subsystem, etc. If you wish to request X11 forwarding for some session, first register a ConnectListener for x11 channels.
Local and remote port forwarding is possible. There
are also utility method for easily creating SCP and SFTP
implementations.
A simple example:
final SSHClient client = new SSHClient();
client.loadKnownHosts();
client.connect("hostname");
try {
client.authPassword("username", "password");
final Session session = client.startSession();
try {
final Command cmd = session.exec("true");
cmd.join(1, TimeUnit.SECONDS);
} finally {
session.close();
}
} finally {
client.disconnect();
}
Where a password or passphrase is required, if you're extra-paranoid use the char[] based method. The
char[] will be blanked out after use.-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected final UserAuthssh-userauthserviceprotected final Connectionssh-connectionservicestatic final intDefault port for SSHprivate final List<LocalPortForwarder> protected final org.slf4j.Loggerprotected final LoggerFactoryLoggerprotected Charsetcharacter set of the remote machineprotected final TransportTransport layer -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidaddAlgorithmsVerifier(AlgorithmsVerifier verifier) Add aAlgorithmsVerifierwhich will be invoked for verifying negotiated algorithms.voidaddHostKeyVerifier(String fingerprint) Add aHostKeyVerifierthat will verify any host that's able to claim a host key with the givenfingerprint.voidaddHostKeyVerifier(HostKeyVerifier verifier) Add aHostKeyVerifierwhich will be invoked for verifying host key during connection establishment and future key exchanges.voidauth(String username, Iterable<AuthMethod> methods) Authenticateusernameusing the suppliedmethods.voidauth(String username, AuthMethod... methods) Authenticateusernameusing the suppliedmethods.voidauthGssApiWithMic(String username, LoginContext context, Oid supportedOid, Oid... supportedOids) Authenticateusernameusing the"gssapi-with-mic"authentication method, given a login context for the peer GSS machine and a list of supported OIDs.voidauthPassword(String username, char[] password) Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication..voidauthPassword(String username, String password) Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication.voidauthPassword(String username, PasswordFinder pfinder) Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication.voidauthPassword(String username, PasswordFinder pfinder, PasswordUpdateProvider newPasswordProvider) Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication.voidauthPublickey(String username) Authenticateusernameusing the"publickey"authentication method, with keys from some common locations on the file system.voidauthPublickey(String username, Iterable<KeyProvider> keyProviders) Authenticateusernameusing the"publickey"authentication method.voidauthPublickey(String username, String... locations) Authenticateusernameusing the"publickey"authentication method, with keys from one or morelocationsin the file system.voidauthPublickey(String username, KeyProvider... keyProviders) Authenticateusernameusing the"publickey"authentication method.private voidprivate voidvoidclose()Same asdisconnect().voidDisconnects from the connected SSH server.protected voiddoKex()Do key exchange.Returns the character set used to communicate with the remote machine for certain strings (like paths).Get Remote Socket Address from TransportbooleanbooleanReturns aKeyProviderinstance created from a location on the file system where an unencrypted private key file (does not require a passphrase) can be found.Utility function for creating aKeyProviderinstance from given location on the file system.Convenience method for creating aKeyProviderinstance from alocationwhere an encrypted key file is located.loadKeys(String privateKey, String publicKey, PasswordFinder passwordFinder) Creates aKeyProviderinstance from passed strings.loadKeys(String location, PasswordFinder passwordFinder) Creates aKeyProviderinstance from given location on the file system.Creates aKeyProviderfrom suppliedKeyPair.voidAttempts loading the user'sknown_hostsfile from the default locations, i.e.voidloadKnownHosts(File location) Adds aOpenSSHKnownHostsobject created from the specified location as a host key verifier.newDirectConnection(String hostname, int port) Create aDirectConnectionchannel that connects to a remote address from the server.newLocalPortForwarder(Parameters parameters, ServerSocket serverSocket) Create aLocalPortForwarderthat will listen based onparametersusing the boundserverSocketand forward incoming connections to the server; which will further forward them tohost:port.Stateful FTP client is required in order to connect to Serv-U FTP servers.protected voidOn connection establishment, also initializes the SSH transport viaTransport.init(String, int, InputStream, OutputStream)anddoKex().registerX11Forwarder(ConnectListener listener) Register alistenerfor handling forwarded X11 channels.voidrekey()Does key re-exchange.voidsetRemoteCharset(Charset remoteCharset) Sets the character set used to communicate with the remote machine for certain strings (like paths)Opens asessionchannel.voidAddszlibcompression to preferred compression algorithms.Methods inherited from class SocketClient
connect, connect, connect, connect, connect, connect, connectVia, connectVia, getConnectTimeout, getInputStream, getLocalAddress, getLocalPort, getOutputStream, getRemoteAddress, getRemoteHostname, getRemotePort, getSocket, getSocketFactory, getTimeout, makeInetSocketAddress, setConnectTimeout, setSocketFactory, setTimeout
-
Field Details
-
DEFAULT_PORT
public static final int DEFAULT_PORTDefault port for SSH- See Also:
-
loggerFactory
Logger -
log
protected final org.slf4j.Logger log -
trans
Transport layer -
auth
ssh-userauthservice -
conn
ssh-connectionservice -
forwarders
-
remoteCharset
character set of the remote machine
-
-
Constructor Details
-
SSHClient
public SSHClient()Default constructor. Initializes this object usingDefaultConfig. -
SSHClient
-
-
Method Details
-
addHostKeyVerifier
Add aHostKeyVerifierwhich will be invoked for verifying host key during connection establishment and future key exchanges.- Parameters:
verifier-HostKeyVerifierinstance
-
addAlgorithmsVerifier
Add aAlgorithmsVerifierwhich will be invoked for verifying negotiated algorithms.- Parameters:
verifier-AlgorithmsVerifierinstance
-
addHostKeyVerifier
Add aHostKeyVerifierthat will verify any host that's able to claim a host key with the givenfingerprint. The fingerprint can be specified in either an MD5 colon-delimited format (16 hexadecimal octets, delimited by a colon), or in a Base64 encoded format for SHA-1 or SHA-256 fingerprints. Valid examples are:- "SHA1:2Fo8c/96zv32xc8GZWbOGYOlRak="
- "SHA256:oQGbQTujGeNIgh0ONthcEpA/BHxtt3rcYY+NxXTxQjs="
- "MD5:d3:5e:40:72:db:08:f1:6d:0c:d7:6d:35:0d:ba:7c:32"
- "d3:5e:40:72:db:08:f1:6d:0c:d7:6d:35:0d:ba:7c:32"
- Parameters:
fingerprint- expected fingerprint in colon-delimited format (16 octets in hex delimited by a colon)- See Also:
-
auth
public void auth(String username, AuthMethod... methods) throws UserAuthException, TransportException Authenticateusernameusing the suppliedmethods.- Parameters:
username- user to authenticatemethods- one or more authentication method- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
auth
public void auth(String username, Iterable<AuthMethod> methods) throws UserAuthException, TransportException Authenticateusernameusing the suppliedmethods.- Parameters:
username- user to authenticatemethods- one or more authentication method- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPassword
public void authPassword(String username, String password) throws UserAuthException, TransportException Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication.- Parameters:
username- user to authenticatepassword- the password to use for authentication- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPassword
public void authPassword(String username, char[] password) throws UserAuthException, TransportException Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication.. Thepasswordarray is blanked out after use.- Parameters:
username- user to authenticatepassword- the password to use for authentication- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPassword
public void authPassword(String username, PasswordFinder pfinder) throws UserAuthException, TransportException Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication.- Parameters:
username- user to authenticatepfinder- thePasswordFinderto use for authentication- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPassword
public void authPassword(String username, PasswordFinder pfinder, PasswordUpdateProvider newPasswordProvider) throws UserAuthException, TransportException Authenticateusernameusing the"password"authentication method and as a fallback basic challenge-response authentication.- Parameters:
username- user to authenticatepfinder- thePasswordFinderto use for authenticationnewPasswordProvider- thePasswordUpdateProviderto use when a new password is being requested from the user.- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPublickey
Authenticateusernameusing the"publickey"authentication method, with keys from some common locations on the file system. This method relies on~/.ssh/id_rsaand~/.ssh/id_dsa. This method does not provide a way to specify a passphrase.- Parameters:
username- user to authenticate- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPublickey
public void authPublickey(String username, Iterable<KeyProvider> keyProviders) throws UserAuthException, TransportException Authenticateusernameusing the"publickey"authentication method.KeyProviderinstances can be created using any of the of theloadKeys()method provided in this class. In case multiplekeyProvidersare specified; authentication is attempted in order as long as the"publickey"authentication method is available.- Parameters:
username- user to authenticatekeyProviders- one or moreKeyProviderinstances- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPublickey
public void authPublickey(String username, KeyProvider... keyProviders) throws UserAuthException, TransportException Authenticateusernameusing the"publickey"authentication method.KeyProviderinstances can be created using any of theloadKeys()method provided in this class. In case multiplekeyProvidersare specified; authentication is attempted in order as long as the"publickey"authentication method is available.- Parameters:
username- user to authenticatekeyProviders- one or moreKeyProviderinstances- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authPublickey
public void authPublickey(String username, String... locations) throws UserAuthException, TransportException Authenticateusernameusing the"publickey"authentication method, with keys from one or morelocationsin the file system. In case multiplelocationsare specified; authentication is attempted in order as long as the"publickey"authentication method is available. If there is an error loading keys from any of them (e.g. file could not be read, file format not recognized) that key file it is ignored. This method does not provide a way to specify a passphrase.- Parameters:
username- user to authenticatelocations- one or more locations in the file system containing the private key- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
authGssApiWithMic
public void authGssApiWithMic(String username, LoginContext context, Oid supportedOid, Oid... supportedOids) throws UserAuthException, TransportException Authenticateusernameusing the"gssapi-with-mic"authentication method, given a login context for the peer GSS machine and a list of supported OIDs. Supported OIDs should be ordered by preference as the SSH server will choose the first OID that it also supports. At least one OID is required- Parameters:
username- user to authenticatecontext-LoginContextfor the peer GSS machinesupportedOid- first supported OIDsupportedOids- other supported OIDs- Throws:
UserAuthException- in case of authentication failureTransportException- if there was a transport-layer error
-
disconnect
Disconnects from the connected SSH server.SSHClientobjects are not reusable therefore it is incorrect to attempt connection after this method has been called. This method should be called from afinallyconstruct after connection is established; so that proper cleanup is done and the thread spawned by the transport layer for dealing with incoming packets is stopped.- Overrides:
disconnectin classSocketClient- Throws:
IOException
-
getConnection
- Returns:
- the associated
Connectioninstance.
-
getRemoteSocketAddress
Get Remote Socket Address from Transport- Specified by:
getRemoteSocketAddressin interfaceRemoteAddressProvider- Returns:
- Remote Socket Address or null when not connected
-
getRemoteCharset
Returns the character set used to communicate with the remote machine for certain strings (like paths).- Returns:
- remote character set
-
getRemotePortForwarder
- Returns:
- a
RemotePortForwarderthat allows requesting remote forwarding over this connection.
-
getTransport
-
getUserAuth
- Returns:
- the associated
UserAuthinstance. This allows access to information like theauthentication banner, whether authentication was at leastpartially successful.
-
isAuthenticated
public boolean isAuthenticated()- Returns:
- whether authenticated.
-
isConnected
public boolean isConnected()- Overrides:
isConnectedin classSocketClient- Returns:
- whether connected.
-
loadKeys
Creates aKeyProviderfrom suppliedKeyPair.- Parameters:
kp- the key pair- Returns:
- the key provider ready for use in authentication
-
loadKeys
Returns aKeyProviderinstance created from a location on the file system where an unencrypted private key file (does not require a passphrase) can be found. Simply callsloadKeys(String, PasswordFinder)with thePasswordFinderargument asnull.- Parameters:
location- the location for the key file- Returns:
- the key provider ready for use in authentication
- Throws:
SSHException- if there was no suitable key provider available for the file format; typically because BouncyCastle is not in the classpathIOException- if the key file format is not known, if the file could not be read, etc.
-
loadKeys
Utility function for creating aKeyProviderinstance from given location on the file system. Creates a one-offPasswordFinderusingPasswordUtils.createOneOff(char[]), and callsloadKeys(String, PasswordFinder).- Parameters:
location- location of the key filepassphrase- passphrase as a char-array- Returns:
- the key provider ready for use in authentication
- Throws:
SSHException- if there was no suitable key provider available for the file format; typically because BouncyCastle is not in the classpathIOException- if the key file format is not known, if the file could not be read, etc.
-
loadKeys
Creates aKeyProviderinstance from given location on the file system. Currently the following private key files are supported:- PKCS8 (OpenSSH uses this format)
- PEM-encoded PKCS1
- Putty keyfile
- openssh-key-v1 (New OpenSSH keyfile format)
- Parameters:
location- the location of the key filepasswordFinder- thePasswordFinderthat can supply the passphrase for decryption (may benullin case keyfile is not encrypted)- Returns:
- the key provider ready for use in authentication
- Throws:
SSHException- if there was no suitable key provider available for the file format; typically because BouncyCastle is not in the classpathIOException- if the key file format is not known, if the file could not be read, etc.
-
loadKeys
Convenience method for creating aKeyProviderinstance from alocationwhere an encrypted key file is located. CallsloadKeys(String, char[])with a character array created from the suppliedpassphrasestring.- Parameters:
location- location of the key filepassphrase- passphrase as a string- Returns:
- the key provider for use in authentication
- Throws:
IOException- if the key file format is not known, if the file could not be read etc.
-
loadKeys
public KeyProvider loadKeys(String privateKey, String publicKey, PasswordFinder passwordFinder) throws IOException Creates aKeyProviderinstance from passed strings. Currently only PKCS8 format private key files are supported (OpenSSH uses this format).- Parameters:
privateKey- the private key as a stringpublicKey- the public key as a string if it's not included with the private keypasswordFinder- thePasswordFinderthat can supply the passphrase for decryption (may benullin case keyfile is not encrypted)- Returns:
- the key provider ready for use in authentication
- Throws:
SSHException- if there was no suitable key provider available for the file format; typically because BouncyCastle is not in the classpathIOException- if the key file format is not known, etc.
-
loadKnownHosts
Attempts loading the user'sknown_hostsfile from the default locations, i.e.~/.ssh/known_hostsand~/.ssh/known_hosts2on most platforms. Adds the resultingOpenSSHKnownHostsobject as a host key verifier. For finer control over which file is used, seeloadKnownHosts(File).- Throws:
IOException- if there is an error loading from both locations
-
loadKnownHosts
Adds aOpenSSHKnownHostsobject created from the specified location as a host key verifier.- Parameters:
location- location forknown_hostsfile- Throws:
IOException- if there is an error loading from any of these locations
-
newLocalPortForwarder
Create aLocalPortForwarderthat will listen based onparametersusing the boundserverSocketand forward incoming connections to the server; which will further forward them tohost:port. The returned forwarder'slisten()method should be called to actually start listening, this method just creates an instance.- Parameters:
parameters- parameters for the forwarding setupserverSocket- bound server socket- Returns:
- a
LocalPortForwarder
-
newDirectConnection
Create aDirectConnectionchannel that connects to a remote address from the server. This can be used to open a tunnel to, for example, an HTTP server that is only accessible from the SSH server, or opening an SSH connection via a 'jump' server.- Parameters:
hostname- name of the host to connect to from the server.port- remote port number.- Throws:
IOException
-
registerX11Forwarder
Register alistenerfor handling forwarded X11 channels. Without having done this, an incoming X11 forwarding will be summarily rejected. It should be clarified that multiple listeners for X11 forwarding over a single SSH connection are not supported (and don't make much sense). So a subsequent call to this method is only going to replace the registeredlistener.- Parameters:
listener- theConnectListenerthat should be delegated the responsibility of handling forwardedX11Forwarder.X11Channel's- Returns:
- an
X11Forwarderthat allows tostop actingon X11 requests from server
-
newSCPFileTransfer
- Returns:
- Instantiated
SCPFileTransferimplementation.
-
newSFTPClient
- Returns:
- Instantiated
SFTPClientimplementation. - Throws:
IOException- if there is an error starting thesftpsubsystem- See Also:
-
newStatefulSFTPClient
Stateful FTP client is required in order to connect to Serv-U FTP servers.- Returns:
- Instantiated
SFTPClientimplementation. - Throws:
IOException- if there is an error starting thesftpsubsystem
-
rekey
Does key re-exchange.- Throws:
TransportException- if an error occurs during key exchange
-
setRemoteCharset
Sets the character set used to communicate with the remote machine for certain strings (like paths)- Parameters:
remoteCharset- remote character set ornullfor default
-
startSession
Description copied from interface:SessionFactoryOpens asessionchannel. The returnedSessioninstance allowsexecuting a remote command,starting a subsystem, orstarting a shell.- Specified by:
startSessionin interfaceSessionFactory- Returns:
- the opened
sessionchannel - Throws:
ConnectionExceptionTransportException- See Also:
-
useCompression
Addszlibcompression to preferred compression algorithms. There is no guarantee that it will be successfully negotiated. If the client is already connected renegotiation is done; otherwise this method simply returns (and compression will be negotiated during connection establishment).- Throws:
ClassNotFoundException- ifJZlibis not in classpathTransportException- if an error occurs during renegotiation
-
onConnect
On connection establishment, also initializes the SSH transport viaTransport.init(String, int, InputStream, OutputStream)anddoKex().- Overrides:
onConnectin classSocketClient- Throws:
IOException
-
doKex
Do key exchange.- Throws:
TransportException- if error during kex
-
close
Same asdisconnect().- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Throws:
IOException
-
checkConnected
private void checkConnected() -
checkAuthenticated
private void checkAuthenticated()
-