public class SftpSubsystem extends AbstractSftpSubsystemHelper implements Command, Runnable, SessionAware, FileSystemAware, ExecutorServiceCarrier, AsyncCommand, ChannelSessionAware, ChannelDataReceiver
ACL_SUPPORTED_MASK_PROP, AUTO_FOLLOW_LINKS, CLIENT_EXTENSIONS_PROP, DEFAULT_ACL_SUPPORTED_MASK, DEFAULT_AUTO_FOLLOW_LINKS, DEFAULT_MAX_READDATA_PACKET_LENGTH, DEFAULT_OPEN_SSH_EXTENSIONS, DEFAULT_OPEN_SSH_EXTENSIONS_NAMES, DEFAULT_SUPPORTED_CLIENT_EXTENSIONS, MAX_READDATA_PACKET_LENGTH_PROP, NEWLINE_VALUE, OPENSSH_EXTENSIONS_PROP
log
ALL_SFTP_IMPL, HIGHER_SFTP_IMPL, LOWER_SFTP_IMPL, SFTP_VERSION
Constructor and Description |
---|
SftpSubsystem(CloseableExecutorService executorService,
UnsupportedAttributePolicy policy,
SftpFileSystemAccessor accessor,
SftpErrorStatusDataHandler errorStatusDataHandler) |
Modifier and Type | Method and Description |
---|---|
void |
close()
Called to indicate EOF.
|
protected void |
closeAllHandles() |
protected void |
createLink(int id,
String existingPath,
String linkPath,
boolean symLink) |
int |
data(ChannelSession channel,
byte[] buf,
int start,
int len)
Called when the server receives additional bytes from the client.
|
void |
destroy()
This method is called by the SSH server to destroy the command because
the client has disconnected somehow.
|
protected void |
doBlock(int id,
String handle,
long offset,
long length,
int mask) |
protected void |
doCheckFileHash(int id,
String targetType,
String target,
Collection<String> algos,
long startOffset,
long length,
int blockSize,
Buffer buffer) |
protected void |
doClose(int id,
String handle) |
protected void |
doCopyData(int id,
String readHandle,
long readOffset,
long readLength,
String writeHandle,
long writeOffset) |
protected void |
doFSetStat(int id,
String handle,
Map<String,?> attrs) |
protected Map<String,Object> |
doFStat(int id,
String handle,
int flags) |
protected void |
doInit(Buffer buffer,
int id) |
protected byte[] |
doMD5Hash(int id,
String targetType,
String target,
long startOffset,
long length,
byte[] quickCheckHash) |
protected String |
doOpen(int id,
String path,
int pflags,
int access,
Map<String,Object> attrs) |
protected String |
doOpenDir(int id,
String path,
Path p,
LinkOption... options) |
protected void |
doOpenSSHFsync(int id,
String handle) |
protected void |
doProcess(Buffer buffer,
int length,
int type,
int id) |
protected int |
doRead(int id,
String handle,
long offset,
int length,
byte[] data,
int doff) |
protected void |
doReadDir(Buffer buffer,
int id) |
protected void |
doTextSeek(int id,
String handle,
long line) |
protected void |
doUnblock(int id,
String handle,
long offset,
long length) |
protected void |
doVersionSelect(Buffer buffer,
int id,
String proposed) |
protected void |
doWrite(int id,
String handle,
long offset,
int length,
byte[] data,
int doff,
int remaining) |
protected String |
generateFileHandle(Path file) |
Path |
getDefaultDirectory() |
CloseableExecutorService |
getExecutorService() |
ServerSession |
getServerSession() |
int |
getVersion() |
protected Buffer |
prepareReply(Buffer buffer) |
void |
run() |
protected void |
send(Buffer buffer) |
void |
setChannelSession(ChannelSession session)
Receives the channel in which the command is being executed.
|
void |
setErrorStream(OutputStream err)
Set the error stream that can be used by the shell to write its errors.
|
void |
setExitCallback(ExitCallback callback)
Set the callback that the shell has to call when it is closed.
|
void |
setFileSystem(FileSystem fileSystem)
Set the file system in which this shell will be executed.
|
void |
setInputStream(InputStream in)
Set the input stream that can be used by the shell to read input.
|
void |
setIoErrorStream(IoOutputStream err)
Set the error stream that can be used by the shell to write its errors.
|
void |
setIoInputStream(IoInputStream in)
Set the input stream that can be used by the shell to read input.
|
void |
setIoOutputStream(IoOutputStream out)
Set the output stream that can be used by the shell to write its output.
|
void |
setOutputStream(OutputStream out)
Set the output stream that can be used by the shell to write its output.
|
void |
setSession(ServerSession session) |
void |
start(Environment env)
Starts the command execution.
|
addMissingAttribute, addSftpEventListener, appendAclSupportedExtension, appendExtensions, appendNewlineExtension, appendOpenSSHExtensions, appendSupported2Extension, appendSupportedExtension, appendVendorIdExtension, appendVersionsExtension, checkVersionCompatibility, doBlock, doCheckFileHash, doCheckFileHash, doClose, doCopyData, doCopyFile, doCopyFile, doCopyFile, doExtended, doFSetStat, doFStat, doLink, doLink, doLStat, doLStat, doMakeDirectory, doMakeDirectory, doMD5Hash, doMD5Hash, doOpen, doOpenDir, doOpenSSHFsync, doOpenSSHHardLink, doOpenSSHHardLink, doRead, doReadDir, doReadLink, doReadLink, doRealPath, doRealPathV345, doRealPathV6, doRemove, doRemove, doRemove, doRemoveDirectory, doRemoveDirectory, doRename, doRename, doRename, doSetAttributes, doSetStat, doSetStat, doSpaceAvailable, doSpaceAvailable, doStat, doStat, doSymLink, doSymLink, doTextSeek, doUnblock, doUnsupported, doUnsupportedExtension, doVersionSelect, doWrite, executeExtendedCommand, getAttributes, getAttributes, getErrorStatusDataHandler, getFileSystemAccessor, getLongName, getLongName, getLongName, getPathResolutionLinkOption, getSftpEventListenerProxy, getShortName, getSupportedClientExtensions, getUnsupportedAttributePolicy, handleReadFileAttributesException, handleSetFileAttributeFailure, handleUnknownStatusFileAttributes, handleUnsupportedAttributes, handleUserPrincipalLookupServiceException, normalize, process, readAttrs, readFileAttributes, removeSftpEventListener, resolveAclSupportedCapabilities, resolveFile, resolveFileAttributes, resolveMissingFileAttributes, resolveMissingFileAttributeValue, resolveNewlineValue, resolveNormalizedLocation, resolveOpenSSHExtensions, sendAttrs, sendHandle, sendLink, sendPath, sendStatus, sendStatus, sendStatus, setFileAccessControl, setFileAttribute, setFileAttributes, setFileExtensions, setFileOwnership, setFilePermissions, setFileTime, signalOpenFailure, signalRemovalPreConditionFailure, toGroup, toUser, validateHandle, validateProposedVersion, validateRealPath, writeAttrs, writeDirEntry
getSimplifiedLogger
public static final String MAX_OPEN_HANDLES_PER_SESSION
public static final int DEFAULT_MAX_OPEN_HANDLES
public static final String FILE_HANDLE_SIZE
DEFAULT_FILE_HANDLE_SIZE
,
Constant Field Valuespublic static final int MIN_FILE_HANDLE_SIZE
public static final int DEFAULT_FILE_HANDLE_SIZE
public static final int MAX_FILE_HANDLE_SIZE
public static final String MAX_FILE_HANDLE_RAND_ROUNDS
public static final int MIN_FILE_HANDLE_ROUNDS
public static final int DEFAULT_FILE_HANDLE_ROUNDS
public static final int MAX_FILE_HANDLE_ROUNDS
public static final String MAX_READDIR_DATA_SIZE_PROP
doReadDir(Buffer, int)
public static final int DEFAULT_MAX_READDIR_DATA_SIZE
protected static final Buffer CLOSE
protected final AtomicBoolean closed
protected final AtomicLong requestsCount
protected final Buffer buffer
protected final BlockingQueue<Buffer> requests
protected ExitCallback callback
protected IoOutputStream out
protected IoOutputStream err
protected Environment env
protected Random randomizer
protected int fileHandleSize
protected int maxFileHandleRounds
protected Future<?> pendingFuture
protected byte[] workBuf
protected FileSystem fileSystem
protected Path defaultDir
protected int version
protected ServerSession serverSession
protected ChannelSession channelSession
protected CloseableExecutorService executorService
public SftpSubsystem(CloseableExecutorService executorService, UnsupportedAttributePolicy policy, SftpFileSystemAccessor accessor, SftpErrorStatusDataHandler errorStatusDataHandler)
executorService
- The CloseableExecutorService
to be used by
the SftpSubsystem
command when starting execution. If
null
then a single-threaded ad-hoc service is used.policy
- The UnsupportedAttributePolicy
to use if failed to access
some local file attributesaccessor
- The SftpFileSystemAccessor
to use for opening files and directorieserrorStatusDataHandler
- The (never null
) SftpErrorStatusDataHandler
to
use when generating failed commands error messagesThreadUtils.newSingleThreadExecutor(String)
public int getVersion()
getVersion
in interface SftpSubsystemEnvironment
public Path getDefaultDirectory()
getDefaultDirectory
in interface SftpSubsystemEnvironment
chroot
locationpublic CloseableExecutorService getExecutorService()
getExecutorService
in interface ExecutorServiceCarrier
CloseableExecutorService
to usepublic void setSession(ServerSession session)
setSession
in interface SessionAware
session
- The ServerSession
in which this shell will be executed.public ServerSession getServerSession()
getServerSession
in interface ServerSessionHolder
ServerSession
usedpublic void setChannelSession(ChannelSession session)
ChannelSessionAware
setChannelSession
in interface ChannelSessionAware
session
- never nullpublic void setFileSystem(FileSystem fileSystem)
FileSystemAware
setFileSystem
in interface FileSystemAware
fileSystem
- the file systempublic void setExitCallback(ExitCallback callback)
Command
setExitCallback
in interface Command
callback
- The ExitCallback
to call when shell is closedpublic void setInputStream(InputStream in)
Command
setInputStream
in interface Command
in
- The InputStream
used by the shell to read input.public void setOutputStream(OutputStream out)
Command
setOutputStream
in interface Command
out
- The OutputStream
used by the shell to write its outputpublic void setErrorStream(OutputStream err)
Command
setErrorStream
in interface Command
err
- The OutputStream
used by the shell to write its errorspublic void setIoInputStream(IoInputStream in)
AsyncCommand
setIoInputStream
in interface AsyncCommand
in
- The IoInputStream
used by the shell to read inputpublic void setIoOutputStream(IoOutputStream out)
AsyncCommand
setIoOutputStream
in interface AsyncCommand
out
- The IoOutputStream
used by the shell to write its outputpublic void setIoErrorStream(IoOutputStream err)
AsyncCommand
setIoErrorStream
in interface AsyncCommand
err
- The IoOutputStream
used by the shell to write its errorspublic void start(Environment env) throws IOException
CommandLifecycle
Runnable
,
and this method should spawn a new thread like:
Thread(this).start();
start
in interface CommandLifecycle
env
- The Environment
IOException
- If failed to startpublic int data(ChannelSession channel, byte[] buf, int start, int len) throws IOException
ChannelDataReceiver
Called when the server receives additional bytes from the client.
SSH channels use the windowing mechanism to perform flow control, much like TCP does. The server gives the client the initial window size, which represents the number of bytes the client can send to the server. As the server receives data, it can send a message to the client to allow it to send more data.
The return value from this method is used to control this behaviour. Intuitively speaking, the callee returns the number of bytes consumed by this method, by the time this method returns. Picture a one-way long bridge (for example Golden Gate Bridge) with toll plazas on both sides. The window size is the maximum number of cars allowed on the bridge. Here we are on the receiving end, so our job here is to count the number of cars as it leaves the bridge, and if enough of them left, we'll signal the sending end that they can let in more cars. The return value of this method counts the number of cars that are leaving in this batch.
In simple cases, where the callee has consumed the bytes before it returns, the return value must be the same value as the 'len' parameter given.
On the other hand, if the callee is queueing up the received bytes somewhere
to be consumed later (for example by another thread), then this method should
return 0, for the bytes aren't really consumed yet. And when at some later point
the bytes are actually used, then you'll invoke channel.getLocalWindow().consumeAndCheck(len)
to let the channel know that bytes are consumed.
This behaviour will result in a better flow control, as the server will not allow the SSH client to overflow its buffer. If instead you always return the value passed in the 'len' parameter, the place where you are queueing up bytes may overflow.
In either case, the callee must account for every bytes it receives in this method.
Returning 0 and failing to call back channel.getLocalWindow().consumeAndCheck(len)
later
will dry up the window size, and eventually the client will stop sending you any data.
In the SSH protocol, this method invocation is triggered by a SSH_MSG_CHANNEL_DATA message.
data
in interface ChannelDataReceiver
channel
- The caller to which this ChannelDataReceiver
is assigned. Never null.buf
- Holds the bytes received. This buffer belongs to the caller, and it might get reused
by the caller as soon as this method returns.start
- buf[start] is the first byte that received from the client.len
- the length of the bytes received. Can be zero.IOException
- if failed to consume the datapublic void close() throws IOException
ChannelDataReceiver
close
in interface Closeable
close
in interface AutoCloseable
close
in interface ChannelDataReceiver
IOException
- if failedprotected void doProcess(Buffer buffer, int length, int type, int id) throws IOException
doProcess
in class AbstractSftpSubsystemHelper
IOException
protected void createLink(int id, String existingPath, String linkPath, boolean symLink) throws IOException
createLink
in class AbstractSftpSubsystemHelper
IOException
protected void doTextSeek(int id, String handle, long line) throws IOException
doTextSeek
in class AbstractSftpSubsystemHelper
IOException
protected void doOpenSSHFsync(int id, String handle) throws IOException
doOpenSSHFsync
in class AbstractSftpSubsystemHelper
IOException
protected void doCheckFileHash(int id, String targetType, String target, Collection<String> algos, long startOffset, long length, int blockSize, Buffer buffer) throws Exception
doCheckFileHash
in class AbstractSftpSubsystemHelper
Exception
protected byte[] doMD5Hash(int id, String targetType, String target, long startOffset, long length, byte[] quickCheckHash) throws Exception
doMD5Hash
in class AbstractSftpSubsystemHelper
Exception
protected void doVersionSelect(Buffer buffer, int id, String proposed) throws IOException
doVersionSelect
in class AbstractSftpSubsystemHelper
IOException
protected void doBlock(int id, String handle, long offset, long length, int mask) throws IOException
doBlock
in class AbstractSftpSubsystemHelper
IOException
protected void doUnblock(int id, String handle, long offset, long length) throws IOException
doUnblock
in class AbstractSftpSubsystemHelper
IOException
protected void doCopyData(int id, String readHandle, long readOffset, long readLength, String writeHandle, long writeOffset) throws IOException
doCopyData
in class AbstractSftpSubsystemHelper
IOException
protected void doReadDir(Buffer buffer, int id) throws IOException
doReadDir
in class AbstractSftpSubsystemHelper
IOException
protected String doOpenDir(int id, String path, Path p, LinkOption... options) throws IOException
doOpenDir
in class AbstractSftpSubsystemHelper
IOException
protected void doFSetStat(int id, String handle, Map<String,?> attrs) throws IOException
doFSetStat
in class AbstractSftpSubsystemHelper
IOException
protected Map<String,Object> doFStat(int id, String handle, int flags) throws IOException
doFStat
in class AbstractSftpSubsystemHelper
IOException
protected void doWrite(int id, String handle, long offset, int length, byte[] data, int doff, int remaining) throws IOException
doWrite
in class AbstractSftpSubsystemHelper
IOException
protected int doRead(int id, String handle, long offset, int length, byte[] data, int doff) throws IOException
doRead
in class AbstractSftpSubsystemHelper
IOException
protected void doClose(int id, String handle) throws IOException
doClose
in class AbstractSftpSubsystemHelper
IOException
protected String doOpen(int id, String path, int pflags, int access, Map<String,Object> attrs) throws IOException
doOpen
in class AbstractSftpSubsystemHelper
id
- Request idpath
- Pathpflags
- Open mode flags - see SSH_FXF_XXX
flagsaccess
- Access mode flags - see ACE4_XXX
flagsattrs
- Requested attributesIOException
- if failed to executeprotected String generateFileHandle(Path file) throws IOException
IOException
protected void doInit(Buffer buffer, int id) throws IOException
doInit
in class AbstractSftpSubsystemHelper
IOException
protected Buffer prepareReply(Buffer buffer)
prepareReply
in class AbstractSftpSubsystemHelper
protected void send(Buffer buffer) throws IOException
send
in class AbstractSftpSubsystemHelper
IOException
public void destroy()
CommandLifecycle
destroy
in interface CommandLifecycle
protected void closeAllHandles()
Copyright © 2008–2022 The Apache Software Foundation. All rights reserved.