public class

SFTPv3Client

extends Object
java.lang.Object
   ↳ com.trilead.ssh2.SFTPv3Client

Class Overview

A SFTPv3Client represents a SFTP (protocol version 3) client connection tunnelled over a SSH-2 connection. This is a very simple (synchronous) implementation.

Basically, most methods in this class map directly to one of the packet types described in draft-ietf-secsh-filexfer-02.txt.

Note: this is experimental code.

Error handling: the methods of this class throw IOExceptions. However, unless there is catastrophic failure, exceptions of the type SFTPv3Client will be thrown (a subclass of IOException). Therefore, you can implement more verbose behavior by checking if a thrown exception if of this type. If yes, then you can cast the exception and access detailed information about the failure.

Notes about file names, directory names and paths, copy-pasted from the specs:

  • SFTP v3 represents file names as strings. File names are assumed to use the slash ('/') character as a directory separator.
  • File names starting with a slash are "absolute", and are relative to the root of the file system. Names starting with any other character are relative to the user's default directory (home directory).
  • Servers SHOULD interpret a path name component ".." as referring to the parent directory, and "." as referring to the current directory. If the server implementation limits access to certain parts of the file system, it must be extra careful in parsing file names when enforcing such restrictions. There have been numerous reported security bugs where a ".." in a path name has allowed access outside the intended area.
  • An empty path name is valid, and it refers to the user's default directory (usually the user's home directory).

If you are still not tired then please go on and read the comment for setCharset(String).

Summary

Fields
String charsetName
final Connection conn
final PrintStream debug
boolean flag_closed
InputStream is
int next_request_id
OutputStream os
int protocol_version
HashMap server_extensions
final Session sess
Public Constructors
SFTPv3Client(Connection conn, PrintStream debug)
This constructor is deprecated. this constructor (debug version) will disappear in the future, use SFTPv3Client(Connection) instead.
SFTPv3Client(Connection conn)
Create a SFTP v3 client.
Public Methods
String canonicalPath(String path)
Have the server canonicalize any given path name to an absolute path.
void close()
Close this SFTP session.
void closeFile(SFTPv3FileHandle handle)
Close a file.
SFTPv3FileHandle createFile(String fileName)
Create a file and open it for reading and writing.
SFTPv3FileHandle createFile(String fileName, SFTPv3FileAttributes attr)
Create a file and open it for reading and writing.
SFTPv3FileHandle createFileTruncate(String fileName, SFTPv3FileAttributes attr)
reate a file (truncate it if it already exists) and open it for reading and writing.
SFTPv3FileHandle createFileTruncate(String fileName)
Create a file (truncate it if it already exists) and open it for reading and writing.
void createSymlink(String src, String target)
Create a symbolic link on the server.
void fsetstat(SFTPv3FileHandle handle, SFTPv3FileAttributes attr)
Modify the attributes of a file.
SFTPv3FileAttributes fstat(SFTPv3FileHandle handle)
Retrieve the file attributes of an open file.
String getCharset()
The currently used charset for filename encoding/decoding.
int getProtocolVersion()
Returns the negotiated SFTP protocol version between the client and the server.
Vector ls(String dirName)
List the contents of a directory.
SFTPv3FileAttributes lstat(String path)
Retrieve the file attributes of a file.
void mkdir(String dirName, int posixPermissions)
Create a new directory.
void mv(String oldPath, String newPath)
Move a file or directory.
SFTPv3FileHandle openFileRO(String fileName)
Open a file for reading.
SFTPv3FileHandle openFileRW(String fileName)
Open a file for reading and writing.
int read(SFTPv3FileHandle handle, long fileOffset, byte[] dst, int dstoff, int len)
Read bytes from a file.
String readLink(String path)
Read the target of a symbolic link.
void rm(String fileName)
Remove a file.
void rmdir(String dirName)
Remove an empty directory.
void setCharset(String charset)
Set the charset used to convert between Java Unicode Strings and byte encodings used by the server for paths and file names.
void setstat(String path, SFTPv3FileAttributes attr)
Modify the attributes of a file.
SFTPv3FileAttributes stat(String path)
Retrieve the file attributes of a file.
void write(SFTPv3FileHandle handle, long fileOffset, byte[] src, int srcoff, int len)
Write bytes to a file.
[Expand]
Inherited Methods
From class java.lang.Object

