mailto(rsync-bugs@samba.org)
manpage(rsyncd.conf)(5)(19 May 2005)()()
manpagename(rsyncd.conf)(configuration file for rsync in daemon mode)
manpagesynopsis()

rsyncd.conf

manpagedescription()

The rsyncd.conf file is the runtime configuration file for rsync when
run as an rsync daemon. 

The rsyncd.conf file controls authentication, access, logging and
available modules.

manpagesection(FILE FORMAT)

The file consists of modules and parameters. A module begins with the 
name of the module in square brackets and continues until the next
module begins. Modules contain parameters of the form 'name = value'.

The file is line-based -- that is, each newline-terminated line represents
either a comment, a module name or a parameter.

Only the first equals sign in a parameter is significant. Whitespace before 
or after the first equals sign is discarded. Leading, trailing and internal
whitespace in module and parameter names is irrelevant. Leading and
trailing whitespace in a parameter value is discarded. Internal whitespace
within a parameter value is retained verbatim.

Any line beginning with a hash (#) is ignored, as are lines containing 
only whitespace.

Any line ending in a \ is "continued" on the next line in the
customary UNIX fashion.

The values following the equals sign in parameters are all either a string
(no quotes needed) or a boolean, which may be given as yes/no, 0/1 or
true/false. Case is not significant in boolean values, but is preserved
in string values. 

manpagesection(LAUNCHING THE RSYNC DAEMON)

The rsync daemon is launched by specifying the bf(--daemon) option to
rsync. 

The daemon must run with root privileges if you wish to use chroot, to
bind to a port numbered under 1024 (as is the default 873), or to set
file ownership.  Otherwise, it must just have permission to read and
write the appropriate data, log, and lock files.

You can launch it either via inetd, as a stand-alone daemon, or from
an rsync client via a remote shell.  If run as a stand-alone daemon then
just run the command "bf(rsync --daemon)" from a suitable startup script.
If run from an rsync client via a remote shell (by specifying both the
bf(--rsh) (bf(-e)) option and daemon mode with "::" or "rsync://"), the bf(--daemon)
option is automatically passed to the remote side.

When run via inetd you should add a line like this to /etc/services:

verb(  rsync           873/tcp)

and a single line something like this to /etc/inetd.conf:
    
verb(  rsync   stream  tcp     nowait  root   /usr/bin/rsync rsyncd --daemon)

Replace "/usr/bin/rsync" with the path to where you have rsync installed on
your system.  You will then need to send inetd a HUP signal to tell it to
reread its config file.

Note that you should bf(not) send the rsync daemon a HUP signal to force
it to reread the tt(rsyncd.conf) file. The file is re-read on each client
connection. 

manpagesection(GLOBAL OPTIONS)

The first parameters in the file (before a [module] header) are the
global parameters. 

You may also include any module parameters in the global part of the
config file in which case the supplied value will override the
default for that parameter.

startdit()
dit(bf(motd file)) The "motd file" option allows you to specify a
"message of the day" to display to clients on each connect. This
usually contains site information and any legal notices. The default
is no motd file.

dit(bf(log file)) The "log file" option tells the rsync daemon to log
messages to that file rather than using syslog. This is particularly
useful on systems (such as AIX) where syslog() doesn't work for
chrooted programs.  If the daemon fails to open to specified file, it
will fall back to using syslog and output an error about the failure.
(Note that a failure to open the specified log file used to be a fatal
error.)

dit(bf(pid file)) The "pid file" option tells the rsync daemon to write
its process ID to that file.

dit(bf(syslog facility)) The "syslog facility" option allows you to
specify the syslog facility name to use when logging messages from the
rsync daemon. You may use any standard syslog facility name which is
defined on your system. Common names are auth, authpriv, cron, daemon,
ftp, kern, lpr, mail, news, security, syslog, user, uucp, local0,
local1, local2, local3, local4, local5, local6 and local7. The default
is daemon. 

dit(bf(port)) You can override the default port the daemon will listen on
by specifying this value (defaults to 873).  This is ignored if the daemon
is being run by inetd, and is superseded by the bf(--port) command-line option.

dit(bf(address)) You can override the default IP address the daemon
will listen on by specifying this value.  This is ignored if the daemon is
being run by inetd, and is superseded by the bf(--address) command-line option.

dit(bf(socket options)) This option can provide endless fun for people
who like to tune their systems to the utmost degree. You can set all
sorts of socket options which may make transfers faster (or
slower!). Read the man page for the setsockopt() system call for
details on some of the options you may be able to set. By default no
special socket options are set.

enddit()


manpagesection(MODULE OPTIONS)

After the global options you should define a number of modules, each
module exports a directory tree as a symbolic name. Modules are
exported by specifying a module name in square brackets [module]
followed by the options for that module.

startdit()

dit(bf(comment)) The "comment" option specifies a description string
that is displayed next to the module name when clients obtain a list
of available modules. The default is no comment.

dit(bf(path)) The "path" option specifies the directory in the daemon's
filesystem to make available in this module.  You must specify this option
for each module in tt(rsyncd.conf).

dit(bf(use chroot)) If "use chroot" is true, the rsync daemon will chroot
to the "path" before starting the file transfer with the client.  This has
the advantage of extra protection against possible implementation security
holes, but it has the disadvantages of requiring super-user privileges, 
of not being able to follow symbolic links that are either absolute or outside
of the new root path, and of complicating the preservation of usernames and groups
(see below).  When "use chroot" is false, for security reasons,
symlinks may only be relative paths pointing to other files within the root
path, and leading slashes are removed from most absolute paths (options
such as bf(--backup-dir), bf(--compare-dest), etc. interpret an absolute path as
rooted in the module's "path" dir, just as if chroot was specified).
The default for "use chroot" is true.

In order to preserve usernames and groupnames, rsync needs to be able to
use the standard library functions for looking up names and IDs (i.e.
getpwuid(), getgrgid(), getpwname(), and getgrnam()).  This means a
process in the chroot namespace will need to have access to the resources
used by these library functions (traditionally /etc/passwd and
/etc/group).  If these resources are not available, rsync will only be
able to copy the IDs, just as if the bf(--numeric-ids) option had been
specified.

Note that you are free to setup user/group information in the chroot area
differently from your normal system.  For example, you could abbreviate
the list of users and groups.  Also, you can protect this information from
being downloaded/uploaded by adding an exclude rule to the rsync.conf file
(e.g. "exclude = /etc/**").  Note that having the exclusion affect uploads
is a relatively new feature in rsync, so make sure your daemon is
at least 2.6.3 to effect this.  Also note that it is safest to exclude a
directory and all its contents combining the rule "/some/dir/" with the
rule "/some/dir/**" just to be sure that rsync will not allow deeper
access to some of the excluded files inside the directory (rsync tries to
do this automatically, but you might as well specify both to be extra
sure).

dit(bf(max connections)) The "max connections" option allows you to
specify the maximum number of simultaneous connections you will allow.
Any clients connecting when the maximum has been reached will receive a
message telling them to try later.  The default is 0 which means no limit.
See also the "lock file" option.

dit(bf(max verbosity)) The "max verbosity" option allows you to control
the maximum amount of verbose information that you'll allow the daemon to
generate (since the information goes into the log file). The default is 1,
which allows the client to request one level of verbosity.

dit(bf(lock file)) The "lock file" option specifies the file to use to
support the "max connections" option. The rsync daemon uses record
locking on this file to ensure that the max connections limit is not
exceeded for the modules sharing the lock file. 
The default is tt(/var/run/rsyncd.lock).

dit(bf(read only)) The "read only" option determines whether clients
will be able to upload files or not. If "read only" is true then any
attempted uploads will fail. If "read only" is false then uploads will
be possible if file permissions on the daemon side allow them. The default
is for all modules to be read only.

dit(bf(write only)) The "write only" option determines whether clients
will be able to download files or not. If "write only" is true then any
attempted downloads will fail. If "write only" is false then downloads
will be possible if file permissions on the daemon side allow them.  The
default is for this option to be disabled.

dit(bf(list)) The "list" option determines if this module should be
listed when the client asks for a listing of available modules. By
setting this to false you can create hidden modules. The default is
for modules to be listable.

dit(bf(uid)) The "uid" option specifies the user name or user ID that
file transfers to and from that module should take place as when the daemon
was run as root. In combination with the "gid" option this determines what
file permissions are available. The default is uid -2, which is normally
the user "nobody".

dit(bf(gid)) The "gid" option specifies the group name or group ID that
file transfers to and from that module should take place as when the daemon
was run as root. This complements the "uid" option. The default is gid -2,
which is normally the group "nobody".

dit(bf(filter)) The "filter" option allows you to specify a space-separated
list of filter rules that the daemon will not allow to be read or written.
This is only superficially equivalent to the client specifying these
patterns with the bf(--filter) option.  Only one "filter" option may be
specified, but it may contain as many rules as you like, including
merge-file rules.  Note that per-directory merge-file rules do not provide
as much protection as global rules, but they can be used to make bf(--delete)
work better when a client downloads the daemon's files (if the per-dir
merge files are included in the transfer).

dit(bf(exclude)) The "exclude" option allows you to specify a
space-separated list of patterns that the daemon will not allow to be read
or written.  This is only superficially equivalent to the client
specifying these patterns with the bf(--exclude) option.  Only one "exclude"
option may be specified, but you can use "-" and "+" before patterns to
specify exclude/include.

Because this exclude list is not passed to the client it only applies on
the daemon: that is, it excludes files received by a client when receiving
from a daemon and files deleted on a daemon when sending to a daemon, but
it doesn't exclude files from being deleted on a client when receiving
from a daemon.  

dit(bf(exclude from)) The "exclude from" option specifies a filename
on the daemon that contains exclude patterns, one per line.
This is only superficially equivalent
to the client specifying the bf(--exclude-from) option with an equivalent file.
See the "exclude" option above.

dit(bf(include)) The "include" option allows you to specify a
space-separated list of patterns which rsync should not exclude. This is
only superficially equivalent to the client specifying these patterns with
the bf(--include) option because it applies only on the daemon.  This is
useful as it allows you to build up quite complex exclude/include rules.
Only one "include" option may be specified, but you can use "+" and "-"
before patterns to switch include/exclude.  See the "exclude" option
above.

dit(bf(include from)) The "include from" option specifies a filename
on the daemon that contains include patterns, one per line. This is
only superficially equivalent to the client specifying the
bf(--include-from) option with a equivalent file.
See the "exclude" option above.

dit(bf(auth users)) The "auth users" option specifies a comma and
space-separated list of usernames that will be allowed to connect to
this module. The usernames do not need to exist on the local
system. The usernames may also contain shell wildcard characters. If
"auth users" is set then the client will be challenged to supply a
username and password to connect to the module. A challenge response
authentication protocol is used for this exchange. The plain text
usernames are passwords are stored in the file specified by the
"secrets file" option. The default is for all users to be able to
connect without a password (this is called "anonymous rsync").

See also the "CONNECTING TO AN RSYNC DAEMON OVER A REMOTE SHELL
PROGRAM" section in rsync(1) for information on how handle an
rsyncd.conf-level username that differs from the remote-shell-level
username when using a remote shell to connect to an rsync daemon.

dit(bf(secrets file)) The "secrets file" option specifies the name of
a file that contains the username:password pairs used for
authenticating this module. This file is only consulted if the "auth
users" option is specified. The file is line based and contains
username:password pairs separated by a single colon. Any line starting
with a hash (#) is considered a comment and is skipped. The passwords
can contain any characters but be warned that many operating systems
limit the length of passwords that can be typed at the client end, so
you may find that passwords longer than 8 characters don't work. 

There is no default for the "secrets file" option, you must choose a name
(such as tt(/etc/rsyncd.secrets)).  The file must normally not be readable
by "other"; see "strict modes".

dit(bf(strict modes)) The "strict modes" option determines whether or not 
the permissions on the secrets file will be checked.  If "strict modes" is
true, then the secrets file must not be readable by any user ID other
than the one that the rsync daemon is running under.  If "strict modes" is
false, the check is not performed.  The default is true.  This option
was added to accommodate rsync running on the Windows operating system.

dit(bf(hosts allow)) The "hosts allow" option allows you to specify a
list of patterns that are matched against a connecting clients
hostname and IP address. If none of the patterns match then the
connection is rejected.

Each pattern can be in one of five forms:

quote(itemize(
  it() a dotted decimal IPv4 address of the form a.b.c.d, or an IPv6 address
  of the form a:b:c::d:e:f. In this case the incoming machine's IP address
  must match exactly.
  it() an address/mask in the form ipaddr/n where ipaddr is the IP address
  and n is the number of one bits in the netmask.  All IP addresses which
  match the masked IP address will be allowed in.
  it() an address/mask in the form ipaddr/maskaddr where ipaddr is the
  IP address and maskaddr is the netmask in dotted decimal notation for IPv4,
  or similar for IPv6, e.g. ffff:ffff:ffff:ffff:: instead of /64. All IP
  addresses which match the masked IP address will be allowed in.
  it() a hostname. The hostname as determined by a reverse lookup will
  be matched (case insensitive) against the pattern. Only an exact
  match is allowed in.
  it() a hostname pattern using wildcards. These are matched using the
  same rules as normal unix filename matching. If the pattern matches
  then the client is allowed in.
))

Note IPv6 link-local addresses can have a scope in the address specification:

quote(
tt(    fe80::1%link1)nl()
tt(    fe80::%link1/64)nl()
tt(    fe80::%link1/ffff:ffff:ffff:ffff::)nl()
)

You can also combine "hosts allow" with a separate "hosts deny"
option. If both options are specified then the "hosts allow" option s
checked first and a match results in the client being able to
connect. The "hosts deny" option is then checked and a match means
that the host is rejected. If the host does not match either the 
"hosts allow" or the "hosts deny" patterns then it is allowed to
connect.

The default is no "hosts allow" option, which means all hosts can connect.

dit(bf(hosts deny)) The "hosts deny" option allows you to specify a
list of patterns that are matched against a connecting clients
hostname and IP address. If the pattern matches then the connection is
rejected. See the "hosts allow" option for more information.

The default is no "hosts deny" option, which means all hosts can connect.

dit(bf(ignore errors)) The "ignore errors" option tells rsyncd to
ignore I/O errors on the daemon when deciding whether to run the delete
phase of the transfer. Normally rsync skips the bf(--delete) step if any
I/O errors have occurred in order to prevent disastrous deletion due
to a temporary resource shortage or other I/O error. In some cases this
test is counter productive so you can use this option to turn off this
behavior. 

dit(bf(ignore nonreadable)) This tells the rsync daemon to completely
ignore files that are not readable by the user. This is useful for
public archives that may have some non-readable files among the
directories, and the sysadmin doesn't want those files to be seen at all.

dit(bf(transfer logging)) The "transfer logging" option enables per-file 
logging of downloads and uploads in a format somewhat similar to that
used by ftp daemons.  The daemon always logs the transfer at the end, so
if a transfer is aborted, no mention will be made in the log file.

If you want to customize the log lines, see the "log format" option.

dit(bf(log format)) The "log format" option allows you to specify the
format used for logging file transfers when transfer logging is enabled.
The format is a text string containing embedded single-character escape
sequences prefixed with a percent (%) character.  An optional numeric
field width may also be specified between the percent and the escape
letter (e.g. "%-50n %8l %07p").

The default log format is "%o %h [%a] %m (%u) %f %l", and a "%t [%p] "
is always prefixed when using the "log file" option.
(A perl script that will summarize this default log format is included
in the rsync source code distribution in the "support" subdirectory:
rsyncstats.)

The single-character escapes that are understood are as follows:

quote(itemize(
  it() %h for the remote host name
  it() %a for the remote IP address
  it() %l for the length of the file in bytes
  it() %p for the process ID of this rsync session
  it() %o for the operation, which is "send", "recv", or "del."
  (the latter includes the trailing period)
  it() %f for the filename (long form on sender; no trailing "/")
  it() %n for the filename (short form; trailing "/" on dir)
  it() %L either the string " -> SYMLINK", or " => HARDLINK" or an
  empty string (where bf(SYMLINK) or bf(HARDLINK) is a filename)
  it() %P for the module path
  it() %m for the module name
  it() %t for the current date time
  it() %u for the authenticated username (or the null string)
  it() %b for the number of bytes actually transferred 
  it() %c when sending files this gives the number of checksum bytes
    received for this file
  it() %i an itemized list of what is being updated
))

For a list of what the characters mean that are output by "%i", see the
bf(--itemize-changes) option in the rsync manpage.

Note that some of the logged output changes when talking with older
rsync versions.  For instance, deleted files were only output as verbose
messages prior to rsync 2.6.4.

dit(bf(timeout)) The "timeout" option allows you to override the
clients choice for I/O timeout for this module. Using this option you
can ensure that rsync won't wait on a dead client forever. The timeout
is specified in seconds. A value of zero means no timeout and is the
default. A good choice for anonymous rsync daemons may be 600 (giving
a 10 minute timeout).

dit(bf(refuse options)) The "refuse options" option allows you to
specify a space-separated list of rsync command line options that will
be refused by your rsync daemon.
You may specify the full option name, its one-letter abbreviation, or a
wild-card string that matches multiple options.
For example, this would refuse bf(--checksum) (bf(-c)) and all the various
delete options:

quote(tt(    refuse options = c delete))

The reason the above refuses all delete options is that the options imply
bf(--delete), and implied options are refused just like explicit options.
As an additional safety feature, the refusal of "delete" also refuses
bf(remove-sent-files) when the daemon is the sender; if you want the latter
without the former, instead refuse "delete-*" -- that refuses all the
delete modes without affecting bf(--remove-sent-files).

When an option is refused, the daemon prints an error message and exits.
To prevent all compression, you can use "dont compress = *" (see below)
instead of "refuse options = compress" to avoid returning an error to a
client that requests compression.

dit(bf(dont compress)) The "dont compress" option allows you to select
filenames based on wildcard patterns that should not be compressed
during transfer. Compression is expensive in terms of CPU usage so it
is usually good to not try to compress files that won't compress well,
such as already compressed files. 

The "dont compress" option takes a space-separated list of
case-insensitive wildcard patterns. Any source filename matching one
of the patterns will not be compressed during transfer.

The default setting is tt(*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz)

enddit()

manpagesection(AUTHENTICATION STRENGTH)

The authentication protocol used in rsync is a 128 bit MD4 based
challenge response system. Although I believe that no one has ever
demonstrated a brute-force break of this sort of system you should
realize that this is not a "military strength" authentication system.
It should be good enough for most purposes but if you want really top
quality security then I recommend that you run rsync over ssh.

Also note that the rsync daemon protocol does not currently provide any
encryption of the data that is transferred over the connection. Only
authentication is provided. Use ssh as the transport if you want
encryption.

Future versions of rsync may support SSL for better authentication and
encryption, but that is still being investigated.

manpagesection(RUNNING AN RSYNC DAEMON OVER A REMOTE SHELL PROGRAM)

If rsync is run with both the bf(--daemon) and bf(--rsh) (bf(-e)) options, it will
spawn an rsync daemon using a remote shell connection.  Several
configuration options will not be available unless the remote user is
root (e.g. chroot, setuid/setgid, etc.).  There is no need to configure
inetd or the services map to include the rsync daemon port if you run an
rsync daemon only via a remote shell program.

ADVANCED: To run an rsync daemon out of a single-use ssh key, use the
"command=em(COMMAND)" syntax in the remote user's authorized_keys entry,
where command would be

quote(tt(rsync --server --daemon .))

NOTE: rsync's argument parsing expects the trailing ".", so make sure
that it's there.  If you want to use an rsyncd.conf(5)-style
configuration file other than the default, you can added a
bf(--config) option to the em(command):

quote(tt(rsync --server --daemon --config=em(file) .))

Note that the "--server" here is the internal option that rsync uses to
run the remote version of rsync that it communicates with, and thus you
should not be using the bf(--server) option under normal circumstances.

manpagesection(EXAMPLES)

A simple rsyncd.conf file that allow anonymous rsync to a ftp area at
tt(/home/ftp) would be:

verb(
[ftp]
        path = /home/ftp
        comment = ftp export area
)

A more sophisticated example would be:

verb(
uid = nobody
gid = nobody
use chroot = no
max connections = 4
syslog facility = local5
pid file = /var/run/rsyncd.pid

[ftp]
        path = /var/ftp/pub
        comment = whole ftp area (approx 6.1 GB)

[sambaftp]
        path = /var/ftp/pub/samba
        comment = Samba ftp area (approx 300 MB)

[rsyncftp]
        path = /var/ftp/pub/rsync
        comment = rsync ftp area (approx 6 MB)
        
[sambawww]
        path = /public_html/samba
        comment = Samba WWW pages (approx 240 MB)

[cvs]
        path = /data/cvs
        comment = CVS repository (requires authentication)
        auth users = tridge, susan
        secrets file = /etc/rsyncd.secrets
)

The /etc/rsyncd.secrets file would look something like this:

quote(
tt(tridge:mypass)nl()
tt(susan:herpass)nl()
)

manpagefiles()

/etc/rsyncd.conf or rsyncd.conf

manpageseealso()

rsync(1)

manpagediagnostics()

manpagebugs()

Please report bugs! The rsync bug tracking system is online at
url(http://rsync.samba.org/)(http://rsync.samba.org/)

manpagesection(VERSION)

This man page is current for version 2.6.5pre2 of rsync.

manpagesection(CREDITS)

rsync is distributed under the GNU public license.  See the file
COPYING for details.

The primary ftp site for rsync is
url(ftp://rsync.samba.org/pub/rsync)(ftp://rsync.samba.org/pub/rsync).

A WEB site is available at
url(http://rsync.samba.org/)(http://rsync.samba.org/)

We would be delighted to hear from you if you like this program.

This program uses the zlib compression library written by Jean-loup
Gailly and Mark Adler.

manpagesection(THANKS)

Thanks to Warren Stanley for his original idea and patch for the rsync
daemon. Thanks to Karsten Thygesen for his many suggestions and
documentation! 

manpageauthor()

rsync was written by Andrew Tridgell and Paul Mackerras.
Many people have later contributed to it.

Mailing lists for support and development are available at
url(http://lists.samba.org)(lists.samba.org) 
