SFTP(1)                    OpenBSD Reference Manual                    SFTP(1)

NAME
     sftp - secure file transfer program

SYNOPSIS
     sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
          [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
          [-o ssh_option] [-P port] [-R num_requests] [-S program]
          [-s subsystem | sftp_server] host
     sftp [user@]host[:file ...]
     sftp [user@]host[:dir[/]]
     sftp -b batchfile [user@]host

DESCRIPTION
     sftp is an interactive file transfer program, similar to ftp(1), which
     performs all operations over an encrypted ssh(1) transport.  It may also
     use many features of ssh, such as public key authentication and
     compression.  sftp connects and logs into the specified host, then enters
     an interactive command mode.

     The second usage format will retrieve files automatically if a non-
     interactive authentication method is used; otherwise it will do so after
     successful interactive authentication.

     The third usage format allows sftp to start in a remote directory.

     The final usage format allows for automated sessions using the -b option.
     In such cases, it is necessary to configure non-interactive
     authentication to obviate the need to enter a password at connection time
     (see sshd(8) and ssh-keygen(1) for details).

     Since some usage formats use colon characters to delimit host names from
     path names, IPv6 addresses must be enclosed in square brackets to avoid
     ambiguity.

     The options are as follows:

     -1      Specify the use of protocol version 1.

     -2      Specify the use of protocol version 2.

     -4      Forces sftp to use IPv4 addresses only.

     -6      Forces sftp to use IPv6 addresses only.

     -B buffer_size
             Specify the size of the buffer that sftp uses when transferring
             files.  Larger buffers require fewer round trips at the cost of
             higher memory consumption.  The default is 32768 bytes.

     -b batchfile
             Batch mode reads a series of commands from an input batchfile
             instead of stdin.  Since it lacks user interaction it should be
             used in conjunction with non-interactive authentication.  A
             batchfile of `-' may be used to indicate standard input.  sftp
             will abort if any of the following commands fail: get, put,
             rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp,
             lpwd, df, symlink, and lmkdir.  Termination on error can be
             suppressed on a command by command basis by prefixing the command
             with a `-' character (for example, -rm /tmp/blah*).

     -C      Enables compression (via ssh's -C flag).

     -c cipher
             Selects the cipher to use for encrypting the data transfers.
             This option is directly passed to ssh(1).

     -D sftp_server_path
             Connect directly to a local sftp server (rather than via ssh(1)).
             This option may be useful in debugging the client and server.

     -F ssh_config
             Specifies an alternative per-user configuration file for ssh(1).
             This option is directly passed to ssh(1).

     -i identity_file
             Selects the file from which the identity (private key) for public
             key authentication is read.  This option is directly passed to
             ssh(1).

     -l limit
             Limits the used bandwidth, specified in Kbit/s.

     -o ssh_option
             Can be used to pass options to ssh in the format used in
             ssh_config(5).  This is useful for specifying options for which
             there is no separate sftp command-line flag.  For example, to
             specify an alternate port use: sftp -oPort=24.  For full details
             of the options listed below, and their possible values, see
             ssh_config(5).

                   AddressFamily
                   BatchMode
                   BindAddress
                   ChallengeResponseAuthentication
                   CheckHostIP
                   Cipher
                   Ciphers
                   Compression
                   CompressionLevel
                   ConnectionAttempts
                   ConnectTimeout
                   ControlMaster
                   ControlPath
                   GlobalKnownHostsFile
                   GSSAPIAuthentication
                   GSSAPIDelegateCredentials
                   HashKnownHosts
                   Host
                   HostbasedAuthentication
                   HostKeyAlgorithms
                   HostKeyAlias
                   HostName
                   IdentityFile
                   IdentitiesOnly
                   IPQoS
                   KbdInteractiveDevices
                   KexAlgorithms
                   LogLevel
                   MACs
                   NoHostAuthenticationForLocalhost
                   NumberOfPasswordPrompts
                   PasswordAuthentication
                   PKCS11Provider
                   Port
                   PreferredAuthentications
                   Protocol
                   ProxyCommand
                   PubkeyAuthentication
                   RekeyLimit
                   RhostsRSAAuthentication
                   RSAAuthentication
                   SendEnv
                   ServerAliveInterval
                   ServerAliveCountMax
                   StrictHostKeyChecking
                   TCPKeepAlive
                   UsePrivilegedPort
                   User
                   UserKnownHostsFile
                   VerifyHostKeyDNS

     -P port
             Specifies the port to connect to on the remote host.

     -p      Preserves modification times, access times, and modes from the
             original files transferred.

     -q      Quiet mode: disables the progress meter as well as warning and
             diagnostic messages from ssh(1).

     -R num_requests
             Specify how many requests may be outstanding at any one time.
             Increasing this may slightly improve file transfer speed but will
             increase memory usage.  The default is 64 outstanding requests.

     -r      Recursively copy entire directories when uploading and
             downloading.  Note that sftp does not follow symbolic links
             encountered in the tree traversal.

     -S program
             Name of the program to use for the encrypted connection.  The
             program must understand ssh(1) options.

     -s subsystem | sftp_server
             Specifies the SSH2 subsystem or the path for an sftp server on
             the remote host.  A path is useful for using sftp over protocol
             version 1, or when the remote sshd(8) does not have an sftp
             subsystem configured.

     -v      Raise logging level.  This option is also passed to ssh.

INTERACTIVE COMMANDS
     Once in interactive mode, sftp understands a set of commands similar to
     those of ftp(1).  Commands are case insensitive.  Pathnames that contain
     spaces must be enclosed in quotes.  Any special characters contained
     within pathnames that are recognized by glob(3) must be escaped with
     backslashes (`\').

     bye     Quit sftp.

     cd path
             Change remote directory to path.

     chgrp grp path
             Change group of file path to grp.  path may contain glob(3)
             characters and may match multiple files.  grp must be a numeric
             GID.

     chmod mode path
             Change permissions of file path to mode.  path may contain
             glob(3) characters and may match multiple files.

     chown own path
             Change owner of file path to own.  path may contain glob(3)
             characters and may match multiple files.  own must be a numeric
             UID.

     df [-hi] [path]
             Display usage information for the filesystem holding the current
             directory (or path if specified).  If the -h flag is specified,
             the capacity information will be displayed using "human-readable"
             suffixes.  The -i flag requests display of inode information in
             addition to capacity information.  This command is only supported
             on servers that implement the ``statvfs@openssh.com'' extension.

     exit    Quit sftp.

     get [-Ppr] remote-path [local-path]
             Retrieve the remote-path and store it on the local machine.  If
             the local path name is not specified, it is given the same name
             it has on the remote machine.  remote-path may contain glob(3)
             characters and may match multiple files.  If it does and
             local-path is specified, then local-path must specify a
             directory.

             If either the -P or -p flag is specified, then full file
             permissions and access times are copied too.

             If the -r flag is specified then directories will be copied
             recursively.  Note that sftp does not follow symbolic links when
             performing recursive transfers.

     help    Display help text.

     lcd path
             Change local directory to path.

     lls [ls-options [path]]
             Display local directory listing of either path or current
             directory if path is not specified.  ls-options may contain any
             flags supported by the local system's ls(1) command.  path may
             contain glob(3) characters and may match multiple files.

     lmkdir path
             Create local directory specified by path.

     ln [-s] oldpath newpath
             Create a link from oldpath to newpath.  If the -s flag is
             specified the created link is a symbolic link, otherwise it is a
             hard link.

     lpwd    Print local working directory.

     ls [-1afhlnrSt] [path]
             Display a remote directory listing of either path or the current
             directory if path is not specified.  path may contain glob(3)
             characters and may match multiple files.

             The following flags are recognized and alter the behaviour of ls
             accordingly:

             -1      Produce single columnar output.

             -a      List files beginning with a dot (`.').

             -f      Do not sort the listing.  The default sort order is
                     lexicographical.

             -h      When used with a long format option, use unit suffixes:
                     Byte, Kilobyte, Megabyte, Gigabyte, Terabyte, Petabyte,
                     and Exabyte in order to reduce the number of digits to
                     four or fewer using powers of 2 for sizes (K=1024,
                     M=1048576, etc.).

             -l      Display additional details including permissions and
                     ownership information.

             -n      Produce a long listing with user and group information
                     presented numerically.

             -r      Reverse the sort order of the listing.

             -S      Sort the listing by file size.

             -t      Sort the listing by last modification time.

     lumask umask
             Set local umask to umask.

     mkdir path
             Create remote directory specified by path.

     progress
             Toggle display of progress meter.

     put [-Ppr] local-path [remote-path]
             Upload local-path and store it on the remote machine.  If the
             remote path name is not specified, it is given the same name it
             has on the local machine.  local-path may contain glob(3)
             characters and may match multiple files.  If it does and
             remote-path is specified, then remote-path must specify a
             directory.

             If either the -P or -p flag is specified, then full file
             permissions and access times are copied too.

             If the -r flag is specified then directories will be copied
             recursively.  Note that sftp does not follow symbolic links when
             performing recursive transfers.

     pwd     Display remote working directory.

     quit    Quit sftp.

     rename oldpath newpath
             Rename remote file from oldpath to newpath.

     rm path
             Delete remote file specified by path.

     rmdir path
             Remove remote directory specified by path.

     symlink oldpath newpath
             Create a symbolic link from oldpath to newpath.

     version
             Display the sftp protocol version.

     !command
             Execute command in local shell.

     !       Escape to local shell.

     ?       Synonym for help.

SEE ALSO
     ftp(1), ls(1), scp(1), ssh(1), ssh-add(1), ssh-keygen(1), glob(3),
     ssh_config(5), sftp-server(8), sshd(8)

     T. Ylonen and S. Lehtinen, SSH File Transfer Protocol,
     draft-ietf-secsh-filexfer-00.txt, January 2001, work in progress
     material.

OpenBSD 5.0                     August 7, 2011                     OpenBSD 5.0