Fields

String charsetName

final Connection conn

final PrintStream debug

boolean flag_closed

int next_request_id

int protocol_version

HashMap server_extensions

final Session sess

Public Constructors

public SFTPv3Client (Connection conn, PrintStream debug)

This constructor is deprecated.
this constructor (debug version) will disappear in the future, use SFTPv3Client(Connection) instead.

Create a SFTP v3 client.

Parameters
conn The underlying SSH-2 connection to be used.
debug
Throws
IOException
IOException

public SFTPv3Client (Connection conn)

Create a SFTP v3 client.

Parameters
conn The underlying SSH-2 connection to be used.
Throws
IOException

Public Methods

public String canonicalPath (String path)

Have the server canonicalize any given path name to an absolute path. This is useful for converting path names containing ".." components or relative pathnames without a leading slash into absolute paths.

Parameters
path See the comment for the class for more details.
Returns
  • An absolute path.
Throws
IOException

public void close ()

Close this SFTP session. NEVER forget to call this method to free up resources - even if you got an exception from one of the other methods. Sometimes these other methods may throw an exception, saying that the underlying channel is closed (this can happen, e.g., if the other server sent a close message.) However, as long as you have not called the close() method, you are likely wasting resources.

public void closeFile (SFTPv3FileHandle handle)

Close a file.

Parameters
handle A SFTPv3FileHandle handle
Throws
IOException

public SFTPv3FileHandle createFile (String fileName)

Create a file and open it for reading and writing. Same as createFile(fileName, null).

Parameters
fileName See the comment for the class for more details.
Returns
  • a SFTPv3FileHandle handle
Throws
IOException

public SFTPv3FileHandle createFile (String fileName, SFTPv3FileAttributes attr)

Create a file and open it for reading and writing. You can specify the default attributes of the file (the server may or may not respect your wishes).

Parameters
fileName See the comment for the class for more details.
attr May be null to use server defaults. Probably only the uid, gid and permissions (remember the server may apply a umask) entries of the SFTPv3FileHandle structure make sense. You need only to set those fields where you want to override the server's defaults.
Returns
  • a SFTPv3FileHandle handle
Throws
IOException

public SFTPv3FileHandle createFileTruncate (String fileName, SFTPv3FileAttributes attr)

reate a file (truncate it if it already exists) and open it for reading and writing. You can specify the default attributes of the file (the server may or may not respect your wishes).

Parameters
fileName See the comment for the class for more details.
attr May be null to use server defaults. Probably only the uid, gid and permissions (remember the server may apply a umask) entries of the SFTPv3FileHandle structure make sense. You need only to set those fields where you want to override the server's defaults.
Returns
  • a SFTPv3FileHandle handle
Throws
IOException

public SFTPv3FileHandle createFileTruncate (String fileName)

Create a file (truncate it if it already exists) and open it for reading and writing. Same as createFileTruncate(fileName, null).

Parameters
fileName See the comment for the class for more details.
Returns
  • a SFTPv3FileHandle handle
Throws
IOException

public void createSymlink (String src, String target)

Create a symbolic link on the server. Creates a link "src" that points to "target".

Parameters
src See the comment for the class for more details.
target See the comment for the class for more details.
Throws
IOException

public void fsetstat (SFTPv3FileHandle handle, SFTPv3FileAttributes attr)

Modify the attributes of a file. Used for operations such as changing the ownership, permissions or access times, as well as for truncating a file.

Parameters
handle A SFTPv3FileHandle handle
attr A SFTPv3FileAttributes object. Specifies the modifications to be made to the attributes of the file. Empty fields will be ignored.
Throws
IOException

public SFTPv3FileAttributes fstat (SFTPv3FileHandle handle)

Retrieve the file attributes of an open file.

Parameters
handle A SFTPv3FileHandle handle.
Returns
  • a SFTPv3FileAttributes object.
Throws
IOException

public String getCharset ()

The currently used charset for filename encoding/decoding.

Returns
  • The name of the charset (null if the platform's default charset is being used)

public int getProtocolVersion ()

Returns the negotiated SFTP protocol version between the client and the server.

Returns
  • SFTP protocol version, i.e., "3".

public Vector ls (String dirName)

List the contents of a directory.

Parameters
dirName See the comment for the class for more details.
Returns
Throws
IOException

public SFTPv3FileAttributes lstat (String path)

Retrieve the file attributes of a file. This method does NOT follow symbolic links on the server.

Parameters
path See the comment for the class for more details.
Returns
  • a SFTPv3FileAttributes object.
Throws
IOException
See Also

public void mkdir (String dirName, int posixPermissions)

Create a new directory.

Parameters
dirName See the comment for the class for more details.
posixPermissions The permissions for this directory, e.g., "0700" (remember that this is octal noation). The server will likely apply a umask.
Throws
IOException

public void mv (String oldPath, String newPath)

Move a file or directory.

Parameters
oldPath See the comment for the class for more details.
newPath See the comment for the class for more details.
Throws
IOException

public SFTPv3FileHandle openFileRO (String fileName)

Open a file for reading.

Parameters
fileName See the comment for the class for more details.
Returns
  • a SFTPv3FileHandle handle
Throws
IOException

public SFTPv3FileHandle openFileRW (String fileName)

Open a file for reading and writing.

Parameters
fileName See the comment for the class for more details.
Returns
  • a SFTPv3FileHandle handle
Throws
IOException

public int read (SFTPv3FileHandle handle, long fileOffset, byte[] dst, int dstoff, int len)

Read bytes from a file. No more than 32768 bytes may be read at once. Be aware that the semantics of read() are different than for Java streams.

  • The server will read as many bytes as it can from the file (up to len), and return them.
  • If EOF is encountered before reading any data, -1 is returned.
  • If an error occurs, an exception is thrown
  • .
  • For normal disk files, it is guaranteed that the server will return the specified number of bytes, or up to end of file. For, e.g., device files this may return fewer bytes than requested.

Parameters
handle A SFTPv3FileHandle handle
fileOffset Offset (in bytes) in the file
dst The destination byte array
dstoff Offset in the destination byte array
len How many bytes to read, 0 < len <= 32768 bytes
Returns
  • the number of bytes that could be read, may be less than requested if the end of the file is reached, -1 is returned in case of EOF
Throws
IOException

public String readLink (String path)

Read the target of a symbolic link.

Parameters
path See the comment for the class for more details.
Returns
  • The target of the link.
Throws
IOException

public void rm (String fileName)

Remove a file.

Parameters
fileName See the comment for the class for more details.
Throws
IOException

public void rmdir (String dirName)

Remove an empty directory.

Parameters
dirName See the comment for the class for more details.
Throws
IOException

public void setCharset (String charset)

Set the charset used to convert between Java Unicode Strings and byte encodings used by the server for paths and file names. Unfortunately, the SFTP v3 draft says NOTHING about such conversions (well, with the exception of error messages which have to be in UTF-8). Newer drafts specify to use UTF-8 for file names (if I remember correctly). However, a quick test using OpenSSH serving a EXT-3 filesystem has shown that UTF-8 seems to be a bad choice for SFTP v3 (tested with filenames containing german umlauts). "windows-1252" seems to work better for Europe. Luckily, "windows-1252" is the platform default in my case =).

If you don't set anything, then the platform default will be used (this is the default behavior).

Parameters
charset The name of the charset to be used or null to use the platform's default encoding.
Throws
IOException
See Also

public void setstat (String path, SFTPv3FileAttributes attr)

Modify the attributes of a file. Used for operations such as changing the ownership, permissions or access times, as well as for truncating a file.

Parameters
path See the comment for the class for more details.
attr A SFTPv3FileAttributes object. Specifies the modifications to be made to the attributes of the file. Empty fields will be ignored.
Throws
IOException

public SFTPv3FileAttributes stat (String path)

Retrieve the file attributes of a file. This method follows symbolic links on the server.

Parameters
path See the comment for the class for more details.
Returns
  • a SFTPv3FileAttributes object.
Throws
IOException
See Also

public void write (SFTPv3FileHandle handle, long fileOffset, byte[] src, int srcoff, int len)

Write bytes to a file. If len > 32768, then the write operation will be split into multiple writes.

Parameters
handle A SFTPv3FileHandle handle.
fileOffset Offset (in bytes) in the file.
src The source byte array.
srcoff Offset in the source byte array.
len How many bytes to write.
Throws
IOException