From 687d264b689b8c49a67e2e52a8a5e0caa01c04ce Mon Sep 17 00:00:00 2001
From: Nick Craig-Wood
Date: Fri, 4 Sep 2026 17:03:20 +0100
Subject: [PATCH] Version v1.75.1
---
MANUAL.html | 3713 +++++++++++-------
MANUAL.md | 2242 +++++++----
MANUAL.txt | 2302 +++++++----
docs/content/bisync.md | 9 +-
docs/content/changelog.md | 143 +
docs/content/commands/rclone.md | 2 +-
docs/content/commands/rclone_convmv.md | 4 +-
docs/content/commands/rclone_mount.md | 10 +-
docs/content/commands/rclone_nfsmount.md | 10 +-
docs/content/commands/rclone_serve_dlna.md | 5 +-
docs/content/commands/rclone_serve_docker.md | 5 +-
docs/content/commands/rclone_serve_ftp.md | 58 +-
docs/content/commands/rclone_serve_http.md | 58 +-
docs/content/commands/rclone_serve_nfs.md | 5 +-
docs/content/commands/rclone_serve_s3.md | 362 +-
docs/content/commands/rclone_serve_sftp.md | 58 +-
docs/content/commands/rclone_serve_webdav.md | 58 +-
docs/content/flags.md | 2 +-
docs/content/http.md | 6 +
docs/content/s3.md | 53 +-
lib/transform/transform.md | 4 +-
rclone.1 | 2798 ++++++++-----
22 files changed, 7762 insertions(+), 4145 deletions(-)
diff --git a/MANUAL.html b/MANUAL.html
index 4a397f5b7..23f7906bf 100644
--- a/MANUAL.html
+++ b/MANUAL.html
@@ -233,7 +233,7 @@
NAME
rclone - manage files on cloud storage
@@ -868,7 +868,7 @@ current version is as below.
src="https://snapcraft.io/rclone/badge.svg" alt="rclone" />
Source installation
Make sure you have git and Go
-installed. Go version 1.25 or newer is required, the latest release is
+installed. Go version 1.26 or newer is required, the latest release is
recommended. You can get it from your package manager, or download it
from golang.org/dl. Then you can
run the following:
@@ -4623,9 +4623,9 @@ SquareBracket
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,command=echo"
// Output: stories/The Quick Brown Fox!.txt
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{YYYYMMDD}"
-// Output: stories/The Quick Brown Fox!-20260731
+// Output: stories/The Quick Brown Fox!-20260904
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{macfriendlytime}"
-// Output: stories/The Quick Brown Fox!-2026-07-31 0340PM
+// Output: stories/The Quick Brown Fox!-2026-09-04 0450PM
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,regex=[\\.\\w]/ab"
// Output: ababababababab/ababab ababababab ababababab ababab!abababab
The regex command generally accepts Perl-style regular expressions,
@@ -6164,6 +6164,12 @@ server.
and serve commands on macOS. For details, see vfs-case-sensitivity.
NFS mount
+For macOS (and other platforms where this path is supported), prefer
+the dedicated rclone nfsmount
+command. It starts the NFS server and performs the mount for you.
+rclone mount itself still uses FUSE (macFUSE/FUSE-T) and
+does not switch to NFS via a flag.
This method spins up an NFS server using serve nfs
command and mounts it to the specified mountpoint. If you run this in
@@ -6453,7 +6459,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -6496,11 +6502,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -7438,6 +7445,12 @@ server.
and serve commands on macOS. For details, see vfs-case-sensitivity.
NFS mount
+For macOS (and other platforms where this path is supported), prefer
+the dedicated rclone nfsmount
+command. It starts the NFS server and performs the mount for you.
+rclone mount itself still uses FUSE (macFUSE/FUSE-T) and
+does not switch to NFS via a flag.
This method spins up an NFS server using serve nfs
command and mounts it to the specified mountpoint. If you run this in
@@ -7727,7 +7740,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -7770,11 +7783,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -8847,7 +8861,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -8890,11 +8904,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -9411,7 +9426,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -9454,11 +9469,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -9920,7 +9936,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -9963,11 +9979,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -10296,35 +10313,69 @@ proxy program to make a complete config.
_root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
_obscure - comma separated strings for parameters to
obscure
+_secret_access_key - the secret for S3 access key auth
+(see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
{
"user": "me",
- "pass": "mypassword"
-}
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+}
If public-key authentication was used by the client, input to the
proxy process (on STDIN) would look similar to this:
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
-}
-And as an example return this on STDOUT
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+}
+If the client authenticated with an S3 access key
+(rclone serve s3), the client never sends its secret, only
+a signature made with it, so the input contains just the access key ID
+as the user with no pass or
+public_key:
{
- "type": "sftp",
- "_root": "",
- "_obscure": "pass",
- "user": "me",
- "pass": "mypassword",
- "host": "sftp.example.com"
-}
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field
+of the output. Rclone then uses that secret to verify the signature on
+the request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+_secret_access_key or returns it empty the request is
+refused.
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+The client_ip key holds the IP address the client
+connected from, without a port number. It can be used to restrict logins
+to certain networks, or to log authentication attempts centrally. It is
+omitted if the client has no IP address, for example when connecting
+over a unix socket. Note that if rclone is behind a reverse proxy this
+will be the address of the reverse proxy and not the original
+client.
+And as an example return this on STDOUT
+{
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+}
This would mean that an SFTP backend would be created on the fly for
the user and pass/public_key
returned in the output to the host given. Note that since
@@ -10337,12 +10388,13 @@ make the user be user@example.com and then set
the host to example.com in the output and the
user to user. For security you'd probably want to restrict
the host to a limited list.
-An internal cache of backends is keyed on the user and a
-hash of the pass or public_key. This means
-that if a user's password or public-key changes, or the proxy returns
-different config parameters (eg a rotated api_key), a fresh
-backend will be created on the next request rather than the cached one
-being reused.
+An internal cache of backends is keyed on the user, a
+hash of the pass or public_key, and the
+client_ip. This means that if a user's password or
+public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated
+api_key), a fresh backend will be created on the next
+request rather than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
rclone serve ftp remote:path [flags]
@@ -10711,7 +10763,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -10754,11 +10806,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -11087,35 +11140,69 @@ proxy program to make a complete config.
_root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
_obscure - comma separated strings for parameters to
obscure
+_secret_access_key - the secret for S3 access key auth
+(see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
-{
- "user": "me",
- "pass": "mypassword"
-}
-If public-key authentication was used by the client, input to the
-proxy process (on STDIN) would look similar to this:
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
-}
-And as an example return this on STDOUT
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+}
+If public-key authentication was used by the client, input to the
+proxy process (on STDIN) would look similar to this:
{
- "type": "sftp",
- "_root": "",
- "_obscure": "pass",
- "user": "me",
- "pass": "mypassword",
- "host": "sftp.example.com"
-}
+ "user": "me",
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+}
+If the client authenticated with an S3 access key
+(rclone serve s3), the client never sends its secret, only
+a signature made with it, so the input contains just the access key ID
+as the user with no pass or
+public_key:
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field
+of the output. Rclone then uses that secret to verify the signature on
+the request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+_secret_access_key or returns it empty the request is
+refused.
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+The client_ip key holds the IP address the client
+connected from, without a port number. It can be used to restrict logins
+to certain networks, or to log authentication attempts centrally. It is
+omitted if the client has no IP address, for example when connecting
+over a unix socket. Note that if rclone is behind a reverse proxy this
+will be the address of the reverse proxy and not the original
+client.
+And as an example return this on STDOUT
+{
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+}
This would mean that an SFTP backend would be created on the fly for
the user and pass/public_key
returned in the output to the host given. Note that since
@@ -11128,12 +11215,13 @@ make the user be user@example.com and then set
the host to example.com in the output and the
user to user. For security you'd probably want to restrict
the host to a limited list.
-An internal cache of backends is keyed on the user and a
-hash of the pass or public_key. This means
-that if a user's password or public-key changes, or the proxy returns
-different config parameters (eg a rotated api_key), a fresh
-backend will be created on the next request rather than the cached one
-being reused.
+An internal cache of backends is keyed on the user, a
+hash of the pass or public_key, and the
+client_ip. This means that if a user's password or
+public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated
+api_key), a fresh backend will be created on the next
+request rather than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
rclone serve http remote:path [flags]
@@ -11281,20 +11369,20 @@ default is 1000000, but consider lowering this limit if the
server's system resource usage causes problems. This is only used by the
memory type cache.
To serve NFS over the network use following command:
-rclone serve nfs remote: --addr 0.0.0.0:$PORT --vfs-cache-mode=full
+rclone serve nfs remote: --addr 0.0.0.0:$PORT --vfs-cache-mode=full
This specifies a port that can be used in the mount command. To mount
the server under Linux/macOS, use the following command:
-mount -t nfs -o port=$PORT,mountport=$PORT,tcp $HOSTNAME:/ path/to/mountpoint
+mount -t nfs -o port=$PORT,mountport=$PORT,tcp $HOSTNAME:/ path/to/mountpoint
Where $PORT is the same port number used in the
serve nfs command and $HOSTNAME is the network
address of the machine that serve nfs was run on.
NFS clients can also mount a subdirectory of the served remote by
including it in the mount path. For example to mount only the
photos/2024 subdirectory:
-mount -t nfs -o port=$PORT,mountport=$PORT,tcp $HOSTNAME:/photos/2024 path/to/mountpoint
+mount -t nfs -o port=$PORT,mountport=$PORT,tcp $HOSTNAME:/photos/2024 path/to/mountpoint
The subpath is resolved within the served remote and must refer to an
existing directory (not a file or a symlink). Subpath mounts are a
convenience equivalent to mounting / and changing
@@ -11346,7 +11434,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -11389,11 +11477,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -11992,6 +12081,11 @@ docs).
--auth-key can be repeated for multiple auth pairs. If
--auth-key is not provided then serve s3 will
allow anonymous access.
+Alternatively --auth-proxy can be used to look up the
+secret for each access key ID and choose the backend it maps to (see Auth Proxy below). When an auth proxy is in use
+--auth-key is ignored and every request must be signed with
+the secret the proxy returns for its access key ID.
Like all rclone flags --auth-key can be set via
environment variables, in this case RCLONE_AUTH_KEY. Since
this flag can be repeated, the input to RCLONE_AUTH_KEY is
@@ -12024,9 +12118,9 @@ the server like this:
with a command like this:
rclone serve s3 --auth-key ACCESS_KEY_ID,SECRET_ACCESS_KEY local:/path/to/folder
The rclone.conf for the server could look like this:
-
+
The local configuration is optional though. If you run
the server with a remote:path like
/path/to/folder (without the local: prefix and
@@ -12035,31 +12129,76 @@ default configuration, which will be visible as a warning in the logs.
But it will run nonetheless.
This will be compatible with an rclone (client) remote configuration
which is defined like this:
-[serves3]
-type = s3
-provider = Rclone
-endpoint = http://127.0.0.1:8080/
-access_key_id = ACCESS_KEY_ID
-secret_access_key = SECRET_ACCESS_KEY
+[serves3]
+type = s3
+provider = Rclone
+endpoint = http://127.0.0.1:8080/
+access_key_id = ACCESS_KEY_ID
+secret_access_key = SECRET_ACCESS_KEY
+Object uploads (PUT)
+A PutObject upload only ever changes the object at its
+key atomically, on success, a failed or interrupted PUT neither removes
+nor overwrites the object already stored at the key, and never leaves a
+partial object visible at it.
+Remotes that upload atomically (e.g. object stores such as
+s3) are streamed straight to the destination. On remotes
+where a partial upload would otherwise be visible (e.g.
+local), and whenever --vfs-cache-mode is
+writes or above, the upload is written to a temporary
+object that is renamed into place on success; these remotes need to
+support a server-side move or copy for this (nearly all do - without
+move or copy the upload is written directly and a failed PUT may leave a
+partial object at the key). If serve s3 is killed part-way
+through an upload the temporary object (named with a leading
+.rclone_temp_put_) may be left behind; it is hidden from S3
+listings but must be removed manually.
Multipart uploads
-By default serve s3 streams each
-multipart upload, in part-number order, into a single
-PutStream upload to the underlying remote, so the whole
-file is never buffered in memory - memory use stays bounded by the parts
-in flight. The remote then performs its own internal upload (for example
-its own multipart upload, still with bounded memory). This works for any
-remote that supports PutStream, which is nearly all of
-them, including through crypt.
-The upload is atomic so the destination object only ever changes on a
+
Multipart uploads are written, in part-number order, to a temporary
+object which is renamed into place, server-side, on completion, so the
+upload is atomic. The object at the key only ever changes on a
successful completion. A failed or aborted upload never affects any
-object already stored under that name. Remotes that upload atomically
-already (object stores such as s3) are streamed straight to
-the destination. On remotes where a partial upload would otherwise be
-visible (such as local), the parts are streamed to a
-temporary object that is moved into place, server-side, on completion;
-these remotes therefore also need to support a server-side move or
-copy.
+object already stored under that name and a partly-uploaded object never
+becomes visible under it.
+With the default --vfs-cache-mode off
+serve s3 streams each multipart upload, in
+part-number order, into a single streaming upload to the underlying
+remote, so the whole file is never buffered in memory. Memory use stays
+bounded by the parts in flight. The remote then performs its own
+internal upload (for example its own multipart upload, still with
+bounded memory). Remotes that don't support streaming uploads (those
+that must know the file size before the upload starts, such as
+onedrive, pcloud, jottacloud,
+mailru, opendrive, putio,
+protondrive and zoho) have the parts spooled
+to a temporary file on local disk instead, and uploaded
+with the size then known on completion, so they need local disk space
+for the largest objects in flight rather than memory.
+With --vfs-cache-mode writes (or full) the
+parts are written to a temporary file in the VFS cache and uploaded by
+the VFS write-back - see Multipart uploads and the
+VFS cache below.
+The rename into place needs the remote to support a server-side move
+or copy, which nearly all do. It is a cheap rename on most remotes, but
+on object stores without a real rename (such as s3 itself)
+the move is performed as a server-side copy and delete of the whole
+object, which can take time and API calls for large objects. Concurrent
+multipart uploads of the same key (which S3 permits) are safe. Each
+writes its own temporary object and the last to complete wins.
+On the few remotes that support neither server side move nor copy,
+the parts are written straight to the destination object instead and
+never buffered in memory. This is at some cost in atomicity - the
+incomplete object is visible under its final name while the upload is in
+flight, as it also is for a plain object PUT on such remotes, and
+concurrent multipart uploads of the same key write to the same object
+and can interleave. A failed or aborted upload still leaves any
+pre-existing object untouched provided the remote uploads atomically and
+the VFS cache is off; on a remote where partial uploads are visible it
+may leave partial data at the key (like a plain PUT there), and with
+--vfs-cache-mode writes (or full) a write to
+the cache cannot be abandoned, so an aborted upload's partial data is
+written back to the remote as if it had completed.
Features
- The whole object is never buffered in memory; memory use is bounded
@@ -12073,10 +12212,14 @@ chunk size plus a variable overshoot.
is encrypted as one continuous stream.
- The destination object only ever changes atomically, on completion:
an aborted or failed upload leaves any pre-existing object of the same
-name untouched, and a partly-uploaded object never becomes visible.
-- Backend-agnostic - it only needs the remote to support
-
PutStream (plus a server-side move or copy on remotes that
-don't upload atomically).
+name untouched, and a partly-uploaded object never becomes visible
+(except on the few remotes with no server-side move or copy, as
+above).
+- Multipart uploads go through the VFS like any other upload, so they
+show in rclone's transfer stats and obey
--bwlimit.
+- Backend-agnostic - it only needs the remote to support a server-side
+move or copy for the rename into place, which nearly all do; a remote
+without streaming upload support spools to local disk as above.
Limitations
@@ -12102,31 +12245,117 @@ rejected. A failure in the stream to the remote itself still aborts the
whole upload and the client must start it again. (The remote's own
upload still retries its internal chunks.)
- Parts are serialised into one stream, so ingest from the client is
-effectively single-threaded, although the remote's own upload still runs
-concurrently.
-- On remotes that don't upload atomically (such as
-
local), the completed object is moved into place with a
-server-side operation. This is a cheap rename on most such remotes. On
-these remotes, if serve s3 is killed part-way through an
-upload the temporary object (named with a leading
-.rclone_multipart_upload_) may be left behind; it is hidden
+effectively single-threaded. When streaming, the remote's own upload
+runs concurrently with the parts arriving; with the local disk spool or
+the VFS cache the upload to the remote only starts on completion.
+- If
serve s3 is killed part-way through an upload the
+temporary object (named with a leading
+.rclone_temp_multipart_) may be left behind; it is hidden
from S3 listings but must be removed manually.
+Multipart uploads and the
+VFS cache
+With --vfs-cache-mode writes (or full)
+multipart uploads do not stream to the remote at all. The parts are
+written, in part-number order, to a temporary file in the VFS cache. On
+completion the file is renamed into place and uploaded by the VFS
+write-back, exactly like a plain object PUT. This needs no streaming
+upload support from the remote. The rename normally happens in the cache
+before the upload has started, but the VFS requires the remote to
+support a server-side move or copy to rename files at all (and uses one
+if the temporary file has already been written back, e.g. with
+--vfs-write-back 0). On remotes without either, the parts
+are written to the cache directly under the final key instead: the
+upload still never touches memory, but it loses its atomicity - the
+in-flight upload is visible at the key, and an aborted upload cannot be
+abandoned once in the cache, so its partial data is written back to the
+remote as if it were a completed object.
+Remotes that benefit from --vfs-cache-mode writes:
+
+- Remotes over slow or unreliable links. A failure in
+a streamed upload aborts the whole multipart upload and the client must
+start again from the first part; a failed write-back upload is retried
+by the VFS (see
--vfs-cache-max-age and friends) without
+the client being involved. Ingest from the client also runs at local
+disk speed rather than being throttled to the remote's pace.
+- Workloads that read back or overwrite what they just
+wrote. The completed object stays in the cache, so subsequent
+
GET/HEAD requests are served locally, and
+plain PUTs and multipart uploads to the same key go through the same
+cache entry so the last write wins regardless of upload style.
+
+The trade-offs of the VFS cache:
+
+- The whole object lands on local disk, so the cache
+(
--cache-dir) needs space for the largest objects in
+flight; --vfs-cache-max-size cannot evict files which are
+still being uploaded.
+- The
200 OK for CompleteMultipartUpload
+means the data is safely in the local cache, not yet on
+the remote - the same durability the cache gives plain PUTs. If an
+acknowledgement must mean the data has reached the remote (for example
+WAL archiving), use the default --vfs-cache-mode off.
+- The upload to the remote only starts on completion, rather than
+overlapping with the parts arriving, so the data reaches the remote
+later than with streaming.
+- If
serve s3 is killed part-way through an upload, the
+temporary file survives in the cache and the VFS cache recovery uploads
+it to the remote on restart as a temporary object (named with a leading
+.rclone_temp_multipart_); as with the streaming path, it is
+hidden from S3 listings but must be removed manually.
+
+Cleaning up temporary
+objects
+If serve s3 is killed part-way through an upload it can
+leave a temporary object behind, named with a leading
+.rclone_temp_. This whole prefix is reserved: any object
+whose name (the last /-separated segment of its key) starts
+with .rclone_temp_ is hidden from S3 listings, so don't
+give real objects such names - an existing object with such a name
+disappears from listings (though it stays accessible directly by its
+key: only listings hide reserved names, GET,
+HEAD and DELETE of the exact key still work).
+A temporary object never holds acknowledged data - uploads whose
+temporary object survived were never confirmed to the client - so old
+ones are safe to delete:
+rclone delete --min-age 24h --include ".rclone_temp_*" remote:path
+The --min-age protects uploads which are still in
+progress: make sure it is longer than your longest upload, especially if
+several serve s3 instances share the same remote.
+rclone v1.75 named its temporary multipart objects
+.rclone_multipart_upload_*; leftovers from an older server
+are also hidden from listings and can be cleaned up the same way.
+Abandoned uploads
+A client which starts a multipart upload and vanishes without either
+completing or aborting it would otherwise hold on to its resources
+forever.
+An incomplete multipart upload which has had no activity for
+--multipart-expiry (default 24h) is therefore
+aborted and cleaned up, exactly as if the client had called
+AbortMultipartUpload, and a NOTICE is
+logged.
+An upload with a part still being received is never expired, however
+slowly the part is arriving, and each completed part restarts the clock,
+so the expiry only needs to outlast the client's pauses between
+parts, not the whole upload.
+Late operations on an expired upload fail with
+NoSuchUpload, as they do on real S3 when a lifecycle rule
+has aborted the upload. Set --multipart-expiry 0 to keep
+incomplete uploads forever.
Disabling streaming
-If you pass --disable-multipart-streaming, or the remote
-doesn't support PutStream (or doesn't upload atomically and
-can't move or copy server-side), multipart uploads are instead
-buffered in memory by the underlying S3 library: every
-part is held in memory and the whole object is written out in one go
-when the upload completes (the previous behaviour). This removes the
+
If you pass --disable-multipart-streaming, multipart
+uploads are instead buffered in memory by the
+underlying S3 library: every part is held in memory and the whole object
+is written out in one go when the upload completes. This removes the
in-order/contiguous-part restriction above, so parts can be uploaded in
any order, but memory use grows with the size of the
upload, so it is only suitable for small objects. A one-off
-NOTICE is logged the first time this happens.
-Alternatively, if the client is an rclone s3 remote
-(like the [serves3] example above), you can set
-use_multipart_uploads = false on it so it uploads each
-object as a single stream and skips multipart uploads altogether.
+NOTICE is logged the first time this happens. This flag is
+the only thing that makes multipart uploads buffer in memory - it is
+never done because of missing remote capabilities. Consider
+--vfs-cache-mode writes instead, which buffers the upload
+in the VFS cache on disk and takes precedence over
+--disable-multipart-streaming.
Bugs
Multipart server side copies do not work (see #7454). These
@@ -12326,7 +12555,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -12369,11 +12598,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -12679,6 +12909,113 @@ total 1048578
If the file has no metadata it will be returned as {}
and if there is an error reading the metadata the error will be returned
as {"error":"error string"}.
+Auth Proxy
+If you supply the parameter
+--auth-proxy /path/to/program then rclone will use that
+program to generate backends on the fly which then are used to
+authenticate incoming requests. This uses a simple JSON based protocol
+with input on STDIN and output on STDOUT.
+PLEASE NOTE: --auth-proxy and
+--authorized-keys cannot be used together, if
+--auth-proxy is set the authorized keys option will be
+ignored.
+There is an example program bin/test_proxy.py
+in the rclone source code.
+The program's job is to take a user and
+pass on the input and turn those into the config for a
+backend on STDOUT in JSON format. This config will have any default
+parameters for the backend added, but it won't use configuration from
+environment variables or command line options - it is the job of the
+proxy program to make a complete config.
+This config generated must have this extra parameter
+
+_root - root to use for the backend
+
+And it may have these parameters
+
+_obscure - comma separated strings for parameters to
+obscure
+_secret_access_key - the secret for S3 access key auth
+(see below)
+
+If password authentication was used by the client, input to the proxy
+process (on STDIN) would look similar to this:
+{
+ "user": "me",
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+}
+If public-key authentication was used by the client, input to the
+proxy process (on STDIN) would look similar to this:
+{
+ "user": "me",
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+}
+If the client authenticated with an S3 access key
+(rclone serve s3), the client never sends its secret, only
+a signature made with it, so the input contains just the access key ID
+as the user with no pass or
+public_key:
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field
+of the output. Rclone then uses that secret to verify the signature on
+the request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+_secret_access_key or returns it empty the request is
+refused.
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+The client_ip key holds the IP address the client
+connected from, without a port number. It can be used to restrict logins
+to certain networks, or to log authentication attempts centrally. It is
+omitted if the client has no IP address, for example when connecting
+over a unix socket. Note that if rclone is behind a reverse proxy this
+will be the address of the reverse proxy and not the original
+client.
+And as an example return this on STDOUT
+{
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+}
+This would mean that an SFTP backend would be created on the fly for
+the user and pass/public_key
+returned in the output to the host given. Note that since
+_obscure is set to pass, rclone will obscure
+the pass parameter before creating the backend (which is
+required for sftp backends).
+The program can manipulate the supplied user in any way,
+for example to make proxy to many different sftp backends, you could
+make the user be user@example.com and then set
+the host to example.com in the output and the
+user to user. For security you'd probably want to restrict
+the host to a limited list.
+An internal cache of backends is keyed on the user, a
+hash of the pass or public_key, and the
+client_ip. This means that if a user's password or
+public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated
+api_key), a fresh backend will be created on the next
+request rather than the cached one being reused.
+This can be used to build general purpose proxies to any kind of
+backend that rclone supports.
rclone serve s3 remote:path [flags]
Options
--addr stringArray IPaddress:Port or :Port to bind server to (default 127.0.0.1:8080)
@@ -12690,7 +13027,7 @@ as {"error":"error string"}.
--client-ca string Client certificate authority to verify clients with
--dir-cache-time Duration Time to cache directory entries for (default 5m0s)
--dir-perms FileMode Directory permissions (default 777)
- --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend (see the Multipart uploads docs section)
+ --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend
--etag-hash string Which hash to use for the ETag, or auto or blank for off (default "MD5")
--file-perms FileMode File permissions (default 666)
--force-path-style If true use path style access if false use virtual hosted style (default true)
@@ -12701,7 +13038,8 @@ as {"error":"error string"}.
--link-perms FileMode Link permissions (default 666)
--max-header-bytes int Maximum size of request header (default 4096)
--min-tls-version string Minimum TLS version that is acceptable (default "tls1.0")
- --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (see the Multipart uploads docs section) (default 256Mi)
+ --multipart-expiry Duration Abort incomplete multipart uploads idle for longer than this, 0 to keep forever (default 1d)
+ --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (default 256Mi)
--no-checksum Don't compare checksums on up/download
--no-cleanup Not to cleanup empty folder after object is deleted
--no-modtime Don't read/write the modification time (can speed things up)
@@ -12876,7 +13214,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -12919,11 +13257,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -13229,7 +13568,7 @@ total 1048578
If the file has no metadata it will be returned as {}
and if there is an error reading the metadata the error will be returned
as {"error":"error string"}.
-Auth Proxy
+Auth Proxy
If you supply the parameter
--auth-proxy /path/to/program then rclone will use that
program to generate backends on the fly which then are used to
@@ -13252,35 +13591,69 @@ proxy program to make a complete config.
_root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
_obscure - comma separated strings for parameters to
obscure
+_secret_access_key - the secret for S3 access key auth
+(see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
-{
- "user": "me",
- "pass": "mypassword"
-}
+{
+ "user": "me",
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+}
If public-key authentication was used by the client, input to the
proxy process (on STDIN) would look similar to this:
-{
- "user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
-}
+{
+ "user": "me",
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+}
+If the client authenticated with an S3 access key
+(rclone serve s3), the client never sends its secret, only
+a signature made with it, so the input contains just the access key ID
+as the user with no pass or
+public_key:
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field
+of the output. Rclone then uses that secret to verify the signature on
+the request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+_secret_access_key or returns it empty the request is
+refused.
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+The client_ip key holds the IP address the client
+connected from, without a port number. It can be used to restrict logins
+to certain networks, or to log authentication attempts centrally. It is
+omitted if the client has no IP address, for example when connecting
+over a unix socket. Note that if rclone is behind a reverse proxy this
+will be the address of the reverse proxy and not the original
+client.
And as an example return this on STDOUT
-{
- "type": "sftp",
- "_root": "",
- "_obscure": "pass",
- "user": "me",
- "pass": "mypassword",
- "host": "sftp.example.com"
-}
+{
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+}
This would mean that an SFTP backend would be created on the fly for
the user and pass/public_key
returned in the output to the host given. Note that since
@@ -13293,12 +13666,13 @@ make the user be user@example.com and then set
the host to example.com in the output and the
user to user. For security you'd probably want to restrict
the host to a limited list.
-An internal cache of backends is keyed on the user and a
-hash of the pass or public_key. This means
-that if a user's password or public-key changes, or the proxy returns
-different config parameters (eg a rotated api_key), a fresh
-backend will be created on the next request rather than the cached one
-being reused.
+An internal cache of backends is keyed on the user, a
+hash of the pass or public_key, and the
+client_ip. This means that if a user's password or
+public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated
+api_key), a fresh backend will be created on the next
+request rather than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
rclone serve sftp remote:path [flags]
@@ -13720,7 +14094,7 @@ that will be used to buffer data in advance.
memory at all times. The buffered data is bound to one open file and
won't be shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not yet
+buffer will only use memory for data that is downloaded but not yet
read. If the buffer is empty, only a small amount of memory will be
used.
The maximum memory used by rclone for buffering can be up to
@@ -13763,11 +14137,12 @@ will start with files that haven't been accessed for the longest. This
cache flushing strategy is efficient and more relevant files are likely
to remain cached.
The --vfs-cache-max-age will evict files from the cache
-after the set time since last access has passed. The default value of 1
-hour will start evicting files from cache that haven't been accessed for
-1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
+after the set time since last access has passed; it is based on access
+time, not on when the file was first added to the cache. The default
+value of 1 hour will start evicting files from cache that haven't been
+accessed for 1 hour. When a cached file is accessed the 1 hour timer is
+reset to 0 and will wait for 1 more hour before evicting. Specify the
+time with standard notation, s, m, h, d, w .
You should not run two copies of rclone using the
same VFS cache with the same or overlapping remotes if using
--vfs-cache-mode > off. This can potentially cause data
@@ -14073,7 +14448,7 @@ total 1048578
If the file has no metadata it will be returned as {}
and if there is an error reading the metadata the error will be returned
as {"error":"error string"}.
-Auth Proxy
+Auth Proxy
If you supply the parameter
--auth-proxy /path/to/program then rclone will use that
program to generate backends on the fly which then are used to
@@ -14096,35 +14471,69 @@ proxy program to make a complete config.
_root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
_obscure - comma separated strings for parameters to
obscure
+_secret_access_key - the secret for S3 access key auth
+(see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
-{
- "user": "me",
- "pass": "mypassword"
-}
+{
+ "user": "me",
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+}
If public-key authentication was used by the client, input to the
proxy process (on STDIN) would look similar to this:
-{
- "user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
-}
+{
+ "user": "me",
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+}
+If the client authenticated with an S3 access key
+(rclone serve s3), the client never sends its secret, only
+a signature made with it, so the input contains just the access key ID
+as the user with no pass or
+public_key:
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field
+of the output. Rclone then uses that secret to verify the signature on
+the request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+_secret_access_key or returns it empty the request is
+refused.
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+The client_ip key holds the IP address the client
+connected from, without a port number. It can be used to restrict logins
+to certain networks, or to log authentication attempts centrally. It is
+omitted if the client has no IP address, for example when connecting
+over a unix socket. Note that if rclone is behind a reverse proxy this
+will be the address of the reverse proxy and not the original
+client.
And as an example return this on STDOUT
-{
- "type": "sftp",
- "_root": "",
- "_obscure": "pass",
- "user": "me",
- "pass": "mypassword",
- "host": "sftp.example.com"
-}
+{
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+}
This would mean that an SFTP backend would be created on the fly for
the user and pass/public_key
returned in the output to the host given. Note that since
@@ -14137,12 +14546,13 @@ make the user be user@example.com and then set
the host to example.com in the output and the
user to user. For security you'd probably want to restrict
the host to a limited list.
-An internal cache of backends is keyed on the user and a
-hash of the pass or public_key. This means
-that if a user's password or public-key changes, or the proxy returns
-different config parameters (eg a rotated api_key), a fresh
-backend will be created on the next request rather than the cached one
-being reused.
+An internal cache of backends is keyed on the user, a
+hash of the pass or public_key, and the
+client_ip. This means that if a user's password or
+public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated
+api_key), a fresh backend will be created on the next
+request rather than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
rclone serve webdav remote:path [flags]
@@ -14837,11 +15247,11 @@ infrastructure without a proper certificate. You could supply the
--no-check-certificate flag to rclone, but this will affect
all the remotes. To make it just affect this remote you
use an override. You could put this in the config file:
-[remote]
-type = XXX
-...
-override.no_check_certificate = true
+[remote]
+type = XXX
+...
+override.no_check_certificate = true
or use it in the connection string
remote,override.no_check_certificate=true: (or just
remote,override.no_check_certificate:).
@@ -14885,11 +15295,11 @@ as an override. For example, say you have a remote where
you would always like to use the --checksum flag. You could
supply the --checksum flag to rclone on every command line,
but instead you could put this in the config file:
-[remote]
-type = XXX
-...
-global.checksum = true
+[remote]
+type = XXX
+...
+global.checksum = true
or use it in the connection string
remote,global.checksum=true: (or just
remote,global.checksum:). This is equivalent to using the
@@ -14925,13 +15335,13 @@ shell.
Windows
If your names have spaces in you need to put them in ",
e.g.
-rclone copy "E:\folder name\folder name\folder name" remote:backup
+rclone copy "E:\folder name\folder name\folder name" remote:backup
If you are using the root directory on its own then don't quote it
(see #464 for
why), e.g.
-rclone copy E:\ remote:backup
+rclone copy E:\ remote:backup
Copying files or
directories with : in the names
rclone uses : to mark a remote name. This is, however, a
@@ -15360,7 +15770,7 @@ effect at the start of the transfer.
--transfer will use this much memory for buffering.
When using mount or cmount each open file
descriptor will use this much memory for buffering. See the mount
+href="https://rclone.org/commands/rclone_mount/#vfs-file-buffering">mount
documentation for more details.
Set to 0 to disable the buffering for the minimum memory
usage.
@@ -15544,11 +15954,11 @@ value is the internal lowercase name as returned by command
rclone help backends. Comments are indicated by
; or # at the beginning of a line.
Example:
-[megaremote]
-type = mega
-user = you@example.com
-pass = PDPcQVVjVtzFY-GTdDFozqBhTdsPg3qH
+[megaremote]
+type = mega
+user = you@example.com
+pass = PDPcQVVjVtzFY-GTdDFozqBhTdsPg3qH
Note that passwords are in obscured form.
Also, many storage systems uses token-based authentication instead of
@@ -16069,49 +16479,49 @@ complete log file is not strictly valid JSON and needs a parser that can
handle it.
The JSON logs will be printed on a single line, but are shown
expanded here for clarity.
-{
- "time": "2025-05-13T17:30:51.036237518+01:00",
- "level": "debug",
- "msg": "4 go routines active\n",
- "source": "cmd/cmd.go:298"
-}
+{
+ "time": "2025-05-13T17:30:51.036237518+01:00",
+ "level": "debug",
+ "msg": "4 go routines active\n",
+ "source": "cmd/cmd.go:298"
+}
Completed data transfer logs will have extra size
information. Logs which are about a particular object will have
object and objectType fields also.
-{
- "time": "2025-05-13T17:38:05.540846352+01:00",
- "level": "info",
- "msg": "Copied (new) to: file2.txt",
- "size": 6,
- "object": "file.txt",
- "objectType": "*local.Object",
- "source": "operations/copy.go:368"
-}
+{
+ "time": "2025-05-13T17:38:05.540846352+01:00",
+ "level": "info",
+ "msg": "Copied (new) to: file2.txt",
+ "size": 6,
+ "object": "file.txt",
+ "objectType": "*local.Object",
+ "source": "operations/copy.go:368"
+}
Stats logs will contain a stats field which is the same
as returned from the rc call core/stats.
-{
- "time": "2025-05-13T17:38:05.540912847+01:00",
- "level": "info",
- "msg": "...text version of the stats...",
- "stats": {
- "bytes": 6,
- "checks": 0,
- "deletedDirs": 0,
- "deletes": 0,
- "elapsedTime": 0.000904825,
- ...truncated for clarity...
- "totalBytes": 6,
- "totalChecks": 0,
- "totalTransfers": 1,
- "transferTime": 0.000882794,
- "transfers": 1
- },
- "source": "accounting/stats.go:569"
-}
+{
+ "time": "2025-05-13T17:38:05.540912847+01:00",
+ "level": "info",
+ "msg": "...text version of the stats...",
+ "stats": {
+ "bytes": 6,
+ "checks": 0,
+ "deletedDirs": 0,
+ "deletes": 0,
+ "elapsedTime": 0.000904825,
+ ...truncated for clarity...
+ "totalBytes": 6,
+ "totalChecks": 0,
+ "totalTransfers": 1,
+ "transferTime": 0.000882794,
+ "transfers": 1
+ },
+ "source": "accounting/stats.go:569"
+}
--low-level-retries int
This controls the number of low level retries rclone does.
A low level retry is used to retry a failing operation - typically
@@ -16266,63 +16676,63 @@ known.
Metadata is the backend specific metadata as described
in the backend docs.
-{
- "SrcFs": "gdrive:",
- "SrcFsType": "drive",
- "DstFs": "newdrive:user",
- "DstFsType": "onedrive",
- "Remote": "test.txt",
- "Size": 6,
- "MimeType": "text/plain; charset=utf-8",
- "ModTime": "2022-10-11T17:53:10.286745272+01:00",
- "IsDir": false,
- "ID": "xyz",
- "Metadata": {
- "btime": "2022-10-11T16:53:11Z",
- "content-type": "text/plain; charset=utf-8",
- "mtime": "2022-10-11T17:53:10.286745272+01:00",
- "owner": "user1@domain1.com",
- "permissions": "...",
- "description": "my nice file",
- "starred": "false"
- }
-}
+{
+ "SrcFs": "gdrive:",
+ "SrcFsType": "drive",
+ "DstFs": "newdrive:user",
+ "DstFsType": "onedrive",
+ "Remote": "test.txt",
+ "Size": 6,
+ "MimeType": "text/plain; charset=utf-8",
+ "ModTime": "2022-10-11T17:53:10.286745272+01:00",
+ "IsDir": false,
+ "ID": "xyz",
+ "Metadata": {
+ "btime": "2022-10-11T16:53:11Z",
+ "content-type": "text/plain; charset=utf-8",
+ "mtime": "2022-10-11T17:53:10.286745272+01:00",
+ "owner": "user1@domain1.com",
+ "permissions": "...",
+ "description": "my nice file",
+ "starred": "false"
+ }
+}
The program should then modify the input as desired and send it to
STDOUT. The returned Metadata field will be used in its
entirety for the destination object. Any other fields will be ignored.
Note in this example we translate user names and permissions and add
something to the description:
-{
- "Metadata": {
- "btime": "2022-10-11T16:53:11Z",
- "content-type": "text/plain; charset=utf-8",
- "mtime": "2022-10-11T17:53:10.286745272+01:00",
- "owner": "user1@domain2.com",
- "permissions": "...",
- "description": "my nice file [migrated from domain1]",
- "starred": "false"
- }
-}
+{
+ "Metadata": {
+ "btime": "2022-10-11T16:53:11Z",
+ "content-type": "text/plain; charset=utf-8",
+ "mtime": "2022-10-11T17:53:10.286745272+01:00",
+ "owner": "user1@domain2.com",
+ "permissions": "...",
+ "description": "my nice file [migrated from domain1]",
+ "starred": "false"
+ }
+}
Metadata can be removed here too.
An example python program might look something like this to implement
the above transformations.
-import sys, json
-
-i = json.load(sys.stdin)
-metadata = i["Metadata"]
-# Add tag to description
-if "description" in metadata:
- metadata["description"] += " [migrated from domain1]"
-else:
- metadata["description"] = "[migrated from domain1]"
-# Modify owner
-if "owner" in metadata:
- metadata["owner"] = metadata["owner"].replace("domain1.com", "domain2.com")
-o = { "Metadata": metadata }
-json.dump(o, sys.stdout, indent="\t")
+import sys, json
+
+i = json.load(sys.stdin)
+metadata = i["Metadata"]
+# Add tag to description
+if "description" in metadata:
+ metadata["description"] += " [migrated from domain1]"
+else:
+ metadata["description"] = "[migrated from domain1]"
+# Modify owner
+if "owner" in metadata:
+ metadata["owner"] = metadata["owner"].replace("domain1.com", "domain2.com")
+o = { "Metadata": metadata }
+json.dump(o, sys.stdout, indent="\t")
You can find this example (slightly expanded) in the rclone source
code at bin/test_metadata_mapper.py.
@@ -16405,7 +16815,7 @@ at maximum --transfers *
--multi-thread-chunk-size *
--multi-thread-streams or specifically for the s3 backend
--transfers * --s3-chunk-size *
---s3-concurrency. However you can use the the --s3-concurrency. However you can use the --max-buffer-memory
flag to control the maximum memory used here.
NB that this only works with
@@ -17137,11 +17547,11 @@ password, in which case it will be used for decrypting the
configuration.
You can set this for a session from a script. For unix like systems
save this to a file called set-rclone-password:
-#!/bin/echo Source this file don't run it
-
-read -s RCLONE_CONFIG_PASS
-export RCLONE_CONFIG_PASS
+#!/bin/echo Source this file don't run it
+
+read -s RCLONE_CONFIG_PASS
+export RCLONE_CONFIG_PASS
Then source the file when you want to use it. From the shell you
would do source set-rclone-password. It will then ask you
for the password and set it in the environment variable.
@@ -17213,11 +17623,11 @@ a password store: pass init rclone.
Windows
Generate and store a password
-New-Object -TypeName PSCredential -ArgumentList "rclone", (ConvertTo-SecureString -String ([System.Web.Security.Membership]::GeneratePassword(40, 10)) -AsPlainText -Force) | Export-Clixml -Path "rclone-credential.xml"
+New-Object -TypeName PSCredential -ArgumentList "rclone", (ConvertTo-SecureString -String ([System.Web.Security.Membership]::GeneratePassword(40, 10)) -AsPlainText -Force) | Export-Clixml -Path "rclone-credential.xml"
Add the password retrieval instruction
-[Environment]::SetEnvironmentVariable("RCLONE_PASSWORD_COMMAND", "[System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR((Import-Clixml -Path "rclone-credential.xml").Password))")
+[Environment]::SetEnvironmentVariable("RCLONE_PASSWORD_COMMAND", "[System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR((Import-Clixml -Path "rclone-credential.xml").Password))")
Encrypt the config file
(all systems)
@@ -19006,11 +19416,11 @@ href="#option-blocks">the options blocks section for more info).
For example, if you wished to run a sync with the
--checksum parameter, you would pass this parameter in your
JSON blob.
-"_config":{"CheckSum": true}
+"_config":{"CheckSum": true}
Or pass it flat at the top level:
-
+
If using rclone rc this could be passed as
rclone rc sync/sync ... _config='{"CheckSum": true}'
Or simply flat:
@@ -19024,13 +19434,13 @@ which were set with command line flags or environment variables.
see data types for more info. Here is an
example setting the equivalent of --buffer-size in string
or integer format.
-"_config":{"BufferSize": "42M"}
-"_config":{"BufferSize": 44040192}
+"_config":{"BufferSize": "42M"}
+"_config":{"BufferSize": 44040192}
Or flat:
-"buffer_size": "42M"
-"buffer_size": 44040192
+"buffer_size": "42M"
+"buffer_size": 44040192
If you wish to check the _config assignment has worked
properly then calling options/local will show what the
value got set to.
@@ -19052,11 +19462,11 @@ href="#option-blocks">the options blocks section for more info).
For example, if you wished to run a sync with these flags
--max-size 1M --max-age 42s --include "a" --include "b"
you would pass this parameter in your JSON blob.
-"_filter":{"MaxSize":"1M", "IncludeRule":["a","b"], "MaxAge":"42s"}
+"_filter":{"MaxSize":"1M", "IncludeRule":["a","b"], "MaxAge":"42s"}
Or pass them flat at the top level:
-"max_size":"1M", "include":["a","b"], "max_age":"42s"
+"max_size":"1M", "include":["a","b"], "max_age":"42s"
If using rclone rc this could be passed as
rclone rc ... _filter='{"MaxSize":"1M", "IncludeRule":["a","b"], "MaxAge":"42s"}'
Or simply flat:
@@ -19070,12 +19480,12 @@ which were set with command line flags or environment variables.
see data types for more info. Here is an
example setting the equivalent of --buffer-size in string
or integer format.
-"_filter":{"MinSize": "42M"}
-"_filter":{"MinSize": 44040192}
+"_filter":{"MinSize": "42M"}
+"_filter":{"MinSize": 44040192}
Or flat:
-
+
If you wish to check the _filter assignment has worked
properly then calling options/local will show what the
value got set to.
@@ -19255,36 +19665,36 @@ allowed unless Required or Default is set)
An example of this might be the --log-level flag. Note
that the Name of the option becomes the command line flag
with _ replaced with -.
-{
- "Advanced": false,
- "Default": 5,
- "DefaultStr": "NOTICE",
- "Examples": [
- {
- "Help": "",
- "Value": "EMERGENCY"
- },
- {
- "Help": "",
- "Value": "ALERT"
- },
- ...
- ],
- "Exclusive": true,
- "FieldName": "LogLevel",
- "Groups": "Logging",
- "Help": "Log level DEBUG|INFO|NOTICE|ERROR",
- "Hide": 0,
- "IsPassword": false,
- "Name": "log_level",
- "NoPrefix": true,
- "Required": true,
- "Sensitive": false,
- "Type": "LogLevel",
- "Value": null,
- "ValueStr": "NOTICE"
-},
+{
+ "Advanced": false,
+ "Default": 5,
+ "DefaultStr": "NOTICE",
+ "Examples": [
+ {
+ "Help": "",
+ "Value": "EMERGENCY"
+ },
+ {
+ "Help": "",
+ "Value": "ALERT"
+ },
+ ...
+ ],
+ "Exclusive": true,
+ "FieldName": "LogLevel",
+ "Groups": "Logging",
+ "Help": "Log level DEBUG|INFO|NOTICE|ERROR",
+ "Hide": 0,
+ "IsPassword": false,
+ "Name": "log_level",
+ "NoPrefix": true,
+ "Required": true,
+ "Sensitive": false,
+ "Type": "LogLevel",
+ "Value": null,
+ "ValueStr": "NOTICE"
+},
Note that the Help may be multiple lines separated by
\n. The first line will always be a short sentence and this
is the sentence shown when running rclone help flags.
@@ -19310,25 +19720,25 @@ set. If the local backend is desired then type
should be set to local. If _root isn't
specified then it defaults to the root of the remote.
For example this JSON is equivalent to remote:/tmp
-{
- "_name": "remote",
- "_root": "/tmp"
-}
+{
+ "_name": "remote",
+ "_root": "/tmp"
+}
And this is equivalent to
:sftp,host='example.com':/tmp
-{
- "type": "sftp",
- "host": "example.com",
- "_root": "/tmp"
-}
+{
+ "type": "sftp",
+ "host": "example.com",
+ "_root": "/tmp"
+}
And this is equivalent to /tmp/dir
-{
- "type": "local",
- "_root": "/tmp/dir"
-}
+{
+ "type": "local",
+ "_root": "/tmp/dir"
+}
Supported commands
backend/command: Runs a backend command.
@@ -19928,12 +20338,12 @@ concurrently.
inputs - an list of inputs to the commands with an extra
_path parameter
-{
- "_path": "rc/path",
- "param1": "parameter for the path as documented",
- "param2": "parameter for the path as documented, etc",
-}
+{
+ "_path": "rc/path",
+ "param1": "parameter for the path as documented",
+ "param2": "parameter for the path as documented, etc",
+}
The inputs may use _async, _group,
_config and _filter as normal when using the
rc.
@@ -19943,37 +20353,37 @@ rc.
each in inputs.
For example:
-rclone rc job/batch --json '{
- "inputs": [
- {
- "_path": "rc/noop",
- "parameter": "OK"
- },
- {
- "_path": "rc/error",
- "parameter": "BAD"
- }
- ]
-}
-'
+rclone rc job/batch --json '{
+ "inputs": [
+ {
+ "_path": "rc/noop",
+ "parameter": "OK"
+ },
+ {
+ "_path": "rc/error",
+ "parameter": "BAD"
+ }
+ ]
+}
+'
Gives the result:
-{
- "results": [
- {
- "parameter": "OK"
- },
- {
- "error": "arbitrary error on input map[parameter:BAD]",
- "input": {
- "parameter": "BAD"
- },
- "path": "rc/error",
- "status": 500
- }
- ]
-}
+{
+ "results": [
+ {
+ "parameter": "OK"
+ },
+ {
+ "error": "arbitrary error on input map[parameter:BAD]",
+ "input": {
+ "parameter": "BAD"
+ },
+ "path": "rc/error",
+ "status": 500
+ }
+ ]
+}
job/list: Lists the IDs of the running jobs
Parameters: None.
Results:
@@ -20731,25 +21141,25 @@ Useful for testing error handling.
Eg
rclone rc serve/list
Returns
-{
- "list": [
- {
- "addr": "[::]:4321",
- "id": "nfs-ffc2a4e5",
- "params": {
- "fs": "remote:",
- "opt": {
- "ListenAddr": ":4321"
- },
- "type": "nfs",
- "vfsOpt": {
- "CacheMode": "full"
- }
- }
- }
- ]
-}
+{
+ "list": [
+ {
+ "addr": "[::]:4321",
+ "id": "nfs-ffc2a4e5",
+ "params": {
+ "fs": "remote:",
+ "opt": {
+ "ListenAddr": ":4321"
+ },
+ "type": "nfs",
+ "vfsOpt": {
+ "CacheMode": "full"
+ }
+ }
+ }
+ ]
+}
serve/start: Create a new server
Create a new server with the specified parameters.
This takes the following parameters:
@@ -20782,11 +21192,11 @@ above.
rclone rc serve/start --json '{"type":"nfs","fs":"remote:","addr":":1234","vfs_cache_mode":"full"}'
rclone rc serve/start type=webdav fs=remote: vfsOpt='{"CacheMode": 2}' proxyOpt='{"AuthProxy": "http://127.0.0.1:8080"}'
This will give the reply
-{
- "addr": "[::]:4321", // Address the server was started on
- "id": "nfs-ecfc6852" // Unique identifier for the server instance
-}
+{
+ "addr": "[::]:4321", // Address the server was started on
+ "id": "nfs-ecfc6852" // Unique identifier for the server instance
+}
Or an error if it failed to start.
Stop the server with serve/stop and list the running
servers with serve/list.
@@ -20815,14 +21225,14 @@ be passed to serve/start as the serveType parameter.
Eg
rclone rc serve/types
Returns
-{
- "types": [
- "http",
- "sftp",
- "nfs"
- ]
-}
+{
+ "types": [
+ "http",
+ "sftp",
+ "nfs"
+ ]
+}
sync/bisync: Perform bidirectional synchronization
between two paths.
@@ -21119,16 +21529,16 @@ formatted to be reasonably human-readable.
If an error occurs then there will be an HTTP error status (e.g. 500)
and the body of the response will contain a JSON encoded error object,
e.g.
-{
- "error": "Expecting string value for key \"remote\" (was float64)",
- "input": {
- "fs": "/tmp",
- "remote": 3
- },
- "status": 400,
- "path": "operations/rmdir"
-}
+{
+ "error": "Expecting string value for key \"remote\" (was float64)",
+ "input": {
+ "fs": "/tmp",
+ "remote": 3
+ },
+ "status": 400,
+ "path": "operations/rmdir"
+}
The keys in the error response are:
- error - error string
@@ -21144,21 +21554,21 @@ requested "Access-Control-Request-Headers" back.
parameters only
curl -X POST 'http://localhost:5572/rc/noop?potato=1&sausage=2'
Response
-{
- "potato": "1",
- "sausage": "2"
-}
+{
+ "potato": "1",
+ "sausage": "2"
+}
Here is what an error response looks like:
curl -X POST 'http://localhost:5572/rc/error?potato=1&sausage=2'
-{
- "error": "arbitrary error on input map[potato:1 sausage:2]",
- "input": {
- "potato": "1",
- "sausage": "2"
- }
-}
+{
+ "error": "arbitrary error on input map[potato:1 sausage:2]",
+ "input": {
+ "potato": "1",
+ "sausage": "2"
+ }
+}
Note that curl doesn't return errors to the shell unless you use the
-f option
$ curl -f -X POST 'http://localhost:5572/rc/error?potato=1&sausage=2'
@@ -21168,38 +21578,38 @@ $ echo $?
Using POST with a form
curl --data "potato=1" --data "sausage=2" http://localhost:5572/rc/noop
Response
-{
- "potato": "1",
- "sausage": "2"
-}
+{
+ "potato": "1",
+ "sausage": "2"
+}
Note that you can combine these with URL parameters too with the POST
parameters taking precedence.
curl --data "potato=1" --data "sausage=2" "http://localhost:5572/rc/noop?rutabaga=3&sausage=4"
Response
-{
- "potato": "1",
- "rutabaga": "3",
- "sausage": "4"
-}
+{
+ "potato": "1",
+ "rutabaga": "3",
+ "sausage": "4"
+}
Using POST with a JSON blob
curl -H "Content-Type: application/json" -X POST -d '{"potato":2,"sausage":1}' http://localhost:5572/rc/noop
response
-{
- "password": "xyz",
- "username": "xyz"
-}
+{
+ "password": "xyz",
+ "username": "xyz"
+}
This can be combined with URL parameters too if required. The JSON
blob takes precedence.
curl -H "Content-Type: application/json" -X POST -d '{"potato":2,"sausage":1}' 'http://localhost:5572/rc/noop?rutabaga=3&potato=4'
-{
- "potato": 2,
- "rutabaga": "3",
- "sausage": 1
-}
+{
+ "potato": 2,
+ "rutabaga": "3",
+ "sausage": 1
+}
Debugging rclone with pprof
If you use the --rc flag this will also enable the use
of the go profiling tools on the same port.
@@ -22295,7 +22705,7 @@ split into groups.
--tpslimit float Limit HTTP transactions per second to this
--tpslimit-burst int Max burst of transactions for --tpslimit (default 1)
--use-cookies Enable session cookiejar
- --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.0")
+ --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.1")
Flags helpful for increasing performance.
--buffer-size SizeSuffix In memory buffer size when reading files for each --transfer (default 16Mi)
@@ -23473,30 +23883,30 @@ to the Swarm cluster and save as
every node. By default this location is accessible only to the
root user so you will need appropriate privileges. The resulting config
will look like this:
-[gdrive]
-type = drive
-scope = drive
-drive_id = 1234567...
-root_folder_id = 0Abcd...
-token = {"access_token":...}
+[gdrive]
+type = drive
+scope = drive
+drive_id = 1234567...
+root_folder_id = 0Abcd...
+token = {"access_token":...}
Now create the file named example.yml with a swarm stack
description like this:
-version: '3'
-services:
- heimdall:
- image: linuxserver/heimdall:latest
- ports: [8080:80]
- volumes: [configdata:/config]
-volumes:
- configdata:
- driver: rclone
- driver_opts:
- remote: 'gdrive:heimdall'
- allow_other: 'true'
- vfs_cache_mode: full
- poll_interval: 0
+version: '3'
+services:
+ heimdall:
+ image: linuxserver/heimdall:latest
+ ports: [8080:80]
+ volumes: [configdata:/config]
+volumes:
+ configdata:
+ driver: rclone
+ driver_opts:
+ remote: 'gdrive:heimdall'
+ allow_other: 'true'
+ vfs_cache_mode: full
+ poll_interval: 0
and run the stack:
docker stack deploy example -c ./example.yml
After a few seconds docker will spread the parsed stack description
@@ -23620,16 +24030,16 @@ volume and have at least two elements, the self-explanatory
driver: rclone value and the driver_opts:
structure playing the same role as -o key=val CLI
flags:
-volumes:
- volume_name_1:
- driver: rclone
- driver_opts:
- remote: 'gdrive:'
- allow_other: 'true'
- vfs_cache_mode: full
- token: '{"type": "borrower", "expires": "2021-12-31"}'
- poll_interval: 0
+volumes:
+ volume_name_1:
+ driver: rclone
+ driver_opts:
+ remote: 'gdrive:'
+ allow_other: 'true'
+ vfs_cache_mode: full
+ token: '{"type": "borrower", "expires": "2021-12-31"}'
+ poll_interval: 0
Notice a few important details:
- YAML prefers
_ in option names instead of
@@ -23781,16 +24191,16 @@ docker plugin inspect rclone
to inform the docker daemon that a volume is (un-)available. As a
workaround you can setup a healthcheck to verify that the mount is
responding, for example:
-services:
- my_service:
- image: my_image
- healthcheck:
- test: ls /path/to/rclone/mount || exit 1
- interval: 1m
- timeout: 15s
- retries: 3
- start_period: 15s
+services:
+ my_service:
+ image: my_image
+ healthcheck:
+ test: ls /path/to/rclone/mount || exit 1
+ interval: 1m
+ timeout: 15s
+ retries: 3
+ start_period: 15s
Running Plugin under Systemd
In most cases you should prefer managed mode. Moreover, MacOS and
Windows do not support native Docker plugins. Please use managed mode on
@@ -25066,17 +25476,19 @@ href="https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-Te
href="https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt">TestBisyncLocalRemote/ext_paths
TestBisyncLocalRemote/extended_filenames
-4
+3
more
TestPcloud (pcloud)
TestBisyncRemoteRemote/rmdirs
+href="https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt">TestBisyncLocalRemote/resolve
+TestBisyncRemoteRemote/createemptysrcdirs
-Updated: 2026-07-31-010017
+Updated: 2026-09-04-010006
The following backends either have not been tested recently or have
@@ -25640,19 +26052,19 @@ versions I manually run the following command:
The Dropbox client then syncs the changes with Dropbox.
rclone.conf snippet
-[Dropbox]
-type = dropbox
-...
-
-[Dropcrypt]
-type = crypt
-remote = /path/to/DBoxroot/crypt # on the Linux server
-remote = C:\Users\MyLogin\Dropbox\crypt # on the Windows notebook
-filename_encryption = standard
-directory_name_encryption = true
-password = ...
-...
+[Dropbox]
+type = dropbox
+...
+
+[Dropcrypt]
+type = crypt
+remote = /path/to/DBoxroot/crypt # on the Linux server
+remote = C:\Users\MyLogin\Dropbox\crypt # on the Windows notebook
+filename_encryption = standard
+directory_name_encryption = true
+password = ...
+...
Testing
You should read this section only if you are developing for rclone.
You need to have rclone source code locally to work with bisync
@@ -26045,7 +26457,8 @@ changes
uncertainty, essentially marking the file as needing to be rechecked
next time.
A few basic terminal colors are now supported, controllable with
---color
+--color
(AUTO|NEVER|ALWAYS)
Initial listing snapshots of Path1 and Path2 are now generated
concurrently, using the same "march" infrastructure as
@@ -26090,7 +26503,8 @@ allows more control over which version of a file gets kept during a
--resync.
Bisync now supports --retries
-and --retries-sleep
+and --retries-sleep
(when --resilient is
set.)
@@ -27345,24 +27759,24 @@ An external ID is provided for additional security as required by the
role's trust policy
The target role's trust policy in the destination account must allow
the source account or user to assume it. Example trust policy:
-{
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Principal": {
- "AWS": "arn:aws:iam::SOURCE-ACCOUNT-ID:root"
- },
- "Action": "sts:AssumeRole",
- "Condition": {
- "StringEquals": {
- "sts:ExternalID": "unique-role-external-id-12345"
- }
- }
- }
- ]
-}
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Principal": {
+ "AWS": "arn:aws:iam::SOURCE-ACCOUNT-ID:root"
+ },
+ "Action": "sts:AssumeRole",
+ "Condition": {
+ "StringEquals": {
+ "sts:ExternalID": "unique-role-external-id-12345"
+ }
+ }
+ }
+ ]
+}
S3 Permissions
When using the sync subcommand of rclone
the following minimum permissions are required to be available on the
@@ -27379,34 +27793,34 @@ href="#s3-no-check-bucket">s3-no-check-bucket)
When using the lsd subcommand, the
ListAllMyBuckets permission is required.
Example policy:
-{
- "Version": "2012-10-17",
- "Statement": [
- {
- "Effect": "Allow",
- "Principal": {
- "AWS": "arn:aws:iam::USER_SID:user/USER_NAME"
- },
- "Action": [
- "s3:ListBucket",
- "s3:DeleteObject",
- "s3:GetObject",
- "s3:PutObject",
- "s3:PutObjectAcl"
- ],
- "Resource": [
- "arn:aws:s3:::BUCKET_NAME/*",
- "arn:aws:s3:::BUCKET_NAME"
- ]
- },
- {
- "Effect": "Allow",
- "Action": "s3:ListAllMyBuckets",
- "Resource": "arn:aws:s3:::*"
- }
- ]
-}
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Principal": {
+ "AWS": "arn:aws:iam::USER_SID:user/USER_NAME"
+ },
+ "Action": [
+ "s3:ListBucket",
+ "s3:DeleteObject",
+ "s3:GetObject",
+ "s3:PutObject",
+ "s3:PutObjectAcl"
+ ],
+ "Resource": [
+ "arn:aws:s3:::BUCKET_NAME/*",
+ "arn:aws:s3:::BUCKET_NAME"
+ ]
+ },
+ {
+ "Effect": "Allow",
+ "Action": "s3:ListAllMyBuckets",
+ "Resource": "arn:aws:s3:::*"
+ }
+ ]
+}
Notes on above:
- This is a policy that can be used when creating bucket. It assumes
@@ -29668,59 +30082,74 @@ tenant name. Do not select this directly
- Fortaleza, CE (BR), br-ne1
- Provider: Magalu
-- "s3.eu-amsterdam.megas4.com"
+
- "s3.eu-luxembourg-1.megas4.com"
-- Mega S4 Amsterdam
+- Mega S4 Luxembourg 1
- Provider: Mega
-- "s3.eu-luxembourg.megas4.com"
+
- "s3.eu-luxembourg-2.megas4.com"
-- Mega S4 Luxembourg
+- Mega S4 Luxembourg 2
- Provider: Mega
-- "s3.eu-paris.megas4.com"
+
- "s3.eu-amsterdam-1.megas4.com"
-- Mega S4 Paris
+- Mega S4 Amsterdam 1
- Provider: Mega
-- "s3.eu-barcelona.megas4.com"
+
- "s3.eu-amsterdam-2.megas4.com"
-- Mega S4 Barcelona
+- Mega S4 Amsterdam 2
- Provider: Mega
-- "s3.ca-montreal.megas4.com"
+
- "s3.eu-paris-1.megas4.com"
-- Mega S4 Montreal
+- Mega S4 Paris 1
- Provider: Mega
-- "s3.ca-vancouver.megas4.com"
+
- "s3.eu-paris-2.megas4.com"
-- Mega S4 Vancouver
+- Mega S4 Paris 2
- Provider: Mega
-- "s3.ap-tokyo.megas4.com"
+
- "s3.eu-barcelona-1.megas4.com"
-- Mega S4 Tokyo
+- Mega S4 Barcelona 1
- Provider: Mega
-- "s3.eu-central-1.s4.mega.io"
+
- "s3.eu-barcelona-2.megas4.com"
-- Mega S4 eu-central-1 (Amsterdam, legacy)
+- Mega S4 Barcelona 2
- Provider: Mega
-- "s3.eu-central-2.s4.mega.io"
+
- "s3.ca-montreal-1.megas4.com"
-- Mega S4 eu-central-2 (Bettembourg, legacy)
+- Mega S4 Montreal 1
- Provider: Mega
-- "s3.ca-central-1.s4.mega.io"
+
- "s3.ca-montreal-2.megas4.com"
-- Mega S4 ca-central-1 (Montreal, legacy)
+- Mega S4 Montreal 2
- Provider: Mega
-- "s3.ca-west-1.s4.mega.io"
+
- "s3.ca-vancouver-1.megas4.com"
-- Mega S4 ca-west-1 (Vancouver, legacy)
+- Mega S4 Vancouver 1
+- Provider: Mega
+
+- "s3.ca-vancouver-2.megas4.com"
+
+- Mega S4 Vancouver 2
+- Provider: Mega
+
+- "s3.ap-tokyo-1.megas4.com"
+
+- Mega S4 Tokyo 1
+- Provider: Mega
+
+- "s3.ap-tokyo-2.megas4.com"
+
+- Mega S4 Tokyo 2
- Provider: Mega
- "oos.eu-west-2.outscale.com"
@@ -32484,17 +32913,17 @@ rclone backend restore s3:bucket/path/to/directory -o priority=PRIORITY
It returns a list of status dictionaries with Remote and Status keys.
The Status will be OK if it was successful or an error message if
not.
-[
- {
- "Status": "OK",
- "Remote": "test.txt"
- },
- {
- "Status": "OK",
- "Remote": "test/file4.txt"
- }
-]
+[
+ {
+ "Status": "OK",
+ "Remote": "test.txt"
+ },
+ {
+ "Status": "OK",
+ "Remote": "test/file4.txt"
+ }
+]
Options:
- "description": The optional description for the job.
@@ -32516,36 +32945,36 @@ rclone backend restore-status s3:bucket/path/to/directory
rclone backend restore-status -o all s3:bucket/path/to/directory
This command does not obey the filters.
It returns a list of status dictionaries:
-[
- {
- "Remote": "file.txt",
- "VersionID": null,
- "RestoreStatus": {
- "IsRestoreInProgress": true,
- "RestoreExpiryDate": "2023-09-06T12:29:19+01:00"
- },
- "StorageClass": "GLACIER"
- },
- {
- "Remote": "test.pdf",
- "VersionID": null,
- "RestoreStatus": {
- "IsRestoreInProgress": false,
- "RestoreExpiryDate": "2023-09-06T12:29:19+01:00"
- },
- "StorageClass": "DEEP_ARCHIVE"
- },
- {
- "Remote": "test.gz",
- "VersionID": null,
- "RestoreStatus": {
- "IsRestoreInProgress": true,
- "RestoreExpiryDate": "null"
- },
- "StorageClass": "INTELLIGENT_TIERING"
- }
-]
+[
+ {
+ "Remote": "file.txt",
+ "VersionID": null,
+ "RestoreStatus": {
+ "IsRestoreInProgress": true,
+ "RestoreExpiryDate": "2023-09-06T12:29:19+01:00"
+ },
+ "StorageClass": "GLACIER"
+ },
+ {
+ "Remote": "test.pdf",
+ "VersionID": null,
+ "RestoreStatus": {
+ "IsRestoreInProgress": false,
+ "RestoreExpiryDate": "2023-09-06T12:29:19+01:00"
+ },
+ "StorageClass": "DEEP_ARCHIVE"
+ },
+ {
+ "Remote": "test.gz",
+ "VersionID": null,
+ "RestoreStatus": {
+ "IsRestoreInProgress": true,
+ "RestoreExpiryDate": "null"
+ },
+ "StorageClass": "INTELLIGENT_TIERING"
+ }
+]
Options:
- "all": If set then show all objects, not just ones with restore
@@ -32562,27 +32991,27 @@ format.
multipart uploads.
You can call it with no bucket in which case it lists all bucket,
with a bucket or with a bucket and path.
-{
- "rclone": [
- {
- "Initiated": "2020-06-26T14:20:36Z",
- "Initiator": {
- "DisplayName": "XXX",
- "ID": "arn:aws:iam::XXX:user/XXX"
- },
- "Key": "KEY",
- "Owner": {
- "DisplayName": null,
- "ID": "XXX"
- },
- "StorageClass": "STANDARD",
- "UploadId": "XXX"
- }
- ],
- "rclone-1000files": [],
- "rclone-dst": []
-}
+{
+ "rclone": [
+ {
+ "Initiated": "2020-06-26T14:20:36Z",
+ "Initiator": {
+ "DisplayName": "XXX",
+ "ID": "arn:aws:iam::XXX:user/XXX"
+ },
+ "Key": "KEY",
+ "Owner": {
+ "DisplayName": null,
+ "ID": "XXX"
+ },
+ "StorageClass": "STANDARD",
+ "UploadId": "XXX"
+ }
+ ],
+ "rclone-1000files": [],
+ "rclone-dst": []
+}
cleanup
Remove unfinished multipart uploads.
rclone backend cleanup remote: [options] [<arguments>+]
@@ -32638,10 +33067,10 @@ will default to those currently in use.
If you want to use rclone to access a public bucket, configure with a
blank access_key_id and secret_access_key.
Your config should end up looking like this:
-[anons3]
-type = s3
-provider = AWS
+[anons3]
+type = s3
+provider = AWS
Then use it as normal with the name of the public bucket, e.g.
rclone lsd anons3:1000genomes
You will be able to list and copy data but not upload it.
@@ -32655,15 +33084,15 @@ href="#configuration">configuration section above.
From rclone v1.69 Directory
Buckets are supported.
-You will need to set the directory_buckets = true config
-parameter or use --s3-directory-buckets.
+You will need to set the directory_bucket = true config
+parameter or use --s3-directory-bucket.
Note that rclone cannot yet:
- Create directory buckets
- List directory buckets
-See the --s3-directory-buckets
-flag for more info
+See the --s3-directory-bucket flag
+for more info
AWS Snowball Edge
AWS Snowball is a
hardware appliance used for transferring bulk data back to AWS. Its main
@@ -32677,14 +33106,14 @@ query parameter based authentication.
With rclone v1.59 or later setting upload_cutoff should
not be necessary.
eg.
-[snowball]
-type = s3
-provider = Other
-access_key_id = YOUR_ACCESS_KEY
-secret_access_key = YOUR_SECRET_KEY
-endpoint = http://[IP of Snowball]:8080
-upload_cutoff = 0
+[snowball]
+type = s3
+provider = Other
+access_key_id = YOUR_ACCESS_KEY
+secret_access_key = YOUR_SECRET_KEY
+endpoint = http://[IP of Snowball]:8080
+upload_cutoff = 0
Alibaba OSS
Here is an example of making an Alibaba Cloud (Aliyun)
@@ -32879,19 +33308,19 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[ArvanCloud]
-type = s3
-provider = ArvanCloud
-env_auth = false
-access_key_id = YOURACCESSKEY
-secret_access_key = YOURSECRETACCESSKEY
-region =
-endpoint = s3.arvanstorage.com
-location_constraint =
-acl =
-server_side_encryption =
-storage_class =
+[ArvanCloud]
+type = s3
+provider = ArvanCloud
+env_auth = false
+access_key_id = YOURACCESSKEY
+secret_access_key = YOURSECRETACCESSKEY
+region =
+endpoint = s3.arvanstorage.com
+location_constraint =
+acl =
+server_side_encryption =
+storage_class =
BizflyCloud
Bizfly Cloud Simple
Storage is an S3-compatible service with regions in Hanoi (HN) and
@@ -32902,19 +33331,19 @@ Ho Chi Minh City (HCM).
- HCM:
hcm.ss.bfcplatform.vn
A minimal configuration looks like this.
-[bizfly]
-type = s3
-provider = BizflyCloud
-env_auth = false
-access_key_id = YOUR_ACCESS_KEY
-secret_access_key = YOUR_SECRET_KEY
-region = HN
-endpoint = hn.ss.bfcplatform.vn
-location_constraint =
-acl =
-server_side_encryption =
-storage_class =
+[bizfly]
+type = s3
+provider = BizflyCloud
+env_auth = false
+access_key_id = YOUR_ACCESS_KEY
+secret_access_key = YOUR_SECRET_KEY
+region = HN
+endpoint = hn.ss.bfcplatform.vn
+location_constraint =
+acl =
+server_side_encryption =
+storage_class =
Switch region and endpoint to
HCM and hcm.ss.bfcplatform.vn for Ho Chi Minh
City.
@@ -32926,19 +33355,19 @@ interface.
To use rclone with Ceph, configure as above but leave the region
blank and set the endpoint. You should end up with something like this
in your config:
-[ceph]
-type = s3
-provider = Ceph
-env_auth = false
-access_key_id = XXX
-secret_access_key = YYY
-region =
-endpoint = https://ceph.endpoint.example.com
-location_constraint =
-acl =
-server_side_encryption =
-storage_class =
+[ceph]
+type = s3
+provider = Ceph
+env_auth = false
+access_key_id = XXX
+secret_access_key = YYY
+region =
+endpoint = https://ceph.endpoint.example.com
+location_constraint =
+acl =
+server_side_encryption =
+storage_class =
If you are using an older version of CEPH (e.g. 10.2.x Jewel) and a
version of rclone before v1.59 then you may need to supply the parameter
--s3-upload-cutoff 0 or put this in the config file as
@@ -32951,18 +33380,18 @@ tools you will get a JSON blob with the / escaped as
access key.
Eg the dump from Ceph looks something like this (irrelevant keys
removed).
-{
- "user_id": "xxx",
- "display_name": "xxxx",
- "keys": [
- {
- "user": "xxx",
- "access_key": "xxxxxx",
- "secret_key": "xxxxxx\/xxxx"
- }
- ],
-}
+{
+ "user_id": "xxx",
+ "display_name": "xxxx",
+ "keys": [
+ {
+ "user": "xxx",
+ "access_key": "xxxxxx",
+ "secret_key": "xxxxxx\/xxxx"
+ }
+ ],
+}
Because this is a json dump, it is encoding the / as
\/, so if you use the secret key as
xxxxxx/xxxx it will work fine.
@@ -33289,15 +33718,15 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave your config looking something like:
-[r2]
-type = s3
-provider = Cloudflare
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_ACCESS_KEY
-region = auto
-endpoint = https://ACCOUNT_ID.r2.cloudflarestorage.com
-acl = private
+[r2]
+type = s3
+provider = Cloudflare
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_ACCESS_KEY
+region = auto
+endpoint = https://ACCOUNT_ID.r2.cloudflarestorage.com
+acl = private
Now run rclone lsf r2: to see your buckets and
rclone lsf r2:bucket to look within a bucket.
For R2 tokens with the "Object Read & Write" permission, you may
@@ -33335,14 +33764,14 @@ region> eu-west-1 (or leave empty)
endpoint> s3.cubbit.eu (or s3.{tenant_name}.cubbit.eu)
acl>
The resulting configuration file should look like:
-[cubbit-ds3]
-type = s3
-provider = Cubbit
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_KEY
-region = eu-west-1
-endpoint = s3.cubbit.eu
+[cubbit-ds3]
+type = s3
+provider = Cubbit
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_KEY
+region = eu-west-1
+endpoint = s3.cubbit.eu
You can then start using Cubbit DS3 with rclone. For example, to
create a new bucket and copy files into it, you can run:
rclone mkdir cubbit-ds3:my-bucket
@@ -33377,19 +33806,19 @@ location_constraint>
acl>
storage_class>
The resulting configuration file should look like:
-[spaces]
-type = s3
-provider = DigitalOcean
-env_auth = false
-access_key_id = YOUR_ACCESS_KEY
-secret_access_key = YOUR_SECRET_KEY
-region =
-endpoint = nyc3.digitaloceanspaces.com
-location_constraint =
-acl =
-server_side_encryption =
-storage_class =
+[spaces]
+type = s3
+provider = DigitalOcean
+env_auth = false
+access_key_id = YOUR_ACCESS_KEY
+secret_access_key = YOUR_SECRET_KEY
+region =
+endpoint = nyc3.digitaloceanspaces.com
+location_constraint =
+acl =
+server_side_encryption =
+storage_class =
Once configured, you can create a new Space and begin copying files.
For example:
rclone mkdir spaces:my-new-space
@@ -33401,19 +33830,19 @@ object storage system based on CEPH.
To use rclone with Dreamhost, configure as above but leave the region
blank and set the endpoint. You should end up with something like this
in your config:
-[dreamobjects]
-type = s3
-provider = DreamHost
-env_auth = false
-access_key_id = your_access_key
-secret_access_key = your_secret_key
-region =
-endpoint = objects-us-west-1.dream.io
-location_constraint =
-acl = private
-server_side_encryption =
-storage_class =
+[dreamobjects]
+type = s3
+provider = DreamHost
+env_auth = false
+access_key_id = your_access_key
+secret_access_key = your_secret_key
+region =
+endpoint = objects-us-west-1.dream.io
+location_constraint =
+acl = private
+server_side_encryption =
+storage_class =
Exaba
Exaba is an on-premises,
S3-compatible storage for service providers and large enterprises. It is
@@ -33474,13 +33903,13 @@ y) Yes
n) No (default)
y/n> n
And the config generated will end up looking like this:
-[exaba]
-type = s3
-provider = Exaba
-access_key_id = XXX
-secret_access_key = XXX
-endpoint = http://127.0.0.1:9000/
+[exaba]
+type = s3
+provider = Exaba
+access_key_id = XXX
+secret_access_key = XXX
+endpoint = http://127.0.0.1:9000/
Fastly Object Storage
Fastly Object
Storage is an S3-compatible object storage service from Fastly. It
@@ -33546,14 +33975,14 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
The resulting configuration file should look like:
-[fastly]
-type = s3
-provider = Fastly
-access_key_id = YOUR_ACCESS_KEY
-secret_access_key = YOUR_SECRET_KEY
-region = us-east
-endpoint = us-east.object.fastlystorage.app
+[fastly]
+type = s3
+provider = Fastly
+access_key_id = YOUR_ACCESS_KEY
+secret_access_key = YOUR_SECRET_KEY
+region = us-east
+endpoint = us-east.object.fastlystorage.app
Google Cloud Storage
GoogleCloudStorage is
@@ -33564,13 +33993,13 @@ object storage service from Google Cloud Platform.
secret key. These can be retrieved by creating an HMAC
key.
-[gs]
-type = s3
-provider = GCS
-access_key_id = your_access_key
-secret_access_key = your_secret_key
-endpoint = https://storage.googleapis.com
+[gs]
+type = s3
+provider = GCS
+access_key_id = your_access_key
+secret_access_key = your_secret_key
+endpoint = https://storage.googleapis.com
Note that --s3-versions does not work
with GCS when it needs to do directory paging. Rclone will return the
error:
@@ -33702,15 +34131,15 @@ s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
This will leave the config file looking like this.
-[my-hetzner]
-type = s3
-provider = Hetzner
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_KEY
-region = hel1
-endpoint = hel1.your-objectstorage.com
-acl = private
+[my-hetzner]
+type = s3
+provider = Hetzner
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_KEY
+region = hel1
+endpoint = hel1.your-objectstorage.com
+acl = private
Hitachi Content Platform (HCP)
Here is an example of making a Hitachi
@@ -33797,13 +34226,13 @@ s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
This will leave the config file looking like this.
-[my-hcp]
-type = s3
-provider = HCP
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_KEY
-endpoint = https://hcp.example.com
+[my-hcp]
+type = s3
+provider = HCP
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_KEY
+endpoint = https://hcp.example.com
Known limitations
These limitations have been observed with HCP version 9.7.x.
Automatic directory objects
@@ -33831,15 +34260,15 @@ easy-to-use cloud storage that lets you store virtually any volume of
unstructured data in any format and access it from anywhere.
OBS provides an S3 interface, you can copy and modify the following
configuration and add it to your rclone configuration file.
-[obs]
-type = s3
-provider = HuaweiOBS
-access_key_id = your-access-key-id
-secret_access_key = your-secret-access-key
-region = af-south-1
-endpoint = obs.af-south-1.myhuaweicloud.com
-acl = private
+[obs]
+type = s3
+provider = HuaweiOBS
+access_key_id = your-access-key-id
+secret_access_key = your-secret-access-key
+region = af-south-1
+endpoint = obs.af-south-1.myhuaweicloud.com
+acl = private
Or you can also configure via the interactive command line:
No remotes found, make a new one\?
n) New remote
@@ -34068,15 +34497,15 @@ Choose a number from below, or type in your own value
acl> 1
Review the displayed configuration and accept to save the
"remote" then quit. The config file should look like this
-[xxx]
-type = s3
-Provider = IBMCOS
-access_key_id = xxx
-secret_access_key = yyy
-endpoint = s3-api.us-geo.objectstorage.softlayer.net
-location_constraint = us-standard
-acl = private
+[xxx]
+type = s3
+Provider = IBMCOS
+access_key_id = xxx
+secret_access_key = yyy
+endpoint = s3-api.us-geo.objectstorage.softlayer.net
+location_constraint = us-standard
+acl = private
Execute rclone commands
1) Create a bucket.
@@ -34377,15 +34806,15 @@ s) Set configuration password
q) Quit config
e/n/d/r/c/s/q>
This will leave the config file looking like this.
-[my-impossible-cloud]
-type = s3
-provider = ImpossibleCloud
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_KEY
-region = eu-central-2
-endpoint = eu-central-2.storage.impossibleapi.net
-acl = private
+[my-impossible-cloud]
+type = s3
+provider = ImpossibleCloud
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_KEY
+region = eu-central-2
+endpoint = eu-central-2.storage.impossibleapi.net
+acl = private
Intercolo Object Storage
Intercolo Object
Storage offers GDPR-compliant, transparently priced, S3-compatible
@@ -34496,14 +34925,14 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[intercolo]
-type = s3
-provider = Intercolo
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_KEY
-region = de-fra
-endpoint = de-fra.i3storage.com
+[intercolo]
+type = s3
+provider = Intercolo
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_KEY
+region = de-fra
+endpoint = de-fra.i3storage.com
IONOS Cloud
IONOS S3
Object Storage is a service offered by IONOS for storing and
@@ -34811,19 +35240,19 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[Liara]
-type = s3
-provider = Liara
-env_auth = false
-access_key_id = YOURACCESSKEY
-secret_access_key = YOURSECRETACCESSKEY
-region =
-endpoint = storage.iran.liara.space
-location_constraint =
-acl =
-server_side_encryption =
-storage_class =
+[Liara]
+type = s3
+provider = Liara
+env_auth = false
+access_key_id = YOURACCESSKEY
+secret_access_key = YOURSECRETACCESSKEY
+region =
+endpoint = storage.iran.liara.space
+location_constraint =
+acl =
+server_side_encryption =
+storage_class =
Linode
Here is an example of making a Linode Object
@@ -34963,13 +35392,13 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[linode]
-type = s3
-provider = Linode
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_ACCESS_KEY
-endpoint = eu-central-1.linodeobjects.com
+[linode]
+type = s3
+provider = Linode
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_ACCESS_KEY
+endpoint = eu-central-1.linodeobjects.com
Magalu
Here is an example of making a Magalu Object Storage
@@ -35071,13 +35500,13 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[magalu]
-type = s3
-provider = Magalu
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_ACCESS_KEY
-endpoint = br-ne1.magaluobjects.com
+[magalu]
+type = s3
+provider = Magalu
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_ACCESS_KEY
+endpoint = br-ne1.magaluobjects.com
MEGA S4
MEGA S4 Object Storage is
an S3 compatible object storage system. It has a single pricing tier
@@ -35170,13 +35599,13 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[megas4]
-type = s3
-provider = Mega
-access_key_id = XXX
-secret_access_key = XXX
-endpoint = s3.eu-central-1.s4.mega.io
+[megas4]
+type = s3
+provider = Mega
+access_key_id = XXX
+secret_access_key = XXX
+endpoint = s3.eu-central-1.s4.mega.io
Minio
Minio is an object storage server
built for cloud application developers and devops.
@@ -35215,17 +35644,17 @@ endpoint> http://192.168.1.106:9000
location_constraint>
server_side_encryption>
Which makes the config file look like this
-[minio]
-type = s3
-provider = Minio
-env_auth = false
-access_key_id = USWUXHGYZQYFYFFIT3RE
-secret_access_key = MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03
-region = us-east-1
-endpoint = http://192.168.1.106:9000
-location_constraint =
-server_side_encryption =
+[minio]
+type = s3
+provider = Minio
+env_auth = false
+access_key_id = USWUXHGYZQYFYFFIT3RE
+secret_access_key = MOJRH0mkL1IPauahWITSVvyDrQbEEIwljvmxdq03
+region = us-east-1
+endpoint = http://192.168.1.106:9000
+location_constraint =
+server_side_encryption =
So once set up, for example, to copy files into a bucket
rclone copy /path/to/files minio:bucket
Netease NOS
@@ -35243,16 +35672,16 @@ href="https://docs.outscale.com/en/userguide/OUTSCALE-Object-Storage-OOS.html">o
documentation.
Here is an example of an OOS configuration that you can paste into
your rclone configuration file:
-[outscale]
-type = s3
-provider = Outscale
-env_auth = false
-access_key_id = ABCDEFGHIJ0123456789
-secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-region = eu-west-2
-endpoint = oos.eu-west-2.outscale.com
-acl = private
+[outscale]
+type = s3
+provider = Outscale
+env_auth = false
+access_key_id = ABCDEFGHIJ0123456789
+secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+region = eu-west-2
+endpoint = oos.eu-west-2.outscale.com
+acl = private
You can also run rclone config to go through the
interactive setup process:
No remotes found, make a new one\?
@@ -35546,15 +35975,15 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
Your configuration file should now look like this:
-[ovhcloud-rbx]
-type = s3
-provider = OVHcloud
-access_key_id = my_access
-secret_access_key = my_secret
-region = rbx
-endpoint = s3.rbx.io.cloud.ovh.net
-acl = private
+[ovhcloud-rbx]
+type = s3
+provider = OVHcloud
+access_key_id = my_access
+secret_access_key = my_secret
+region = rbx
+endpoint = s3.rbx.io.cloud.ovh.net
+acl = private
Petabox
Here is an example of making a Petabox configuration. First run:
@@ -35695,14 +36124,14 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[My Petabox Storage]
-type = s3
-provider = Petabox
-access_key_id = YOUR_ACCESS_KEY_ID
-secret_access_key = YOUR_SECRET_ACCESS_KEY
-region = us-east-1
-endpoint = s3.petabox.io
+[My Petabox Storage]
+type = s3
+provider = Petabox
+access_key_id = YOUR_ACCESS_KEY_ID
+secret_access_key = YOUR_SECRET_ACCESS_KEY
+region = us-east-1
+endpoint = s3.petabox.io
Pure Storage FlashBlade
Pure
@@ -35797,13 +36226,13 @@ d) Delete this remote
y/e/d> y
This results in the following configuration being stored in
~/.config/rclone/rclone.conf:
-[flashblade]
-type = s3
-provider = FlashBlade
-access_key_id = ACCESS_KEY_ID
-secret_access_key = SECRET_ACCESS_KEY
-endpoint = https://s3.flashblade.example.com
+[flashblade]
+type = s3
+provider = FlashBlade
+access_key_id = ACCESS_KEY_ID
+secret_access_key = SECRET_ACCESS_KEY
+endpoint = https://s3.flashblade.example.com
Note: The FlashBlade endpoint should be the S3 data VIP. For
virtual-hosted style requests, ensure proper DNS configuration:
subdomains of the endpoint hostname should resolve to a FlashBlade data
@@ -36080,13 +36509,13 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[s5lu]
-type = s3
-provider = FileLu
-access_key_id = XXX
-secret_access_key = XXX
-endpoint = s5lu.com
+[s5lu]
+type = s3
+provider = FileLu
+access_key_id = XXX
+secret_access_key = XXX
+endpoint = s5lu.com
Rabata
Rabata is an S3-compatible secure
cloud storage service that offers flat, transparent pricing (no API
@@ -36223,16 +36652,16 @@ details are required for the next steps of configuration, when
rclone config asks for your access_key_id and
secret_access_key.
Your config should end up looking a bit like this:
-[RCS3-demo-config]
-type = s3
-provider = RackCorp
-env_auth = true
-access_key_id = YOURACCESSKEY
-secret_access_key = YOURSECRETACCESSKEY
-region = au-nsw
-endpoint = s3.rackcorp.com
-location_constraint = au-nsw
+[RCS3-demo-config]
+type = s3
+provider = RackCorp
+env_auth = true
+access_key_id = YOURACCESSKEY
+secret_access_key = YOURSECRETACCESSKEY
+region = au-nsw
+endpoint = s3.rackcorp.com
+location_constraint = au-nsw
Rclone Serve S3
Rclone can serve any remote over the S3 protocol. For details see the
rclone serve
@@ -36242,14 +36671,14 @@ server like this:
rclone serve s3 --auth-key ACCESS_KEY_ID,SECRET_ACCESS_KEY remote:path
This will be compatible with an rclone remote which is defined like
this:
-[serves3]
-type = s3
-provider = Rclone
-endpoint = http://127.0.0.1:8080/
-access_key_id = ACCESS_KEY_ID
-secret_access_key = SECRET_ACCESS_KEY
-use_multipart_uploads = false
+[serves3]
+type = s3
+provider = Rclone
+endpoint = http://127.0.0.1:8080/
+access_key_id = ACCESS_KEY_ID
+secret_access_key = SECRET_ACCESS_KEY
+use_multipart_uploads = false
Note that setting use_multipart_uploads = false is to
work around a bug which
@@ -36262,20 +36691,20 @@ Scaleway console or transferred through our API and CLI or using any
S3-compatible tool.
Scaleway provides an S3 interface which can be configured for use
with rclone like this:
-[scaleway]
-type = s3
-provider = Scaleway
-env_auth = false
-endpoint = s3.nl-ams.scw.cloud
-access_key_id = SCWXXXXXXXXXXXXXX
-secret_access_key = 1111111-2222-3333-44444-55555555555555
-region = nl-ams
-location_constraint = nl-ams
-acl = private
-upload_cutoff = 5M
-chunk_size = 5M
-copy_cutoff = 5M
+[scaleway]
+type = s3
+provider = Scaleway
+env_auth = false
+endpoint = s3.nl-ams.scw.cloud
+access_key_id = SCWXXXXXXXXXXXXXX
+secret_access_key = 1111111-2222-3333-44444-55555555555555
+region = nl-ams
+location_constraint = nl-ams
+acl = private
+upload_cutoff = 5M
+chunk_size = 5M
+copy_cutoff = 5M
Scaleway
Glacier is the low-cost S3 Glacier alternative from Scaleway and it
works the same way as on S3 by accepting the "GLACIER"
@@ -36390,13 +36819,13 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[scality]
-type = s3
-provider = Scality
-access_key_id = S3_ACCESS_KEY
-secret_access_key = S3_SECRET_KEY
-endpoint = https://s3.example.com
+[scality]
+type = s3
+provider = Scality
+access_key_id = S3_ACCESS_KEY
+secret_access_key = S3_SECRET_KEY
+endpoint = https://s3.example.com
Seagate Lyve Cloud
Seagate
@@ -36489,13 +36918,13 @@ Press Enter to leave empty.
[snip]
acl>
And the config file should end up looking like this:
-[remote]
-type = s3
-provider = LyveCloud
-access_key_id = XXX
-secret_access_key = YYY
-endpoint = s3.us-east-1.lyvecloud.seagate.com
+[remote]
+type = s3
+provider = LyveCloud
+access_key_id = XXX
+secret_access_key = YYY
+endpoint = s3.us-east-1.lyvecloud.seagate.com
SeaweedFS
SeaweedFS is a
distributed storage system for blobs, objects, files, and data lake,
@@ -36531,13 +36960,13 @@ such:
}
To use rclone with SeaweedFS, above configuration should end up with
something like this in your config:
-[seaweedfs_s3]
-type = s3
-provider = SeaweedFS
-access_key_id = any
-secret_access_key = any
-endpoint = localhost:8333
+[seaweedfs_s3]
+type = s3
+provider = SeaweedFS
+access_key_id = any
+secret_access_key = any
+endpoint = localhost:8333
So once set up, for example to copy files into a bucket
rclone copy /path/to/files seaweedfs_s3:foo
Selectel
@@ -36640,14 +37069,14 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
And your config should end up looking like this:
-[selectel]
-type = s3
-provider = Selectel
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_ACCESS_KEY
-region = ru-1
-endpoint = s3.ru-1.storage.selcloud.ru
+[selectel]
+type = s3
+provider = Selectel
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_ACCESS_KEY
+region = ru-1
+endpoint = s3.ru-1.storage.selcloud.ru
Servercore
Servercore
Object Storage is an S3 compatible object storage system that
@@ -36840,13 +37269,13 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
And your config should end up looking like this:
-[spectratest]
-type = s3
-provider = SpectraLogic
-access_key_id = ACCESS_KEY
-secret_access_key = SECRET_ACCESS_KEY
-endpoint = https://bp.example.com
+[spectratest]
+type = s3
+provider = SpectraLogic
+access_key_id = ACCESS_KEY
+secret_access_key = SECRET_ACCESS_KEY
+endpoint = https://bp.example.com
Storj
Storj is a decentralized cloud storage which can be used through its
native protocol or an S3 compatible gateway.
@@ -37395,19 +37824,19 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[wasabi]
-type = s3
-provider = Wasabi
-env_auth = false
-access_key_id = YOURACCESSKEY
-secret_access_key = YOURSECRETACCESSKEY
-region =
-endpoint = s3.wasabisys.com
-location_constraint =
-acl =
-server_side_encryption =
-storage_class =
+[wasabi]
+type = s3
+provider = Wasabi
+env_auth = false
+access_key_id = YOURACCESSKEY
+secret_access_key = YOURSECRETACCESSKEY
+region =
+endpoint = s3.wasabisys.com
+location_constraint =
+acl =
+server_side_encryption =
+storage_class =
Zadara Object Storage
Zadara Object Storage is a
fully-managed, enterprise-grade, S3-compatible storage solution that
@@ -37507,13 +37936,13 @@ e) Edit this remote
d) Delete this remote
y/e/d> y
This will leave the config file looking like this.
-[Zadara-Object-Storage]
-type = s3
-provider = Zadara
-access_key_id = S3_ACCESS_KEY
-secret_access_key = S3_SECRET_KEY
-endpoint = https://vsa-00000001-public-zadara-cloud-01.zadarazios.com
+[Zadara-Object-Storage]
+type = s3
+provider = Zadara
+access_key_id = S3_ACCESS_KEY
+secret_access_key = S3_SECRET_KEY
+endpoint = https://vsa-00000001-public-zadara-cloud-01.zadarazios.com
Zata Object Storage
Zata Object Storage provides a secure,
S3-compatible cloud storage solution designed for scalability and
@@ -37649,14 +38078,14 @@ e) Edit this remote
d) Delete this remote
y/e/d>
This will leave the config file looking like this.
-[my zata storage]
-type = s3
-provider = Zata
-access_key_id = xxx
-secret_access_key = xxx
-region = us-east-1
-endpoint = idr01.zata.ai
+[my zata storage]
+type = s3
+provider = Zata
+access_key_id = xxx
+secret_access_key = xxx
+region = us-east-1
+endpoint = idr01.zata.ai
Zero Services (ZERO-Z3)
Zero Services GmbH
offers ZERO-Z3, S3-compatible object storage hosted in the EU on its own
@@ -38693,15 +39122,15 @@ bucket.
To show the current lifecycle rules:
rclone backend lifecycle b2:bucket
This will dump something like this showing the lifecycle rules.
-[
- {
- "daysFromHidingToDeleting": 1,
- "daysFromUploadingToHiding": null,
- "daysFromStartingToCancelingUnfinishedLargeFiles": null,
- "fileNamePrefix": ""
- }
-]
+[
+ {
+ "daysFromHidingToDeleting": 1,
+ "daysFromUploadingToHiding": null,
+ "daysFromStartingToCancelingUnfinishedLargeFiles": null,
+ "fileNamePrefix": ""
+ }
+]
If there are no lifecycle rules (the default) then it will just
return [].
To reset the current lifecycle rules:
@@ -41620,6 +42049,14 @@ on the cloud storage system.
filenames with the same name will encrypt the same
filenames which start the same won't have a common prefix
+A version string of the form -vYYYY-MM-DD-HHMMSS-NNN on
+the end of a file name (as added by --b2-versions /
+--s3-versions) is left in plain text so that versioned
+files can be found. Directory names are encrypted in full. Rclone before
+v1.76 left such a suffix in plain text on directory names too, so a
+directory named like this created by an older rclone will appear in
+listings with a warning but can't be opened or removed until renamed on
+the underlying remote to the name given in the warning.
This uses a 32 byte key (256 bits) and a 16 byte (128 bits) IV both
of which are derived from the user password.
After encryption they are written out using a modified version of
@@ -41921,18 +42358,18 @@ the shared drives you have access to.
drive: you would run
rclone backend -o config drives drive:
This would produce something like this:
-[My Drive]
-type = alias
-remote = drive,team_drive=0ABCDEF-01234567890,root_folder_id=:
-
-[Test Drive]
-type = alias
-remote = drive,team_drive=0ABCDEFabcdefghijkl,root_folder_id=:
-
-[AllDrives]
-type = combine
-upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
+[My Drive]
+type = alias
+remote = drive,team_drive=0ABCDEF-01234567890,root_folder_id=:
+
+[Test Drive]
+type = alias
+remote = drive,team_drive=0ABCDEFabcdefghijkl,root_folder_id=:
+
+[AllDrives]
+type = combine
+upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
If you then add that config to your config file (find it with
rclone config file) then you can access all the shared
drives in one place with the AllDrives: remote.
@@ -47184,34 +47621,34 @@ account.
Usage example:
rclone backend [-o config] drives drive:
This will return a JSON list of objects like this:
-[
- {
- "id": "0ABCDEF-01234567890",
- "kind": "drive#teamDrive",
- "name": "My Drive"
- },
- {
- "id": "0ABCDEFabcdefghijkl",
- "kind": "drive#teamDrive",
- "name": "Test Drive"
- }
-]
+[
+ {
+ "id": "0ABCDEF-01234567890",
+ "kind": "drive#teamDrive",
+ "name": "My Drive"
+ },
+ {
+ "id": "0ABCDEFabcdefghijkl",
+ "kind": "drive#teamDrive",
+ "name": "Test Drive"
+ }
+]
With the -o config parameter it will output the list in a format
suitable for adding to a config file to make aliases for all the drives
found and a combined drive.
-[My Drive]
-type = alias
-remote = drive,team_drive=0ABCDEF-01234567890,root_folder_id=:
-
-[Test Drive]
-type = alias
-remote = drive,team_drive=0ABCDEFabcdefghijkl,root_folder_id=:
-
-[AllDrives]
-type = combine
-upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
+[My Drive]
+type = alias
+remote = drive,team_drive=0ABCDEF-01234567890,root_folder_id=:
+
+[Test Drive]
+type = alias
+remote = drive,team_drive=0ABCDEFabcdefghijkl,root_folder_id=:
+
+[AllDrives]
+type = combine
+upstreams = "My Drive=My Drive:" "Test Drive=Test Drive:"
Adding this to the rclone config file will cause those team drives to
be accessible with the aliases shown. Any illegal characters will be
substituted with "_" and duplicate names will have numbers suffixed. It
@@ -47230,11 +47667,11 @@ use via the API.
Use the --interactive/-i or --dry-run flag to see what would be
restored before restoring it.
Result:
-{
- "Untrashed": 17,
- "Errors": 0
-}
+{
+ "Untrashed": 17,
+ "Errors": 0
+}
copyid
Copy files by ID.
rclone backend copyid remote: [options] [<arguments>+]
@@ -47290,32 +47727,32 @@ escaped with characters. "'" becomes "'" and "" becomes "\", for
example to match a file named "foo ' .txt":
rclone backend query drive: "name = 'foo \' \\\.txt'"
The result is a JSON array of matches, for example:
-[
- {
- "createdTime": "2017-06-29T19:58:28.537Z",
- "id": "0AxBe_CDEF4zkGHI4d0FjYko2QkD",
- "md5Checksum": "68518d16be0c6fbfab918be61d658032",
- "mimeType": "text/plain",
- "modifiedTime": "2024-02-02T10:40:02.874Z",
- "name": "foo ' \\.txt",
- "parents": [
- "0BxAe_BCDE4zkFGZpcWJGek0xbzC"
- ],
- "resourceKey": "0-ABCDEFGHIXJQpIGqBJq3MC",
- "sha1Checksum": "8f284fa768bfb4e45d076a579ab3905ab6bfa893",
- "size": "311",
- "webViewLink": "https://drive.google.com/file/d/0AxBe_CDEF4zkGHI4d0FjYko2QkD/view?usp=drivesdk\u0026resourcekey=0-ABCDEFGHIXJQpIGqBJq3MC"
- }
-]
-```console
-
-### rescue
-
-Rescue or delete any orphaned files.
-
-```console
-rclone backend rescue remote: [options] [<arguments>+]
+[
+ {
+ "createdTime": "2017-06-29T19:58:28.537Z",
+ "id": "0AxBe_CDEF4zkGHI4d0FjYko2QkD",
+ "md5Checksum": "68518d16be0c6fbfab918be61d658032",
+ "mimeType": "text/plain",
+ "modifiedTime": "2024-02-02T10:40:02.874Z",
+ "name": "foo ' \\.txt",
+ "parents": [
+ "0BxAe_BCDE4zkFGZpcWJGek0xbzC"
+ ],
+ "resourceKey": "0-ABCDEFGHIXJQpIGqBJq3MC",
+ "sha1Checksum": "8f284fa768bfb4e45d076a579ab3905ab6bfa893",
+ "size": "311",
+ "webViewLink": "https://drive.google.com/file/d/0AxBe_CDEF4zkGHI4d0FjYko2QkD/view?usp=drivesdk\u0026resourcekey=0-ABCDEFGHIXJQpIGqBJq3MC"
+ }
+]
+```console
+
+### rescue
+
+Rescue or delete any orphaned files.
+
+```console
+rclone backend rescue remote: [options] [<arguments>+]
This command rescues or deletes any orphaned files or
directories.
Sometimes files can get orphaned in Google Drive. This means that
@@ -47441,7 +47878,7 @@ remove scopes" and select the three above and press update or go to the
press add to table then update.
You should now see the three scopes on your Data access page. Now
press save at the bottom!
-After adding scopes, click Audience Scroll down and click "+ Add
+
After adding scopes, click Audience. Scroll down and click "+ Add
users". Add yourself as a test user and press save.
Go to Overview on the left panel, click "Create OAuth client".
Choose an application type of "Desktop app" and click "Create". (the
@@ -48130,18 +48567,18 @@ y/e/d> y
config file, usually YOURHOME/.config/rclone/rclone.conf.
Open it in your favorite text editor, find section for the base remote
and create new section for hasher like in the following examples:
-[Hasher1]
-type = hasher
-remote = myRemote:path
-hashes = md5
-max_age = off
-
-[Hasher2]
-type = hasher
-remote = /local/path
-hashes = dropbox,sha1
-max_age = 24h
+[Hasher1]
+type = hasher
+remote = myRemote:path
+hashes = md5
+max_age = off
+
+[Hasher2]
+type = hasher
+remote = /local/path
+hashes = dropbox,sha1
+max_age = 24h
Hasher takes basically the following parameters:
remote is required
@@ -48369,8 +48806,8 @@ Huawei Drive which you need to do in your browser.
rclone config walks you through it.
Here is an example of how to make a remote called
remote. First run:
-
+
This will guide you through an interactive setup process:
No remotes found, make a new one?
n) New remote
@@ -48426,14 +48863,14 @@ it temporarily if you are running a host firewall, or use manual
mode.
You can then use it like this,
List directories in top level of your drive
-
+
List all the files in your drive
-
+
To copy a local directory to a drive directory called backup
-rclone copy /home/source remote:backup
+rclone copy /home/source remote:backup
Getting your own Client
ID and Secret
When you use rclone with Huawei Drive in its default configuration
@@ -49006,11 +49443,11 @@ docker build --rm -t rclone/test-hdfs .
NB it need few seconds to startup.
For this docker image the remote needs to be configured like
this:
-[remote]
-type = hdfs
-namenode = 127.0.0.1:8020
-username = root
+[remote]
+type = hdfs
+namenode = 127.0.0.1:8020
+username = root
You can stop this image with docker kill rclone-hdfs
(NB it does not use volumes, so all data uploaded will
be lost.)
@@ -49584,8 +50021,8 @@ resolved from the root of the domain.
If the path following the remote: ends with
/ it will be assumed to point to a directory. If the path
does not end with /, then a HEAD request is sent and the
-response used to decide if it it is treated as a file or a directory
-(run with -vv to see details). When -vv to see details). When --http-no-head is specified, a path without
ending / is always assumed to be a file. If rclone
incorrectly assumes the path is a file, the solution is to specify the
@@ -49717,6 +50154,11 @@ used.
'"Cookie","name=value"'.
You can set multiple headers, e.g.
'"Cookie","name=value","Authorization","xxx"'.
+The headers are only sent to the host in the configured URL. If the
+server redirects to another host (including a subdomain or a different
+port) the headers are not sent to it, or to any further hop in that
+redirect chain. When headers are set, a redirect from https to http is
+refused as it would send them in cleartext.
Properties:
- Config: headers
@@ -55322,18 +55764,18 @@ credentials
Search for driveAccessToken in the network
requests.
Extract the following information from the response:
-".driveUrl": "{tenant_url}/v2.0/drives/{drive_id}",
-".driveAccessToken": "access_token={access_token}"
+".driveUrl": "{tenant_url}/v2.0/drives/{drive_id}",
+".driveAccessToken": "access_token={access_token}"
Rclone configuration
Use the extracted values to configure your remote:
-type = onedrive
-token = {"access_token":"{access_token}","token_type":"Bearer","refresh_token":"","expiry":"2045-12-31T23:59:59Z"}
-drive_id = {drive_id}
-tenant_url = {tenant_url}
-drive_type = business
+type = onedrive
+token = {"access_token":"{access_token}","token_type":"Bearer","refresh_token":"","expiry":"2045-12-31T23:59:59Z"}
+drive_id = {drive_id}
+tenant_url = {tenant_url}
+drive_type = business
Since the exact expiry time cannot be determined from web traffic,
set the expiry to a future date. Note that the token will eventually
expire and you will need to repeat the process to obtain a new one.
@@ -56020,69 +56462,69 @@ href="https://learn.microsoft.com/en-us/onedrive/developer/rest-api/resources/pe
API, which differs slightly between OneDrive Personal and
Business.
Example for OneDrive Personal:
-[
- {
- "id": "1234567890ABC!123",
- "grantedTo": {
- "user": {
- "id": "ryan@contoso.com"
- },
- "application": {},
- "device": {}
- },
- "invitation": {
- "email": "ryan@contoso.com"
- },
- "link": {
- "webUrl": "https://1drv.ms/t/s!1234567890ABC"
- },
- "roles": [
- "read"
- ],
- "shareId": "s!1234567890ABC"
- }
-]
+[
+ {
+ "id": "1234567890ABC!123",
+ "grantedTo": {
+ "user": {
+ "id": "ryan@contoso.com"
+ },
+ "application": {},
+ "device": {}
+ },
+ "invitation": {
+ "email": "ryan@contoso.com"
+ },
+ "link": {
+ "webUrl": "https://1drv.ms/t/s!1234567890ABC"
+ },
+ "roles": [
+ "read"
+ ],
+ "shareId": "s!1234567890ABC"
+ }
+]
Example for OneDrive Business:
-[
- {
- "id": "48d31887-5fad-4d73-a9f5-3c356e68a038",
- "grantedToIdentities": [
- {
- "user": {
- "displayName": "ryan@contoso.com"
- },
- "application": {},
- "device": {}
- }
- ],
- "link": {
- "type": "view",
- "scope": "users",
- "webUrl": "https://contoso.sharepoint.com/:w:/t/design/a577ghg9hgh737613bmbjf839026561fmzhsr85ng9f3hjck2t5s"
- },
- "roles": [
- "read"
- ],
- "shareId": "u!LKj1lkdlals90j1nlkascl"
- },
- {
- "id": "5D33DD65C6932946",
- "grantedTo": {
- "user": {
- "displayName": "John Doe",
- "id": "efee1b77-fb3b-4f65-99d6-274c11914d12"
- },
- "application": {},
- "device": {}
- },
- "roles": [
- "owner"
- ],
- "shareId": "FWxc1lasfdbEAGM5fI7B67aB5ZMPDMmQ11U"
- }
-]
+[
+ {
+ "id": "48d31887-5fad-4d73-a9f5-3c356e68a038",
+ "grantedToIdentities": [
+ {
+ "user": {
+ "displayName": "ryan@contoso.com"
+ },
+ "application": {},
+ "device": {}
+ }
+ ],
+ "link": {
+ "type": "view",
+ "scope": "users",
+ "webUrl": "https://contoso.sharepoint.com/:w:/t/design/a577ghg9hgh737613bmbjf839026561fmzhsr85ng9f3hjck2t5s"
+ },
+ "roles": [
+ "read"
+ ],
+ "shareId": "u!LKj1lkdlals90j1nlkascl"
+ },
+ {
+ "id": "5D33DD65C6932946",
+ "grantedTo": {
+ "user": {
+ "displayName": "John Doe",
+ "id": "efee1b77-fb3b-4f65-99d6-274c11914d12"
+ },
+ "application": {},
+ "device": {}
+ },
+ "roles": [
+ "owner"
+ ],
+ "shareId": "FWxc1lasfdbEAGM5fI7B67aB5ZMPDMmQ11U"
+ }
+]
To write permissions, pass in a "permissions" metadata key using this
same format. The --metadata-mapper
@@ -56096,12 +56538,12 @@ for a user. Creating a Public Link is also supported, if
Link.Scope is set to "anonymous".
Example request to add a "read" permission with
--metadata-mapper:
-{
- "Metadata": {
- "permissions": "[{\"grantedToIdentities\":[{\"user\":{\"id\":\"ryan@contoso.com\"}}],\"roles\":[\"read\"]}]"
- }
-}
+{
+ "Metadata": {
+ "permissions": "[{\"grantedToIdentities\":[{\"user\":{\"id\":\"ryan@contoso.com\"}}],\"roles\":[\"read\"]}]"
+ }
+}
Note that adding a permission can fail if a conflicting permission
already exists for the file/folder.
To update an existing permission, include both the Permission ID and
@@ -56956,15 +57398,15 @@ No authentication
User Principal
Sample rclone config file for Authentication Provider User
Principal:
-[oos]
-type = oracleobjectstorage
-namespace = id<redacted>34
-compartment = ocid1.compartment.oc1..aa<redacted>ba
-region = us-ashburn-1
-provider = user_principal_auth
-config_file = /home/opc/.oci/config
-config_profile = Default
+[oos]
+type = oracleobjectstorage
+namespace = id<redacted>34
+compartment = ocid1.compartment.oc1..aa<redacted>ba
+region = us-ashburn-1
+provider = user_principal_auth
+config_file = /home/opc/.oci/config
+config_profile = Default
Advantages:
- One can use this method from any server within OCI or on-premises or
@@ -57021,13 +57463,13 @@ export OCI_RESOURCE_PRINCIPAL_PRIVATE_PEM=/usr/share/model-server/key.pem
export OCI_RESOURCE_PRINCIPAL_RPST=/usr/share/model-server/security_token
Sample rclone configuration file for Authentication Provider Resource
Principal:
-[oos]
-type = oracleobjectstorage
-namespace = id<redacted>34
-compartment = ocid1.compartment.oc1..aa<redacted>ba
-region = us-ashburn-1
-provider = resource_principal_auth
+[oos]
+type = oracleobjectstorage
+namespace = id<redacted>34
+compartment = ocid1.compartment.oc1..aa<redacted>ba
+region = us-ashburn-1
+provider = resource_principal_auth
Workload Identity
Workload Identity auth may be used when running Rclone from
Kubernetes pod on a Container Engine for Kubernetes (OKE) cluster. For
@@ -57041,13 +57483,13 @@ export OCI_RESOURCE_PRINCIPAL_REGION=us-ashburn-1
No authentication
Public buckets do not require any authentication mechanism to read
objects. Sample rclone configuration file for No authentication:
-[oos]
-type = oracleobjectstorage
-namespace = id<redacted>34
-compartment = ocid1.compartment.oc1..aa<redacted>ba
-region = us-ashburn-1
-provider = no_auth
+[oos]
+type = oracleobjectstorage
+namespace = id<redacted>34
+compartment = ocid1.compartment.oc1..aa<redacted>ba
+region = us-ashburn-1
+provider = no_auth
Modification times and
hashes
The modification time is stored as metadata on the object as
@@ -57621,26 +58063,26 @@ format.
multipart uploads.
You can call it with no bucket in which case it lists all bucket,
with a bucket or with a bucket and path.
-{
- "test-bucket": [
- {
- "namespace": "test-namespace",
- "bucket": "test-bucket",
- "object": "600m.bin",
- "uploadId": "51dd8114-52a4-b2f2-c42f-5291f05eb3c8",
- "timeCreated": "2022-07-29T06:21:16.595Z",
- "storageTier": "Standard"
- }
- ]
-}
-
-### cleanup
-
-Remove unfinished multipart uploads.
-
-```console
-rclone backend cleanup remote: [options] [<arguments>+]
+{
+ "test-bucket": [
+ {
+ "namespace": "test-namespace",
+ "bucket": "test-bucket",
+ "object": "600m.bin",
+ "uploadId": "51dd8114-52a4-b2f2-c42f-5291f05eb3c8",
+ "timeCreated": "2022-07-29T06:21:16.595Z",
+ "storageTier": "Standard"
+ }
+ ]
+}
+
+### cleanup
+
+Remove unfinished multipart uploads.
+
+```console
+rclone backend cleanup remote: [options] [<arguments>+]
This command removes unfinished multipart uploads of age greater than
max-age which defaults to 24 hours.
Note that you can use --interactive/-i or --dry-run with this command
@@ -57669,17 +58111,17 @@ rclone backend restore oos:bucket -o hours=HOURS
It returns a list of status dictionaries with Object Name and Status
keys. The Status will be "RESTORED"" if it was successful or an error
message if not.
-[
- {
- "Object": "test.txt"
- "Status": "RESTORED",
- },
- {
- "Object": "test/file4.txt"
- "Status": "RESTORED",
- }
-]
+[
+ {
+ "Object": "test.txt"
+ "Status": "RESTORED",
+ },
+ {
+ "Object": "test/file4.txt"
+ "Status": "RESTORED",
+ }
+]
Options:
- "hours": The number of hours for which this object will be restored.
@@ -58250,7 +58692,7 @@ locally on your computer or on local network (e.g. a NAS). Please follow
the Get started guide and
install one.
rclone interacts with Sia network by talking to the Sia daemon via HTTP API which is usually available on
+href="https://docs.sia.tech/">HTTP API which is usually available on
port 9980. By default you will run the daemon locally on the
same computer so it's safe to leave the API password blank (the API URL
will be http://127.0.0.1:9980 making external access
@@ -58562,27 +59004,27 @@ deleting any excess files in the container.
from an OpenStack credentials file
An OpenStack credentials file typically looks something something
like this (without the comments)
-export OS_AUTH_URL=https://a.provider.net/v2.0
-export OS_TENANT_ID=ffffffffffffffffffffffffffffffff
-export OS_TENANT_NAME="1234567890123456"
-export OS_USERNAME="123abc567xy"
-echo "Please enter your OpenStack Password: "
-read -sr OS_PASSWORD_INPUT
-export OS_PASSWORD=$OS_PASSWORD_INPUT
-export OS_REGION_NAME="SBG1"
-if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi
+export OS_AUTH_URL=https://a.provider.net/v2.0
+export OS_TENANT_ID=ffffffffffffffffffffffffffffffff
+export OS_TENANT_NAME="1234567890123456"
+export OS_USERNAME="123abc567xy"
+echo "Please enter your OpenStack Password: "
+read -sr OS_PASSWORD_INPUT
+export OS_PASSWORD=$OS_PASSWORD_INPUT
+export OS_REGION_NAME="SBG1"
+if [ -z "$OS_REGION_NAME" ]; then unset OS_REGION_NAME; fi
The config file needs to look something like this where
$OS_USERNAME represents the value of the
OS_USERNAME variable - 123abc567xy in the
example above.
-[remote]
-type = swift
-user = $OS_USERNAME
-key = $OS_PASSWORD
-auth = $OS_AUTH_URL
-tenant = $OS_TENANT_NAME
+[remote]
+type = swift
+user = $OS_USERNAME
+key = $OS_PASSWORD
+auth = $OS_AUTH_URL
+tenant = $OS_TENANT_NAME
Note that you may (or may not) need to set region too -
try without first.
Configuration from the
@@ -58611,11 +59053,11 @@ OpenStack installation.
config file
You can use rclone with swift without a config file, if desired, like
this:
-source openstack-credentials-file
-export RCLONE_CONFIG_MYREMOTE_TYPE=swift
-export RCLONE_CONFIG_MYREMOTE_ENV_AUTH=true
-rclone lsd myremote:
+source openstack-credentials-file
+export RCLONE_CONFIG_MYREMOTE_TYPE=swift
+export RCLONE_CONFIG_MYREMOTE_ENV_AUTH=true
+rclone lsd myremote:
--fast-list
This remote supports --fast-list which allows you to use
fewer transactions in exchange for more memory. See the
Request" error rather than a more sensible error when the authentication
fails for Swift.
So this most likely means your username / password is wrong. You can
-investigate further with the --dump-bodies flag.
+investigate further with the --dump bodies flag.
This may also be caused by specifying the region when you shouldn't
have (e.g. OVH).
If you want to debug or verify notifications, you can use the helper
command:
-rclone test changenotify remote:
+rclone test changenotify remote:
This will log incoming change notifications for the given remote.
@@ -59701,12 +60143,12 @@ in 'pikpak:dirpath'. You may want to pass '-o password=password' for a
password-protected files. Also, pass '-o delete-src-file' to delete
source files after decompression finished.
Result:
-{
- "Decompressed": 17,
- "SourceDeleted": 0,
- "Errors": 0
-}
+{
+ "Decompressed": 17,
+ "SourceDeleted": 0,
+ "Errors": 0
+}
Limitations
Hashes may be empty
@@ -61400,13 +61842,13 @@ provide the path to the user certificate public key file in
key, typically saved as /home/$USER/.ssh/id_rsa.pub.
Setting this path in pubkey_file will not work.
Example:
-[remote]
-type = sftp
-host = example.com
-user = sftpuser
-key_file = ~/id_rsa
-pubkey_file = ~/id_rsa-cert.pub
+[remote]
+type = sftp
+host = example.com
+user = sftpuser
+key_file = ~/id_rsa
+pubkey_file = ~/id_rsa-cert.pub
If you concatenate a cert with a private key then you can specify the
merged file in both places.
Note: the cert must come first in the file. e.g.
@@ -61431,13 +61873,13 @@ automatically with --sftp-pin-host-key.
Using the OpenSSH
known_hosts file
Using the OpenSSH known_hosts file looks like this:
-[remote]
-type = sftp
-host = example.com
-user = sftpuser
-pass =
-known_hosts_file = ~/.ssh/known_hosts
+[remote]
+type = sftp
+host = example.com
+user = sftpuser
+pass =
+known_hosts_file = ~/.ssh/known_hosts
Alternatively you can create your own known hosts file like this:
ssh-keyscan -t dsa,rsa,ecdsa,ed25519 example.com >> known_hosts
There are some limitations:
@@ -61489,13 +61931,13 @@ server operator.
--sftp-pin-host-key is ignored.
After the first successful connection the config will contain a new
line:
-[remote]
-type = sftp
-host = example.com
-user = sftpuser
-pass =
-host_keys = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...
+[remote]
+type = sftp
+host = example.com
+user = sftpuser
+pass =
+host_keys = ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...
The host_keys field is always validated against the
offered host key when non-empty, so you can also pin a known key by hand
without ever running with the flag. Each entry is the complete public
@@ -61600,12 +62042,11 @@ therefore always be correct, and support all features.
The shell type auto-detection logic, described above, means that by
default rclone will try to run a shell command the first time a new sftp
remote is accessed. If you configure a sftp remote without a config
-file, e.g. an on the fly
-remote, rclone will have nowhere to store the result, and it will re-run
-the command on every access. To avoid this you should explicitly set the
-shell_type option to the correct value, or to
-none if you want to prevent rclone from executing any
+file, e.g. an on
+the fly remote, rclone will have nowhere to store the result, and it
+will re-run the command on every access. To avoid this you should
+explicitly set the shell_type option to the correct value,
+or to none if you want to prevent rclone from executing any
remote shell commands.
It is also important to note that, since the shell type decides how
quoting and escaping of file paths used as command-line arguments are
@@ -62432,8 +62873,8 @@ paper.
href="https://github.com/pkg/sftp/issues/156">this issue is
fixed.
Note that since SFTP isn't HTTP based the following flags don't work
-with it: --dump-headers, --dump-bodies,
---dump-auth.
+with it: --dump headers, --dump bodies,
+--dump auth.
Note that --timeout and --contimeout are
both supported.
rsync.net
@@ -62472,54 +62913,54 @@ account and created drive respectively.
Now run
rclone config
Follow this interactive process:
-$ rclone config
-e) Edit existing remote
-n) New remote
-d) Delete remote
-r) Rename remote
-c) Copy remote
-s) Set configuration password
-q) Quit config
-e/n/d/r/c/s/q> n
-
-Enter name for new remote.
-name> Shade
-
-Option Storage.
-Type of storage to configure.
-Choose a number from below, or type in your own value.
-[OTHER OPTIONS]
-xx / Shade FS
- \ (shade)
-[OTHER OPTIONS]
-Storage> xx
-
-Option drive_id.
-The ID of your drive, see this in the drive settings. Individual rclone configs must be made per drive.
-Enter a value.
-drive_id> [YOUR_ID]
-
-Option api_key.
-An API key for your account.
-Enter a value.
-api_key> [YOUR_API_KEY]
-
-Edit advanced config?
-y) Yes
-n) No (default)
-y/n> n
-
-Configuration complete.
-Options:
-- type: shade
-- drive_id: [YOUR_ID]
-- api_key: [YOUR_API_KEY]
-Keep this "Shade" remote?
-y) Yes this is OK (default)
-e) Edit this remote
-d) Delete this remote
-y/e/d> y
+$ rclone config
+e) Edit existing remote
+n) New remote
+d) Delete remote
+r) Rename remote
+c) Copy remote
+s) Set configuration password
+q) Quit config
+e/n/d/r/c/s/q> n
+
+Enter name for new remote.
+name> Shade
+
+Option Storage.
+Type of storage to configure.
+Choose a number from below, or type in your own value.
+[OTHER OPTIONS]
+xx / Shade FS
+ \ (shade)
+[OTHER OPTIONS]
+Storage> xx
+
+Option drive_id.
+The ID of your drive, see this in the drive settings. Individual rclone configs must be made per drive.
+Enter a value.
+drive_id> [YOUR_ID]
+
+Option api_key.
+An API key for your account.
+Enter a value.
+api_key> [YOUR_API_KEY]
+
+Edit advanced config?
+y) Yes
+n) No (default)
+y/n> n
+
+Configuration complete.
+Options:
+- type: shade
+- drive_id: [YOUR_ID]
+- api_key: [YOUR_API_KEY]
+Keep this "Shade" remote?
+y) Yes this is OK (default)
+e) Edit this remote
+d) Delete this remote
+y/e/d> y
Modification times and
hashes
Shade does not support hashes and writing mod times.
@@ -63040,7 +63481,7 @@ gateway
Here is an example of how to make a remote called
@@ -64110,13 +64551,13 @@ upstream.
Writeback
The tag :writeback on an upstream remote can be used to
make a simple cache system like this:
-[union]
-type = union
-action_policy = all
-create_policy = all
-search_policy = ff
-upstreams = /local:writeback remote:dir
+[union]
+type = union
+action_policy = all
+create_policy = all
+search_policy = ff
+upstreams = /local:writeback remote:dir
When files are opened for read, if the file is in
remote:dir but not /local then rclone will
copy the file entirely into /local before returning a
@@ -64304,7 +64745,9 @@ times.
Fastmail Files, ownCloud or Nextcloud rclone will support SHA1 and MD5
hashes. Depending on the exact version of ownCloud or Nextcloud hashes
may appear on all objects, or only on objects which had a hash uploaded
-with them.
+with them. With Nextcloud, rclone asks the server to calculate the SHA1
+of uploads which had no hash to send, such as streamed uploads, and
+after setting the modification time, which discards the stored hash.
Standard options
@@ -64579,13 +65022,13 @@ and use your normal account email and password for user and
pass. If you have 2FA enabled, you have to generate an app
password. Set the vendor to sharepoint.
Your config file should look like this:
-[sharepoint]
-type = webdav
-url = https://[YOUR-DOMAIN]-my.sharepoint.com/personal/[YOUR-EMAIL]/Documents
-vendor = sharepoint
-user = YourEmailAddress
-pass = encryptedpassword
+[sharepoint]
+type = webdav
+url = https://[YOUR-DOMAIN]-my.sharepoint.com/personal/[YOUR-EMAIL]/Documents
+vendor = sharepoint
+user = YourEmailAddress
+pass = encryptedpassword
Sharepoint with NTLM
Authentication
Use this option in case your (hosted) Sharepoint is not tied to
@@ -64603,13 +65046,13 @@ class="uri">https://example.sharepoint.com/sites/12345/Documents
NTLM uses domain and user name combination for authentication, set
user to DOMAIN\username.
Your config file should look like this:
-[sharepoint]
-type = webdav
-url = https://[YOUR-DOMAIN]/some-path-to/Documents
-vendor = sharepoint-ntlm
-user = DOMAIN\user
-pass = encryptedpassword
+[sharepoint]
+type = webdav
+url = https://[YOUR-DOMAIN]/some-path-to/Documents
+vendor = sharepoint-ntlm
+user = DOMAIN\user
+pass = encryptedpassword
Required Flags for
SharePoint
As SharePoint does some special things with uploaded documents, you
@@ -64639,14 +65082,14 @@ access tokens.
username or password, instead enter your Macaroon as the
bearer_token.
The config will end up looking something like this.
-[dcache]
-type = webdav
-url = https://dcache...
-vendor = other
-user =
-pass =
-bearer_token = your-macaroon
+[dcache]
+type = webdav
+url = https://dcache...
+vendor = other
+user =
+pass =
+bearer_token = your-macaroon
There is a script
that obtains a Macaroon from a dCache WebDAV endpoint, and creates an
@@ -64686,12 +65129,12 @@ the advanced config and enter the command to get a bearer token (e.g.,
The following example config shows a WebDAV endpoint that uses
oidc-agent to supply an access token from the XDC OIDC
Provider.
-[dcache]
-type = webdav
-url = https://dcache.example.org/
-vendor = other
-bearer_token_command = oidc-token XDC
+[dcache]
+type = webdav
+url = https://dcache.example.org/
+vendor = other
+bearer_token_command = oidc-token XDC
Yandex Disk
Yandex Disk is a cloud storage
solution created by Yandex.
@@ -65628,15 +66071,15 @@ drivers like EncFS. To disable
UNC conversion globally, add this to your .rclone.conf
file:
-
+
If you want to selectively disable UNC, you can add it to a separate
entry like this:
-[nounc]
-type = local
-nounc = true
+[nounc]
+type = local
+nounc = true
And use rclone like this:
rclone copy c:\src nounc:z:\dst
This will use UNC paths on c:\src but not on
@@ -66229,6 +66672,316 @@ the output.
Changelog
+v1.75.1 - 2026-09-04
+See
+commits
+
+- Security
+
+- archive
+
+- Fix zip slip path traversal in untrusted zip files
+GHSA-66hp-wgxq-6f5q CVE-PENDING (Nick Craig-Wood)
+- Hide any archive entry which escapes the directory being listed
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+- Reject unsafe entry names when mounting squashfs images
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+- Fix zip subdirectory root matching sibling directories
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+- Fix zip entry named "." hiding every other file GHSA-66hp-wgxq-6f5q
+(Nick Craig-Wood)
+- Fix "directory not found" for archive paths containing "./" or "//"
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+
+- build
+
+- Fix multiple CVEs by upgrading to go1.26.6 (Nick Craig-Wood)
+
+- CVE-2026-56860: net/url: quadratic complexity in resolvePath
+- CVE-2026-56858: html/template: JavaScript regexp context
+tracking
+- CVE-2026-56862: crypto/tls: limit handshake messages accepted
+post-handshake
+- CVE-2026-56853: net/http: apply ReadHeaderTimeout to unencrypted
+HTTP/2 check
+- CVE-2026-56859: encoding/xml: recursion depth guard during
+decode
+- CVE-2026-33818: encoding/asn1: enforce maximum recursion depth
+- CVE-2026-46600: net: panic parsing an invalid SVCB or HTTPS RR in
+dnsmessage
+- CVE-2026-39821: net/http: reject ASCII-only Punycode-encoded labels
+in idna
+
+- Update golang.org/x/crypto to v0.56.0 to fix multiple CVEs (Nick
+Craig-Wood)
+
+- CVE-2026-56854: ssh: source-address critical option not enforced for
+non-public-key auth callbacks
+- CVE-2026-78662: ssh: a malicious peer could flood an undecided
+channel's incoming requests, deadlocking the connection
+- CVE-2026-56855: ssh: a malicious peer could send crafted messages on
+an established channel, deadlocking the connection
+
+- Update golang.org/x/image to v0.45.0 to fix CVE-2026-46603 (Nick
+Craig-Wood)
+
+- CVE-2026-46603: excessive memory allocation during VP8L
+decoding
+
+
+- fs: Confine directory listing entries that escape the root
+GHSA-3vxh-3pcx-9m8q GHSA-38xv-hf3p-h7mq CVE-PENDING (Nick
+Craig-Wood)
+- fshttp: Don't send
--header values to other hosts on
+redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+- http: Don't leak configured headers to other hosts or over plaintext
+on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+- lib/rest: Check HTTPS downgrades against the original request on
+redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+- local
+
+- Fix dir metadata escaping the root through a planted symlink
+GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+- Fix btime escaping the root via a planted symlink
+GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+- Fix panic on Range request past the end of a symlink
+GHSA-p6m2-r3w9-mpxw CVE-PENDING (Nick Craig-Wood)
+
+- serve docker
+
+- Reject volume names that escape the base directory
+GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+- Reject volume names resolving to the base directory itself
+GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+- Re-derive volume mountpoint from name when restoring state
+GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+
+- serve ftp: Fix auth-proxy sessions sharing credentials by username
+GHSA-c476-6w5q-jw77 CVE-PENDING (Nick Craig-Wood)
+- serve s3
+
+- Fix memory exhaustion from client-declared multipart part size
+GHSA-2p48-j3qc-rx9f CVE-PENDING (Nick Craig-Wood)
+- Reject bogus multipart part sizes in the reorder buffer
+GHSA-2p48-j3qc-rx9f (Nick Craig-Wood)
+- Fix auth proxy accepting any request signed with an empty secret
+GHSA-xwwr-4h3p-r22c CVE-PENDING (Nick Craig-Wood)
+
+- NB the auth proxy protocol for
+
serve s3 has changed - the proxy program is now given the
+access key ID as user and must return the secret as
+_secret_access_key
+
+- Fix each server accepting the
--auth-key credentials of
+all the others (Nick Craig-Wood)
+- Fix misleading anonymous access log when using an auth proxy via rc
+GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+
+- serve sftp: Fix auth proxy configured via rc being silently ignored
+GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+
+- Bug Fixes
+
+- accounting
+
+- Fix memory leak on long-running rcd (nielash)
+- Fix memory leak from stats groups on long-running rcd (nielash)
+- Fix bwlimit burst overflow (Rayan Salhab)
+
+- bisync
+
+- Fix memory leak when running via the rc (nielash)
+- Fix failed transfers of empty files being recorded as synced (Nick
+Craig-Wood)
+
+- build: Make go1.26 the minimum required version as needed by
+golang.org/x/crypto v0.56.0 (Nick Craig-Wood)
+- config: Redact env var config values in logs (Pastalikek65)
+- doc fixes (Anton Karpov, CAOShurong, Dean Chen, Nick Craig-Wood,
+Recoordinate, Rodrigo Rodrigues, Shantanav Mukherjee, shaurya)
+- lib/batcher: Prevent commits racing shutdown (Loi Nguyen)
+- lib/transform: Fix panic in
truncate_keep_extension
+(VXNCXNX)
+- multipart: Fix chunked uploads storing truncated objects when the
+source ends early (Nick Craig-Wood)
+- operations: Fix silent truncation of streaming uploads whose source
+ends early (Nick Craig-Wood)
+- serve
+
+- Fix VFS instance leaks on server startup failures and shutdown
+(Hakan İSMAİL)
+- Pass the client IP address to the auth proxy (am-at-enrollvb)
+
+- serve http: Prevent scrolling to the top on page reload (Sune
+Mølgaard)
+- serve nfs: Fix EIO when creating symlinks with
+
--vfs-links (SillyZir)
+- serve s3
+
+- Fix failed uploads deleting or corrupting the object at the key
+(Nick Craig-Wood)
+- Fix crash when a multipart upload is aborted while a part is
+uploading (Nick Craig-Wood)
+- Fix modtime not being set when only mtime metadata is supplied on
+PUT (Nick Craig-Wood)
+- Upload all multipart uploads via the VFS so they obey
+
--bwlimit and show in stats (Nick Craig-Wood)
+- Reserve the
.rclone_temp_ prefix for temporary objects
+(Nick Craig-Wood)
+- Clean up abandoned multipart uploads after
+
--multipart-expiry (Nick Craig-Wood)
+
+- vfscache
+
+- Fix reader deadlock when the item size drops below the read offset
+(Dave)
+- Fix log message growing without bound on repeated write errors
+(Vijay Misal)
+
+- walk: Stop directory traversal when the context is cancelled (Rahman
+Yilmaz)
+
+- VFS
+
+- Synchronize poll updates with shutdown (Loi Nguyen)
+- Make poll shutdown lifecycle deterministic (Loi Nguyen)
+
+- Crypt
+
+- Fix hash mismatches with
no_data_encryption on backends
+which check upload hashes (Nick Craig-Wood)
+- Fix directory names which look like versioned file names
+(TowyTowy)
+- Warn about directories with legacy version-like encrypted names
+(Nick Craig-Wood)
+
+- Azure Blob
+
+- Fix Entra ID server-side copy source authentication (Edward
+Klesel)
+- Fix spurious vfs cache corruption errors during chunked reads (Nick
+Craig-Wood)
+
+- Azurefiles
+
+- Fix zero padded files being created when the source ends early (Nick
+Craig-Wood)
+
+- Box
+
+- Fix truncated files being uploaded successfully when the source ends
+early (Rohit Behera)
+
+- Compress
+
+- Fix corrupted objects being created when the source ends early (Nick
+Craig-Wood)
+
+- Drive
+
+- Don't list trashed files when removing a directory into the trash
+(alliasgher)
+
+- Dropbox
+
+- Preserve Paper export paths on lookup (Loi Nguyen)
+- Fix context cancellation (e.g.
--max-duration limit)
+not stopping in-flight requests (debaditya)
+- Fix chunked uploads of truncated files never finishing (Nick
+Craig-Wood)
+- Don't retry chunked upload requests when the upload has been
+cancelled (Nick Craig-Wood)
+- Decode received shared-file names (Sanjay Kanth A)
+- Fix ChangeNotify when the root's case differs from Dropbox's (Loi
+Nguyen)
+
+- Filelu
+
+- Fix truncated files being uploaded successfully when the source ends
+early (Nick Craig-Wood)
+- Fix duplicate root path during multipart folder creation
+(kingston125)
+
+- Huaweidrive
+
+- Fix truncated files being uploaded successfully when the source ends
+early (Rohit Behera)
+
+- Iclouddrive
+
+- Fix uploads into an app container failing with 412 (Christian De
+Santis)
+
+- Internetarchive
+
+- Fix corrupted files being created when the source ends early (Nick
+Craig-Wood)
+
+- Internxt
+
+- Persist rotated token returned by the user info call
+(0rangeSeaW0lf)
+
+- Onedrive
+
+- Fix 403 Forbidden for configuration personal onedrive (machsix)
+- Fall back to manual drive ID entry when drive listing fails
+(SillyZir)
+- Don't retry multipart upload chunk on 404 (upload session not found)
+(water)
+
+- Overview
+
+- Fix "internal error: no overview data found" on 32 bit architectures
+(Nick Craig-Wood)
+
+- Pikpak
+
+- Fix truncated files being created when the source ends early (Nick
+Craig-Wood)
+- Fix truncated single part uploads reported as ok when source ends
+early (Nick Craig-Wood)
+
+- Protondrive
+
+- Fix files uploaded with v1.75.0 not being readable in the Proton
+apps (Nick Craig-Wood)
+- Fix corrupted uploads after a retried upload error (Nick
+Craig-Wood)
+
+- Quatrix
+
+- Fix chunk upload retries and fix memory leak (Nick Craig-Wood)
+
+- S3
+
+- Update Mega endpoints (Nick Craig-Wood)
+- Treat UploadPart success without ETag as retryable error
+(CAOShurong)
+- Fix server side copy failing with
--s3-no-head-object
+(Anatoly Tarnavsky)
+
+- Sia
+
+- Fix corrupted files being created when the source ends early (Nick
+Craig-Wood)
+
+- Smb
+
+- Reuse the upload connection for SetModTime (alliasgher)
+
+- WebDAV
+
+- Fix SetModTime failing and hashes missing on Nextcloud (Nick
+Craig-Wood)
+
+- Yandex
+
+- Fix truncated files being uploaded successfully when the source ends
+early (Rohit Behera)
+
+
v1.75.0 - 2026-07-31
See
@@ -66244,16 +66997,16 @@ ARTESCA)
- Security
- archive: Don't crash on malformed squashfs images
-GHSA-6jcg-q3wp-x2f4 CVE-PENDING (Nick Craig-Wood)
+GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- ftp: Fix ftp command injection when encoding doesn't include CRLF
-GHSA-8c48-q9wj-3w37 CVE-PENDING (Nick Craig-Wood)
+GHSA-8c48-q9wj-3w37 CVE-2026-71311 (Nick Craig-Wood)
- lib/http: Use TLS on all
--addr listeners when
--cert and --key are set GHSA-mfvx-7rcj-9m5g
(Nick Craig-Wood)
- lib/proxy: Fix unbounded HTTP CONNECT headers causing OOM
-GHSA-xhf4-832v-7xcr CVE-PENDING (Nick Craig-Wood)
+GHSA-xhf4-832v-7xcr CVE-2026-71310 (Nick Craig-Wood)
- local: Stop source file names escaping the destination directory
-GHSA-7p4m-qxvv-g567 CVE-PENDING (Nick Craig-Wood)
+GHSA-7p4m-qxvv-g567 CVE-2026-71313 (Nick Craig-Wood)
- rc
- Don't expose pprof debug handlers on an unauthenticated server
@@ -66273,11 +67026,11 @@ GHSA-8mxv-9xhp-86h4 (Nick Craig-Wood)
- serve ftp: Use constant time comparison for password check
GHSA-mfvx-7rcj-9m5g (Nick Craig-Wood)
- serve restic: Fix path traversal above the served directory
-GHSA-45pq-889g-fcgh CVE-PENDING (Nick Craig-Wood)
+GHSA-45pq-889g-fcgh CVE-2026-71309 (Nick Craig-Wood)
- serve sftp: Don't crash the whole server on a bad request
GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- sftp: Fix command injection via crafted filenames on PowerShell
-remotes GHSA-2m8m-jhrm-w6j2 CVE-PENDING (Nick Craig-Wood)
+remotes GHSA-2m8m-jhrm-w6j2 CVE-2026-71312 (Nick Craig-Wood)
- vfs: Don't crash the process if a backend panics on a background
goroutine GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- webdav
@@ -79485,10 +80238,10 @@ formats
some.domain.com no such host
This happens when rclone cannot resolve a domain. Please check that
your DNS setup is generally working, e.g.
-# both should print a long list of possible IP addresses
-dig www.googleapis.com # resolve using your default DNS
-dig www.googleapis.com @8.8.8.8 # resolve with Google's DNS server
+# both should print a long list of possible IP addresses
+dig www.googleapis.com # resolve using your default DNS
+dig www.googleapis.com @8.8.8.8 # resolve with Google's DNS server
If you are using systemd-resolved (default on Arch
Linux), ensure it is at version 233 or higher. Previous releases contain
a bug which causes not all domains to be resolved properly.
@@ -79511,8 +80264,8 @@ yyyy/mm/dd hh:mm:ss Fatal error: config failed to refresh token: failed to start
with opening the port on the host.
A simple solution may be restarting the Host Network Service with eg.
Powershell
-
+
The
total size reported in the stats for a sync is wrong and keeps
@@ -79582,20 +80335,20 @@ TLS (TLS 1.2/1.3) and ECDHE-based cipher suites you can re-enable legacy
ciphers via GODEBUG:
Windows (cmd.exe):
-set GODEBUG=tlsrsakex=1
-rclone copy ...
+set GODEBUG=tlsrsakex=1
+rclone copy ...
Windows (PowerShell):
-$env:GODEBUG="tlsrsakex=1"
-rclone copy ...
+$env:GODEBUG="tlsrsakex=1"
+rclone copy ...
Linux/macOS:
-GODEBUG=tlsrsakex=1 rclone copy ...
+GODEBUG=tlsrsakex=1 rclone copy ...
If the server only supports 3DES, try:
-GODEBUG=tls3des=1 rclone ...
+GODEBUG=tls3des=1 rclone ...
This applies to any rclone feature using TLS (HTTPS,
FTPS, WebDAV over TLS, proxies with TLS interception, etc.). Use these
workarounds only long enough to get the server/proxy updated.
diff --git a/MANUAL.md b/MANUAL.md
index 6d194963b..11a341c27 100644
--- a/MANUAL.md
+++ b/MANUAL.md
@@ -1,6 +1,6 @@
% rclone(1) User Manual
% Nick Craig-Wood
-% Jul 31, 2026
+% Sep 04, 2026
# NAME
@@ -707,7 +707,7 @@ not the rclone developers so it may be out of date. Its current version is as be
## Source installation {#source}
Make sure you have git and [Go](https://golang.org/) installed.
-Go version 1.25 or newer is required, the latest release is recommended.
+Go version 1.26 or newer is required, the latest release is recommended.
You can get it from your package manager, or download it from
[golang.org/dl](https://golang.org/dl/). Then you can run the following:
@@ -5479,12 +5479,12 @@ rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,command=e
```console
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{YYYYMMDD}"
-// Output: stories/The Quick Brown Fox!-20260731
+// Output: stories/The Quick Brown Fox!-20260904
```
```console
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{macfriendlytime}"
-// Output: stories/The Quick Brown Fox!-2026-07-31 0340PM
+// Output: stories/The Quick Brown Fox!-2026-09-04 0450PM
```
```console
@@ -7402,6 +7402,11 @@ for all `mount` and `serve` commands on macOS. For details, see [vfs-case-sensit
### NFS mount
+For macOS (and other platforms where this path is supported), prefer the dedicated
+[rclone nfsmount](https://rclone.org/commands/rclone_nfsmount/) command. It starts the NFS server and
+performs the mount for you. `rclone mount` itself still uses FUSE (macFUSE/FUSE-T)
+and does not switch to NFS via a flag.
+
This method spins up an NFS server using [serve nfs](https://rclone.org/commands/rclone_serve_nfs/)
command and mounts it to the specified mountpoint. If you run this in background
mode using |--daemon|, you will need to send SIGTERM signal to the rclone process
@@ -7739,7 +7744,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -7794,7 +7799,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -8908,6 +8914,11 @@ for all `mount` and `serve` commands on macOS. For details, see [vfs-case-sensit
### NFS mount
+For macOS (and other platforms where this path is supported), prefer the dedicated
+[rclone nfsmount](https://rclone.org/commands/rclone_nfsmount/) command. It starts the NFS server and
+performs the mount for you. `rclone mount` itself still uses FUSE (macFUSE/FUSE-T)
+and does not switch to NFS via a flag.
+
This method spins up an NFS server using [serve nfs](https://rclone.org/commands/rclone_serve_nfs/)
command and mounts it to the specified mountpoint. If you run this in background
mode using |--daemon|, you will need to send SIGTERM signal to the rclone process
@@ -9245,7 +9256,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -9300,7 +9311,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -10534,7 +10546,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -10589,7 +10601,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -11210,7 +11223,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -11265,7 +11278,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -11839,7 +11853,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -11894,7 +11908,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -12291,9 +12306,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -12301,7 +12317,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -12311,10 +12328,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -12340,11 +12391,12 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
@@ -12676,7 +12728,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -12731,7 +12783,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -13128,9 +13181,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -13138,7 +13192,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -13148,10 +13203,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -13177,11 +13266,12 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
@@ -13456,7 +13546,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -13511,7 +13601,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -14249,6 +14340,12 @@ docs](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)).
`--auth-key` is not provided then `serve s3` will allow anonymous
access.
+Alternatively `--auth-proxy` can be used to look up the secret for each
+access key ID and choose the backend it maps to (see [Auth
+Proxy](#auth-proxy) below). When an auth proxy is in use `--auth-key`
+is ignored and every request must be signed with the secret the proxy
+returns for its access key ID.
+
Like all rclone flags `--auth-key` can be set via environment
variables, in this case `RCLONE_AUTH_KEY`. Since this flag can be
repeated, the input to `RCLONE_AUTH_KEY` is CSV encoded. Because the
@@ -14324,24 +14421,73 @@ access_key_id = ACCESS_KEY_ID
secret_access_key = SECRET_ACCESS_KEY
```
+## Object uploads (PUT)
+
+A `PutObject` upload only ever changes the object at its key atomically, on
+success, a failed or interrupted PUT neither removes nor overwrites the
+object already stored at the key, and never leaves a partial object visible
+at it.
+
+Remotes that upload atomically (e.g. object stores such as `s3`) are streamed
+straight to the destination. On remotes where a partial upload would
+otherwise be visible (e.g. `local`), and whenever `--vfs-cache-mode` is
+`writes` or above, the upload is written to a temporary object that is
+renamed into place on success; these remotes need to support a server-side
+move or copy for this (nearly all do - without move or copy the upload is
+written directly and a failed PUT may leave a partial object at the key). If
+`serve s3` is killed part-way through an upload the temporary object (named
+with a leading `.rclone_temp_put_`) may be left behind; it is hidden from
+S3 listings but must be removed manually.
+
## Multipart uploads
-By default `serve s3` **streams** each multipart upload, in part-number
-order, into a single `PutStream` upload to the underlying remote, so the
-whole file is never buffered in memory - memory use stays bounded by the
-parts in flight. The remote then performs its own internal upload (for
-example its own multipart upload, still with bounded memory). This works
-for any remote that supports `PutStream`, which is nearly all of them,
-including through `crypt`.
-
-The upload is atomic so the destination object only ever changes on a
+Multipart uploads are written, in part-number order, to a temporary
+object which is renamed into place, server-side, on completion, so the
+upload is atomic. The object at the key only ever changes on a
successful completion. A failed or aborted upload never affects any
-object already stored under that name. Remotes that upload atomically
-already (object stores such as `s3`) are streamed straight to the
-destination. On remotes where a partial upload would otherwise be visible
-(such as `local`), the parts are streamed to a temporary object that is
-moved into place, server-side, on completion; these remotes therefore
-also need to support a server-side move or copy.
+object already stored under that name and a partly-uploaded object
+never becomes visible under it.
+
+With the default `--vfs-cache-mode off` `serve s3` **streams** each
+multipart upload, in part-number order, into a single streaming upload
+to the underlying remote, so the whole file is never buffered in
+memory. Memory use stays bounded by the parts in flight. The remote
+then performs its own internal upload (for example its own multipart
+upload, still with bounded memory). Remotes that don't support
+streaming uploads (those that must know the file size before the
+upload starts, such as `onedrive`, `pcloud`, `jottacloud`, `mailru`,
+`opendrive`, `putio`, `protondrive` and `zoho`) have the parts spooled
+to a temporary file on **local disk** instead, and uploaded with the
+size then known on completion, so they need local disk space for the
+largest objects in flight rather than memory.
+
+With `--vfs-cache-mode writes` (or `full`) the parts are written to a
+temporary file in the VFS cache and uploaded by the VFS write-back -
+see [Multipart uploads and the VFS
+cache](#multipart-uploads-and-the-vfs-cache) below.
+
+The rename into place needs the remote to support a server-side move
+or copy, which nearly all do. It is a cheap rename on most remotes,
+but on object stores without a real rename (such as `s3` itself) the
+move is performed as a server-side copy and delete of the whole
+object, which can take time and API calls for large objects.
+Concurrent multipart uploads of the same key (which S3 permits) are
+safe. Each writes its own temporary object and the last to complete
+wins.
+
+On the few remotes that support neither server side move nor copy, the
+parts are written straight to the destination object instead and never
+buffered in memory. This is at some cost in atomicity - the incomplete
+object is visible under its final name while the upload is in flight,
+as it also is for a plain object PUT on such remotes, and concurrent
+multipart uploads of the same key write to the same object and can
+interleave. A failed or aborted upload still leaves any pre-existing
+object untouched provided the remote uploads atomically and the VFS
+cache is off; on a remote where partial uploads are visible it may
+leave partial data at the key (like a plain PUT there), and with
+`--vfs-cache-mode writes` (or `full`) a write to the cache cannot be
+abandoned, so an aborted upload's partial data is written back to the
+remote as if it had completed.
**Features**
@@ -14356,10 +14502,14 @@ also need to support a server-side move or copy.
as one continuous stream.
- The destination object only ever changes atomically, on completion: an
aborted or failed upload leaves any pre-existing object of the same
- name untouched, and a partly-uploaded object never becomes visible.
-- Backend-agnostic - it only needs the remote to support `PutStream`
- (plus a server-side move or copy on remotes that don't upload
- atomically).
+ name untouched, and a partly-uploaded object never becomes visible
+ (except on the few remotes with no server-side move or copy, as
+ above).
+- Multipart uploads go through the VFS like any other upload, so they
+ show in rclone's transfer stats and obey `--bwlimit`.
+- Backend-agnostic - it only needs the remote to support a server-side
+ move or copy for the rename into place, which nearly all do; a remote
+ without streaming upload support spools to local disk as above.
**Limitations**
@@ -14385,31 +14535,121 @@ also need to support a server-side move or copy.
upload and the client must start it again. (The remote's own upload
still retries its internal chunks.)
- Parts are serialised into one stream, so ingest from the client is
- effectively single-threaded, although the remote's own upload still
- runs concurrently.
-- On remotes that don't upload atomically (such as `local`), the
- completed object is moved into place with a server-side operation.
- This is a cheap rename on most such remotes. On these remotes, if
- `serve s3` is killed part-way through an upload the temporary object
- (named with a leading `.rclone_multipart_upload_`) may be left behind;
- it is hidden from S3 listings but must be removed manually.
+ effectively single-threaded. When streaming, the remote's own upload
+ runs concurrently with the parts arriving; with the local disk spool
+ or the VFS cache the upload to the remote only starts on completion.
+- If `serve s3` is killed part-way through an upload the temporary
+ object (named with a leading `.rclone_temp_multipart_`) may be left
+ behind; it is hidden from S3 listings but must be removed manually.
+
+### Multipart uploads and the VFS cache
+
+With `--vfs-cache-mode writes` (or `full`) multipart uploads do not
+stream to the remote at all. The parts are written, in part-number
+order, to a temporary file in the VFS cache. On completion the file is
+renamed into place and uploaded by the VFS write-back, exactly like a
+plain object PUT. This needs no streaming upload support from the
+remote. The rename normally happens in the cache before the upload has
+started, but the VFS requires the remote to support a server-side move
+or copy to rename files at all (and uses one if the temporary file has
+already been written back, e.g. with `--vfs-write-back 0`). On remotes
+without either, the parts are written to the cache directly under the
+final key instead: the upload still never touches memory, but it loses
+its atomicity - the in-flight upload is visible at the key, and an
+aborted upload cannot be abandoned once in the cache, so its partial
+data is written back to the remote as if it were a completed object.
+
+Remotes that benefit from `--vfs-cache-mode writes`:
+
+- **Remotes over slow or unreliable links.** A failure in a streamed
+ upload aborts the whole multipart upload and the client must start
+ again from the first part; a failed write-back upload is retried by
+ the VFS (see `--vfs-cache-max-age` and friends) without the client
+ being involved. Ingest from the client also runs at local disk speed
+ rather than being throttled to the remote's pace.
+- **Workloads that read back or overwrite what they just wrote.** The
+ completed object stays in the cache, so subsequent `GET`/`HEAD`
+ requests are served locally, and plain PUTs and multipart uploads to
+ the same key go through the same cache entry so the last write wins
+ regardless of upload style.
+
+The trade-offs of the VFS cache:
+
+- The whole object lands on local disk, so the cache (`--cache-dir`)
+ needs space for the largest objects in flight; `--vfs-cache-max-size`
+ cannot evict files which are still being uploaded.
+- The `200 OK` for `CompleteMultipartUpload` means the data is safely
+ in the **local cache**, not yet on the remote - the same durability
+ the cache gives plain PUTs. If an acknowledgement must mean the data
+ has reached the remote (for example WAL archiving), use the default
+ `--vfs-cache-mode off`.
+- The upload to the remote only starts on completion, rather than
+ overlapping with the parts arriving, so the data reaches the remote
+ later than with streaming.
+- If `serve s3` is killed part-way through an upload, the temporary
+ file survives in the cache and the VFS cache recovery uploads it to
+ the remote on restart as a temporary object (named with a leading
+ `.rclone_temp_multipart_`); as with the streaming path, it is
+ hidden from S3 listings but must be removed manually.
+
+### Cleaning up temporary objects
+
+If `serve s3` is killed part-way through an upload it can leave a
+temporary object behind, named with a leading `.rclone_temp_`. This
+whole prefix is reserved: any object whose name (the last
+`/`-separated segment of its key) starts with `.rclone_temp_` is
+hidden from S3 listings, so don't give real objects such names - an
+existing object with such a name disappears from listings (though it
+stays accessible directly by its key: only listings hide reserved
+names, `GET`, `HEAD` and `DELETE` of the exact key still work). A
+temporary object never holds acknowledged data - uploads whose
+temporary object survived were never confirmed to the client - so old
+ones are safe to delete:
+
+ rclone delete --min-age 24h --include ".rclone_temp_*" remote:path
+
+The `--min-age` protects uploads which are still in progress: make sure
+it is longer than your longest upload, especially if several `serve s3`
+instances share the same remote.
+
+rclone v1.75 named its temporary multipart objects
+`.rclone_multipart_upload_*`; leftovers from an older server are also
+hidden from listings and can be cleaned up the same way.
+
+### Abandoned uploads
+
+A client which starts a multipart upload and vanishes without either
+completing or aborting it would otherwise hold on to its resources
+forever.
+
+An incomplete multipart upload which has had no activity for
+`--multipart-expiry` (default `24h`) is therefore aborted and cleaned
+up, exactly as if the client had called `AbortMultipartUpload`, and a
+`NOTICE` is logged.
+
+An upload with a part still being received is never expired, however
+slowly the part is arriving, and each completed part restarts the
+clock, so the expiry only needs to outlast the client's pauses
+*between* parts, not the whole upload.
+
+Late operations on an expired upload fail with `NoSuchUpload`, as they
+do on real S3 when a lifecycle rule has aborted the upload. Set
+`--multipart-expiry 0` to keep incomplete uploads forever.
### Disabling streaming
-If you pass `--disable-multipart-streaming`, or the remote doesn't
-support `PutStream` (or doesn't upload atomically and can't move or copy
-server-side), multipart uploads are instead **buffered in memory**
-by the underlying S3 library: every part is held in memory and the whole
-object is written out in one go when the upload completes (the previous
-behaviour). This removes the in-order/contiguous-part restriction above,
-so parts can be uploaded in any order, but **memory use grows with the
-size of the upload**, so it is only suitable for small objects. A one-off
-`NOTICE` is logged the first time this happens.
-
-Alternatively, if the client is an rclone `s3` remote (like the
-`[serves3]` example above), you can set `use_multipart_uploads = false`
-on it so it uploads each object as a single stream and skips multipart
-uploads altogether.
+If you pass `--disable-multipart-streaming`, multipart uploads are
+instead **buffered in memory** by the underlying S3 library: every
+part is held in memory and the whole object is written out in one go
+when the upload completes. This removes the in-order/contiguous-part
+restriction above, so parts can be uploaded in any order, but **memory
+use grows with the size of the upload**, so it is only suitable for
+small objects. A one-off `NOTICE` is logged the first time this
+happens. This flag is the only thing that makes multipart uploads
+buffer in memory - it is never done because of missing remote
+capabilities. Consider `--vfs-cache-mode writes` instead, which
+buffers the upload in the VFS cache on disk and takes precedence over
+`--disable-multipart-streaming`.
## Bugs
@@ -14659,7 +14899,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -14714,680 +14954,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
-1 hour will start evicting files from cache that haven't been accessed
-for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
-and will wait for 1 more hour before evicting. Specify the time with
-standard notation, s, m, h, d, w .
-
-You **should not** run two copies of rclone using the same VFS cache
-with the same or overlapping remotes if using `--vfs-cache-mode > off`.
-This can potentially cause data corruption if you do. You can work
-around this by giving each rclone its own cache hierarchy with
-`--cache-dir`. You don't need to worry about this if the remotes in
-use don't overlap.
-
-### --vfs-cache-mode off
-
-In this mode (the default) the cache will read directly from the remote and write
-directly to the remote without caching anything on disk.
-
-This will mean some operations are not possible
-
-- Files can't be opened for both read AND write
-- Files opened for write can't be seeked
-- Existing files opened for write must have O_TRUNC set
-- Files open for read with O_TRUNC will be opened write only
-- Files open for write only will behave as if O_TRUNC was supplied
-- Open modes O_APPEND, O_TRUNC are ignored
-- If an upload fails it can't be retried
-
-### --vfs-cache-mode minimal
-
-This is very similar to "off" except that files opened for read AND
-write will be buffered to disk. This means that files opened for
-write will be a lot more compatible, but uses the minimal disk space.
-
-These operations are not possible
-
-- Files opened for write only can't be seeked
-- Existing files opened for write must have O_TRUNC set
-- Files opened for write only will ignore O_APPEND, O_TRUNC
-- If an upload fails it can't be retried
-
-### --vfs-cache-mode writes
-
-In this mode files opened for read only are still read directly from
-the remote, write only and read/write files are buffered to disk
-first.
-
-This mode should support all normal file system operations.
-
-If an upload fails it will be retried at exponentially increasing
-intervals up to 1 minute.
-
-### --vfs-cache-mode full
-
-In this mode all reads and writes are buffered to and from disk. When
-data is read from the remote this is buffered to disk as well.
-
-In this mode the files in the cache will be sparse files and rclone
-will keep track of which bits of the files it has downloaded.
-
-So if an application only reads the starts of each file, then rclone
-will only buffer the start of the file. These files will appear to be
-their full size in the cache, but they will be sparse files with only
-the data that has been downloaded present in them.
-
-This mode should support all normal file system operations and is
-otherwise identical to `--vfs-cache-mode` writes.
-
-When reading a file rclone will read `--buffer-size` plus
-`--vfs-read-ahead` bytes ahead. The `--buffer-size` is buffered in memory
-whereas the `--vfs-read-ahead` is buffered on disk.
-
-When using this mode it is recommended that `--buffer-size` is not set
-too large and `--vfs-read-ahead` is set large if required.
-
-**IMPORTANT** not all file systems support sparse files. In particular
-FAT/exFAT do not. Rclone will perform very badly if the cache
-directory is on a filesystem which doesn't support sparse files and it
-will log an ERROR message if one is detected.
-
-### Fingerprinting
-
-Various parts of the VFS use fingerprinting to see if a local file
-copy has changed relative to a remote file. Fingerprints are made
-from:
-
-- size
-- modification time
-- hash
-
-where available on an object.
-
-On some backends some of these attributes are slow to read (they take
-an extra API call per object, or extra work per object).
-
-For example `hash` is slow with the `local` and `sftp` backends as
-they have to read the entire file and hash it, and `modtime` is slow
-with the `s3`, `swift`, `ftp` and `qinqstor` backends because they
-need to do an extra API call to fetch it.
-
-If you use the `--vfs-fast-fingerprint` flag then rclone will not
-include the slow operations in the fingerprint. This makes the
-fingerprinting less accurate but much faster and will improve the
-opening time of cached files.
-
-If you are running a vfs cache over `local`, `s3` or `swift` backends
-then using this flag is recommended.
-
-Note that if you change the value of this flag, the fingerprints of
-the files in the cache may be invalidated and the files will need to
-be downloaded again.
-
-## VFS Chunked Reading
-
-When rclone reads files from a remote it reads them in chunks. This
-means that rather than requesting the whole file rclone reads the
-chunk specified. This can reduce the used download quota for some
-remotes by requesting only chunks from the remote that are actually
-read, at the cost of an increased number of requests.
-
-These flags control the chunking:
-
-```text
- --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
- --vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
- --vfs-read-chunk-streams int The number of parallel streams to read at once
-```
-
-The chunking behaves differently depending on the `--vfs-read-chunk-streams` parameter.
-
-### `--vfs-read-chunk-streams` == 0
-
-Rclone will start reading a chunk of size `--vfs-read-chunk-size`,
-and then double the size for each read. When `--vfs-read-chunk-size-limit` is
-specified, and greater than `--vfs-read-chunk-size`, the chunk size for each
-open file will get doubled only until the specified value is reached. If the
-value is "off", which is the default, the limit is disabled and the chunk size
-will grow indefinitely.
-
-With `--vfs-read-chunk-size 100M` and `--vfs-read-chunk-size-limit 0`
-the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M
-and so on. When `--vfs-read-chunk-size-limit 500M` is specified, the result would
-be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on.
-
-Setting `--vfs-read-chunk-size` to `0` or "off" disables chunked reading.
-
-The chunks will not be buffered in memory.
-
-### `--vfs-read-chunk-streams` > 0
-
-Rclone reads `--vfs-read-chunk-streams` chunks of size
-`--vfs-read-chunk-size` concurrently. The size for each read will stay
-constant.
-
-This improves performance performance massively on high latency links
-or very high bandwidth links to high performance object stores.
-
-Some experimentation will be needed to find the optimum values of
-`--vfs-read-chunk-size` and `--vfs-read-chunk-streams` as these will
-depend on the backend in use and the latency to the backend.
-
-For high performance object stores (eg AWS S3) a reasonable place to
-start might be `--vfs-read-chunk-streams 16` and
-`--vfs-read-chunk-size 4M`. In testing with AWS S3 the performance
-scaled roughly as the `--vfs-read-chunk-streams` setting.
-
-Similar settings should work for high latency links, but depending on
-the latency they may need more `--vfs-read-chunk-streams` in order to
-get the throughput.
-
-## VFS Performance
-
-These flags may be used to enable/disable features of the VFS for
-performance or other reasons. See also the [chunked reading](#vfs-chunked-reading)
-feature.
-
-In particular S3 and Swift benefit hugely from the `--no-modtime` flag
-(or use `--use-server-modtime` for a slightly different effect) as each
-read of the modification time takes a transaction.
-
-```text
- --no-checksum Don't compare checksums on up/download.
- --no-modtime Don't read/write the modification time (can speed things up).
- --no-seek Don't allow seeking in files.
- --read-only Only allow read-only access.
-```
-
-Sometimes rclone is delivered reads or writes out of order. Rather
-than seeking rclone will wait a short time for the in sequence read or
-write to come in. These flags only come into effect when not using an
-on disk cache file.
-
-```text
- --vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
- --vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
-```
-
-When using VFS write caching (`--vfs-cache-mode` with value writes or full),
-the global flag `--transfers` can be set to adjust the number of parallel uploads
-of modified files from the cache (the related global flag `--checkers` has no
-effect on the VFS).
-
-```text
- --transfers int Number of file transfers to run in parallel (default 4)
-```
-
-## Symlinks
-
-By default the VFS does not support symlinks. However this may be
-enabled with either of the following flags:
-
-```text
- --links Translate symlinks to/from regular files with a '.rclonelink' extension.
- --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
-```
-
-As most cloud storage systems do not support symlinks directly, rclone
-stores the symlink as a normal file with a special extension. So a
-file which appears as a symlink `link-to-file.txt` would be stored on
-cloud storage as `link-to-file.txt.rclonelink` and the contents would
-be the path to the symlink destination.
-
-Note that `--links` enables symlink translation globally in rclone -
-this includes any backend which supports the concept (for example the
-local backend). `--vfs-links` just enables it for the VFS layer.
-
-This scheme is compatible with that used by the
-[local backend with the --local-links flag](https://rclone.org/local/#symlinks-junction-points).
-
-The `--vfs-links` flag has been designed for `rclone mount`, `rclone
-nfsmount` and `rclone serve nfs`.
-
-It hasn't been tested with the other `rclone serve` commands yet.
-
-A limitation of the current implementation is that it expects the
-caller to resolve sub-symlinks. For example given this directory tree
-
-```text
-.
-├── dir
-│ └── file.txt
-└── linked-dir -> dir
-```
-
-The VFS will correctly resolve `linked-dir` but not
-`linked-dir/file.txt`. This is not a problem for the tested commands
-but may be for other commands.
-
-**Note** that there is an outstanding issue with symlink support
-[issue #8245](https://github.com/rclone/rclone/issues/8245) with duplicate
-files being created when symlinks are moved into directories where
-there is a file of the same name (or vice versa).
-
-## VFS Case Sensitivity
-
-Linux file systems are case-sensitive: two files can differ only
-by case, and the exact case must be used when opening a file.
-
-File systems in modern Windows are case-insensitive but case-preserving:
-although existing files can be opened using any case, the exact case used
-to create the file is preserved and available for programs to query.
-It is not allowed for two files in the same directory to differ only by case.
-
-Usually file systems on macOS are case-insensitive. It is possible to make macOS
-file systems case-sensitive but that is not the default.
-
-The `--vfs-case-insensitive` VFS flag controls how rclone handles these
-two cases. If its value is "false", rclone passes file names to the remote
-as-is. If the flag is "true" (or appears without a value on the
-command line), rclone may perform a "fixup" as explained below.
-
-The user may specify a file name to open/delete/rename/etc with a case
-different than what is stored on the remote. If an argument refers
-to an existing file with exactly the same name, then the case of the existing
-file on the disk will be used. However, if a file name with exactly the same
-name is not found but a name differing only by case exists, rclone will
-transparently fixup the name. This fixup happens only when an existing file
-is requested. Case sensitivity of file names created anew by rclone is
-controlled by the underlying remote.
-
-Note that case sensitivity of the operating system running rclone (the target)
-may differ from case sensitivity of a file system presented by rclone (the source).
-The flag controls whether "fixup" is performed to satisfy the target.
-
-If the flag is not provided on the command line, then its default value depends
-on the operating system where rclone runs: "true" on Windows and macOS, "false"
-otherwise. If the flag is provided without a value, then it is "true".
-
-The `--no-unicode-normalization` flag controls whether a similar "fixup" is
-performed for filenames that differ but are [canonically
-equivalent](https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to
-unicode. Unicode normalization can be particularly helpful for users of macOS,
-which prefers form NFD instead of the NFC used by most other platforms. It is
-therefore highly recommended to keep the default of `false` on macOS, to avoid
-encoding compatibility issues.
-
-In the (probably unlikely) event that a directory has multiple duplicate
-filenames after applying case and unicode normalization, the `--vfs-block-norm-dupes`
-flag allows hiding these duplicates. This comes with a performance tradeoff, as
-rclone will have to scan the entire directory for duplicates when listing a
-directory. For this reason, it is recommended to leave this disabled if not
-needed. However, macOS users may wish to consider using it, as otherwise, if a
-remote directory contains both NFC and NFD versions of the same filename, an odd
-situation will occur: both versions of the file will be visible in the mount,
-and both will appear to be editable, however, editing either version will
-actually result in only the NFD version getting edited under the hood. `--vfs-block-
-norm-dupes` prevents this confusion by detecting this scenario, hiding the
-duplicates, and logging an error, similar to how this is handled in `rclone
-sync`.
-
-## VFS Disk Options
-
-This flag allows you to manually set the statistics about the filing system.
-It can be useful when those statistics cannot be read correctly automatically.
-
-```text
- --vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
-```
-
-## Alternate report of used bytes
-
-Some backends, most notably S3, do not report the amount of bytes used.
-If you need this information to be available when running `df` on the
-filesystem, then pass the flag `--vfs-used-is-size` to rclone.
-With this flag set, instead of relying on the backend to report this
-information, rclone will scan the whole remote similar to `rclone size`
-and compute the total used space itself.
-
-**WARNING**: Contrary to `rclone size`, this flag ignores filters so that the
-result is accurate. However, this is very inefficient and may cost lots of API
-calls resulting in extra charges. Use it as a last resort and only with caching.
-
-## VFS Metadata
-
-If you use the `--vfs-metadata-extension` flag you can get the VFS to
-expose files which contain the [metadata](https://rclone.org/docs/#metadata) as a JSON
-blob. These files will not appear in the directory listing, but can be
-`stat`-ed and opened and once they have been they **will** appear in
-directory listings until the directory cache expires.
-
-Note that some backends won't create metadata unless you pass in the
-`--metadata` flag.
-
-For example, using `rclone mount` with `--metadata --vfs-metadata-extension .metadata`
-we get
-
-```console
-$ ls -l /mnt/
-total 1048577
--rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-
-$ cat /mnt/1G.metadata
-{
- "atime": "2025-03-04T17:34:22.317069787Z",
- "btime": "2025-03-03T16:03:37.708253808Z",
- "gid": "1000",
- "mode": "100664",
- "mtime": "2025-03-03T16:03:39.640238323Z",
- "uid": "1000"
-}
-
-$ ls -l /mnt/
-total 1048578
--rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
--rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
-```
-
-If the file has no metadata it will be returned as `{}` and if there
-is an error reading the metadata the error will be returned as
-`{"error":"error string"}`.
-
-```
-rclone serve s3 remote:path [flags]
-```
-
-## Options
-
-```
- --addr stringArray IPaddress:Port or :Port to bind server to (default 127.0.0.1:8080)
- --allow-origin string Origin which cross-domain request (CORS) can be executed from
- --auth-key stringArray Set key pair for v4 authorization: access_key_id,secret_access_key
- --auth-proxy string A program to use to create the backend from the auth
- --baseurl string Prefix for URLs - leave blank for root
- --cert string TLS PEM key (concatenation of certificate and CA certificate)
- --client-ca string Client certificate authority to verify clients with
- --dir-cache-time Duration Time to cache directory entries for (default 5m0s)
- --dir-perms FileMode Directory permissions (default 777)
- --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend (see the Multipart uploads docs section)
- --etag-hash string Which hash to use for the ETag, or auto or blank for off (default "MD5")
- --file-perms FileMode File permissions (default 666)
- --force-path-style If true use path style access if false use virtual hosted style (default true)
- --gid uint32 Override the gid field set by the filesystem (not supported on Windows) (default 1000)
- -h, --help help for s3
- --htpasswd string A htpasswd file - if not provided no authentication is done
- --key string TLS PEM Private key
- --link-perms FileMode Link permissions (default 666)
- --max-header-bytes int Maximum size of request header (default 4096)
- --min-tls-version string Minimum TLS version that is acceptable (default "tls1.0")
- --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (see the Multipart uploads docs section) (default 256Mi)
- --no-checksum Don't compare checksums on up/download
- --no-cleanup Not to cleanup empty folder after object is deleted
- --no-modtime Don't read/write the modification time (can speed things up)
- --no-seek Don't allow seeking in files
- --pass string Password for authentication
- --poll-interval Duration Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)
- --read-only Only allow read-only access
- --realm string Realm for authentication
- --response-header stringArray Set HTTP header for all responses, overriding existing values
- --salt string Password hashing salt (default "dlPL2MqE")
- --server-read-timeout Duration Timeout for server reading data (default 1h0m0s)
- --server-write-timeout Duration Timeout for server writing data (default 1h0m0s)
- --uid uint32 Override the uid field set by the filesystem (not supported on Windows) (default 1000)
- --umask FileMode Override the permission bits set by the filesystem (not supported on Windows) (default 002)
- --user string User name for authentication
- --user-from-header string User name from a defined HTTP header
- --vfs-block-norm-dupes If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)
- --vfs-cache-max-age Duration Max time since last access of objects in the cache (default 1h0m0s)
- --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
- --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
- --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
- --vfs-cache-poll-interval Duration Interval to poll the cache for stale objects (default 1m0s)
- --vfs-case-insensitive If a file name not found, find a case insensitive match
- --vfs-disk-space-total-size SizeSuffix Specify the total space of disk (default off)
- --vfs-fast-fingerprint Use fast (less accurate) fingerprints for change detection
- --vfs-handle-caching Duration Time to keep file handle and downloaders alive after last close (default 5s)
- --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
- --vfs-metadata-extension string Set the extension to read metadata from
- --vfs-read-ahead SizeSuffix Extra read ahead over --buffer-size when using cache-mode full
- --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128Mi)
- --vfs-read-chunk-size-limit SizeSuffix If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited) (default off)
- --vfs-read-chunk-streams int The number of parallel streams to read at once
- --vfs-read-wait Duration Time to wait for in-sequence read before seeking (default 20ms)
- --vfs-refresh Refreshes the directory cache recursively in the background on start
- --vfs-used-is-size rclone size Use the rclone size algorithm for Used size
- --vfs-write-back Duration Time to writeback files after last use when using cache (default 5s)
- --vfs-write-wait Duration Time to wait for in-sequence write before giving error (default 1s)
-```
-
-Options shared with other commands are described next.
-See the [global flags page](https://rclone.org/flags/) for global options not listed here.
-
-### Filter Options
-
-Flags for filtering directory listings
-
-```text
- --delete-excluded Delete files on dest excluded from sync
- --exclude stringArray Exclude files matching pattern
- --exclude-from stringArray Read file exclude patterns from file (use - to read from stdin)
- --exclude-if-present stringArray Exclude directories if filename is present
- --files-from stringArray Read list of source-file names from file (use - to read from stdin)
- --files-from-raw stringArray Read list of source-file names from file without any processing of lines (use - to read from stdin)
- --files-from0 stringArray Read list of source-file names from file using NUL as separator (use - to read from stdin)
- -f, --filter stringArray Add a file filtering rule
- --filter-from stringArray Read file filtering patterns from a file (use - to read from stdin)
- --hash-filter string Partition filenames by hash k/n or randomly @/n
- --ignore-case Ignore case in filters (case insensitive)
- --include stringArray Include files matching pattern
- --include-from stringArray Read file include patterns from file (use - to read from stdin)
- --max-age Duration Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)
- --max-depth int If set limits the recursion depth to this (default -1)
- --max-size SizeSuffix Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)
- --metadata-exclude stringArray Exclude metadatas matching pattern
- --metadata-exclude-from stringArray Read metadata exclude patterns from file (use - to read from stdin)
- --metadata-filter stringArray Add a metadata filtering rule
- --metadata-filter-from stringArray Read metadata filtering patterns from a file (use - to read from stdin)
- --metadata-include stringArray Include metadatas matching pattern
- --metadata-include-from stringArray Read metadata include patterns from file (use - to read from stdin)
- --min-age Duration Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)
- --min-size SizeSuffix Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
-```
-
-## See Also
-
-
-
-
-* [rclone serve](https://rclone.org/commands/rclone_serve/) - Serve a remote over a protocol.
-
-
-
-
-# rclone serve sftp
-
-Serve the remote over SFTP.
-
-## Synopsis
-
-Run an SFTP server to serve a remote over SFTP. This can be used
-with an SFTP client or you can make a remote of type [sftp](/sftp) to use with it.
-
-You can use the [filter](/filtering) flags (e.g. `--include`, `--exclude`)
-to control what is served.
-
-The server will respond to a small number of shell commands, mainly
-md5sum, sha1sum and df, which enable it to provide support for checksums
-and the about feature when accessed from an sftp remote.
-
-Note that this server uses standard 32 KiB packet payload size, which
-means you must not configure the client to expect anything else, e.g.
-with the [chunk_size](https://rclone.org/sftp/#sftp-chunk-size) option on an sftp remote.
-
-The server will log errors. Use `-v` to see access logs.
-
-`--bwlimit` will be respected for file transfers.
-Use `--stats` to control the stats printing.
-
-You must provide some means of authentication, either with
-`--user`/`--pass`, an authorized keys file (specify location with
-`--authorized-keys` - the default is the same as ssh), an
-`--auth-proxy`, or set the `--no-auth` flag for no
-authentication when logging in.
-
-If you don't supply a host `--key` then rclone will generate rsa, ecdsa
-and ed25519 variants, and cache them for later use in rclone's cache
-directory (see `rclone help flags cache-dir`) in the "serve-sftp"
-directory.
-
-By default the server binds to localhost:2022 - if you want it to be
-reachable externally then supply `--addr :2022` for example.
-
-This also supports being run with socket activation, in which case it will
-listen on the first passed FD.
-It can be configured with .socket and .service unit files as described in
-.
-
-Socket activation can be tested ad-hoc with the `systemd-socket-activate`command:
-
-```console
-systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
-```
-
-This will socket-activate rclone on the first connection to port 2222 over TCP.
-
-Note that the default of `--vfs-cache-mode off` is fine for the rclone
-sftp backend, but it may not be with other SFTP clients.
-
-If `--stdio` is specified, rclone will serve SFTP over stdio, which can
-be used with sshd via ~/.ssh/authorized_keys, for example:
-
-```text
-restrict,command="rclone serve sftp --stdio ./photos" ssh-rsa ...
-```
-
-On the client you need to set `--transfers 1` when using `--stdio`.
-Otherwise multiple instances of the rclone server are started by OpenSSH
-which can lead to "corrupted on transfer" errors. This is the case because
-the client chooses indiscriminately which server to send commands to while
-the servers all have different views of the state of the filing system.
-
-The "restrict" in authorized_keys prevents SHA1SUMs and MD5SUMs from being
-used. Omitting "restrict" and using `--sftp-path-override` to enable
-checksumming is possible but less secure and you could use the SFTP server
-provided by OpenSSH in this case.
-
-## VFS - Virtual File System
-
-This command uses the VFS layer. This adapts the cloud storage objects
-that rclone uses into something which looks much more like a disk
-filing system.
-
-Cloud storage objects have lots of properties which aren't like disk
-files - you can't extend them or write to the middle of them, so the
-VFS layer has to deal with that. Because there is no one right way of
-doing this there are various options explained below.
-
-The VFS layer also implements a directory cache - this caches info
-about files and directories (but not the data) in memory.
-
-## VFS Directory Cache
-
-Using the `--dir-cache-time` flag, you can control how long a
-directory should be considered up to date and not refreshed from the
-backend. Changes made through the VFS will appear immediately or
-invalidate the cache.
-
-```text
- --dir-cache-time duration Time to cache directory entries for (default 5m0s)
- --poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
-```
-
-However, changes made directly on the cloud storage by the web
-interface or a different copy of rclone will only be picked up once
-the directory cache expires if the backend configured does not support
-polling for changes. If the backend supports polling, changes will be
-picked up within the polling interval.
-
-You can send a `SIGHUP` signal to rclone for it to flush all
-directory caches, regardless of how old they are. Assuming only one
-rclone instance is running, you can reset the cache like this:
-
-```console
-kill -SIGHUP $(pidof rclone)
-```
-
-If you configure rclone with a [remote control](/rc) then you can use
-rclone rc to flush the whole directory cache:
-
-```console
-rclone rc vfs/forget
-```
-
-Or individual files or directories:
-
-```console
-rclone rc vfs/forget file=path/to/file dir=path/to/dir
-```
-
-## VFS File Buffering
-
-The `--buffer-size` flag determines the amount of memory,
-that will be used to buffer data in advance.
-
-Each open file will try to keep the specified amount of data in memory
-at all times. The buffered data is bound to one open file and won't be
-shared.
-
-This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
-yet read. If the buffer is empty, only a small amount of memory will
-be used.
-
-The maximum memory used by rclone for buffering can be up to
-`--buffer-size * open files`.
-
-## VFS File Caching
-
-These flags control the VFS file caching options. File caching is
-necessary to make the VFS layer appear compatible with a normal file
-system. It can be disabled at the cost of some compatibility.
-
-For example you'll need to enable VFS caching if you want to read and
-write simultaneously to a file. See below for more details.
-
-Note that the VFS cache is separate from the cache backend and you may
-find that you need one or the other or both.
-
-```text
- --cache-dir string Directory rclone will use for caching.
- --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
- --vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
- --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
- --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
- --vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
- --vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
-```
-
-If run with `-vv` rclone will print the location of the file cache. The
-files are stored in the user cache file area which is OS dependent but
-can be controlled with `--cache-dir` or setting the appropriate
-environment variable.
-
-The cache has 4 different modes selected by `--vfs-cache-mode`.
-The higher the cache mode the more compatible rclone becomes at the
-cost of using disk space.
-
-Note that files are written back to the remote only when they are
-closed and if they haven't been accessed for `--vfs-write-back`
-seconds. If rclone is quit or dies with files that haven't been
-uploaded, these will be uploaded next time rclone is run with the same
-flags.
-
-If using `--vfs-cache-max-size` or `--vfs-cache-min-free-space` note
-that the cache may exceed these quotas for two reasons. Firstly
-because it is only checked every `--vfs-cache-poll-interval`. Secondly
-because open files cannot be evicted from the cache. When
-`--vfs-cache-max-size` or `--vfs-cache-min-free-space` is exceeded,
-rclone will attempt to evict the least accessed files from the cache
-first. rclone will start with files that haven't been accessed for the
-longest. This cache flushing strategy is efficient and more relevant
-files are likely to remain cached.
-
-The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -15784,9 +15352,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -15794,7 +15363,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -15804,10 +15374,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -15833,11 +15437,808 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
+
+This can be used to build general purpose proxies to any kind of
+backend that rclone supports.
+
+```
+rclone serve s3 remote:path [flags]
+```
+
+## Options
+
+```
+ --addr stringArray IPaddress:Port or :Port to bind server to (default 127.0.0.1:8080)
+ --allow-origin string Origin which cross-domain request (CORS) can be executed from
+ --auth-key stringArray Set key pair for v4 authorization: access_key_id,secret_access_key
+ --auth-proxy string A program to use to create the backend from the auth
+ --baseurl string Prefix for URLs - leave blank for root
+ --cert string TLS PEM key (concatenation of certificate and CA certificate)
+ --client-ca string Client certificate authority to verify clients with
+ --dir-cache-time Duration Time to cache directory entries for (default 5m0s)
+ --dir-perms FileMode Directory permissions (default 777)
+ --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend
+ --etag-hash string Which hash to use for the ETag, or auto or blank for off (default "MD5")
+ --file-perms FileMode File permissions (default 666)
+ --force-path-style If true use path style access if false use virtual hosted style (default true)
+ --gid uint32 Override the gid field set by the filesystem (not supported on Windows) (default 1000)
+ -h, --help help for s3
+ --htpasswd string A htpasswd file - if not provided no authentication is done
+ --key string TLS PEM Private key
+ --link-perms FileMode Link permissions (default 666)
+ --max-header-bytes int Maximum size of request header (default 4096)
+ --min-tls-version string Minimum TLS version that is acceptable (default "tls1.0")
+ --multipart-expiry Duration Abort incomplete multipart uploads idle for longer than this, 0 to keep forever (default 1d)
+ --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (default 256Mi)
+ --no-checksum Don't compare checksums on up/download
+ --no-cleanup Not to cleanup empty folder after object is deleted
+ --no-modtime Don't read/write the modification time (can speed things up)
+ --no-seek Don't allow seeking in files
+ --pass string Password for authentication
+ --poll-interval Duration Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)
+ --read-only Only allow read-only access
+ --realm string Realm for authentication
+ --response-header stringArray Set HTTP header for all responses, overriding existing values
+ --salt string Password hashing salt (default "dlPL2MqE")
+ --server-read-timeout Duration Timeout for server reading data (default 1h0m0s)
+ --server-write-timeout Duration Timeout for server writing data (default 1h0m0s)
+ --uid uint32 Override the uid field set by the filesystem (not supported on Windows) (default 1000)
+ --umask FileMode Override the permission bits set by the filesystem (not supported on Windows) (default 002)
+ --user string User name for authentication
+ --user-from-header string User name from a defined HTTP header
+ --vfs-block-norm-dupes If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)
+ --vfs-cache-max-age Duration Max time since last access of objects in the cache (default 1h0m0s)
+ --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
+ --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
+ --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
+ --vfs-cache-poll-interval Duration Interval to poll the cache for stale objects (default 1m0s)
+ --vfs-case-insensitive If a file name not found, find a case insensitive match
+ --vfs-disk-space-total-size SizeSuffix Specify the total space of disk (default off)
+ --vfs-fast-fingerprint Use fast (less accurate) fingerprints for change detection
+ --vfs-handle-caching Duration Time to keep file handle and downloaders alive after last close (default 5s)
+ --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
+ --vfs-metadata-extension string Set the extension to read metadata from
+ --vfs-read-ahead SizeSuffix Extra read ahead over --buffer-size when using cache-mode full
+ --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128Mi)
+ --vfs-read-chunk-size-limit SizeSuffix If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited) (default off)
+ --vfs-read-chunk-streams int The number of parallel streams to read at once
+ --vfs-read-wait Duration Time to wait for in-sequence read before seeking (default 20ms)
+ --vfs-refresh Refreshes the directory cache recursively in the background on start
+ --vfs-used-is-size rclone size Use the rclone size algorithm for Used size
+ --vfs-write-back Duration Time to writeback files after last use when using cache (default 5s)
+ --vfs-write-wait Duration Time to wait for in-sequence write before giving error (default 1s)
+```
+
+Options shared with other commands are described next.
+See the [global flags page](https://rclone.org/flags/) for global options not listed here.
+
+### Filter Options
+
+Flags for filtering directory listings
+
+```text
+ --delete-excluded Delete files on dest excluded from sync
+ --exclude stringArray Exclude files matching pattern
+ --exclude-from stringArray Read file exclude patterns from file (use - to read from stdin)
+ --exclude-if-present stringArray Exclude directories if filename is present
+ --files-from stringArray Read list of source-file names from file (use - to read from stdin)
+ --files-from-raw stringArray Read list of source-file names from file without any processing of lines (use - to read from stdin)
+ --files-from0 stringArray Read list of source-file names from file using NUL as separator (use - to read from stdin)
+ -f, --filter stringArray Add a file filtering rule
+ --filter-from stringArray Read file filtering patterns from a file (use - to read from stdin)
+ --hash-filter string Partition filenames by hash k/n or randomly @/n
+ --ignore-case Ignore case in filters (case insensitive)
+ --include stringArray Include files matching pattern
+ --include-from stringArray Read file include patterns from file (use - to read from stdin)
+ --max-age Duration Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)
+ --max-depth int If set limits the recursion depth to this (default -1)
+ --max-size SizeSuffix Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)
+ --metadata-exclude stringArray Exclude metadatas matching pattern
+ --metadata-exclude-from stringArray Read metadata exclude patterns from file (use - to read from stdin)
+ --metadata-filter stringArray Add a metadata filtering rule
+ --metadata-filter-from stringArray Read metadata filtering patterns from a file (use - to read from stdin)
+ --metadata-include stringArray Include metadatas matching pattern
+ --metadata-include-from stringArray Read metadata include patterns from file (use - to read from stdin)
+ --min-age Duration Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)
+ --min-size SizeSuffix Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
+```
+
+## See Also
+
+
+
+
+* [rclone serve](https://rclone.org/commands/rclone_serve/) - Serve a remote over a protocol.
+
+
+
+
+# rclone serve sftp
+
+Serve the remote over SFTP.
+
+## Synopsis
+
+Run an SFTP server to serve a remote over SFTP. This can be used
+with an SFTP client or you can make a remote of type [sftp](/sftp) to use with it.
+
+You can use the [filter](/filtering) flags (e.g. `--include`, `--exclude`)
+to control what is served.
+
+The server will respond to a small number of shell commands, mainly
+md5sum, sha1sum and df, which enable it to provide support for checksums
+and the about feature when accessed from an sftp remote.
+
+Note that this server uses standard 32 KiB packet payload size, which
+means you must not configure the client to expect anything else, e.g.
+with the [chunk_size](https://rclone.org/sftp/#sftp-chunk-size) option on an sftp remote.
+
+The server will log errors. Use `-v` to see access logs.
+
+`--bwlimit` will be respected for file transfers.
+Use `--stats` to control the stats printing.
+
+You must provide some means of authentication, either with
+`--user`/`--pass`, an authorized keys file (specify location with
+`--authorized-keys` - the default is the same as ssh), an
+`--auth-proxy`, or set the `--no-auth` flag for no
+authentication when logging in.
+
+If you don't supply a host `--key` then rclone will generate rsa, ecdsa
+and ed25519 variants, and cache them for later use in rclone's cache
+directory (see `rclone help flags cache-dir`) in the "serve-sftp"
+directory.
+
+By default the server binds to localhost:2022 - if you want it to be
+reachable externally then supply `--addr :2022` for example.
+
+This also supports being run with socket activation, in which case it will
+listen on the first passed FD.
+It can be configured with .socket and .service unit files as described in
+.
+
+Socket activation can be tested ad-hoc with the `systemd-socket-activate`command:
+
+```console
+systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
+```
+
+This will socket-activate rclone on the first connection to port 2222 over TCP.
+
+Note that the default of `--vfs-cache-mode off` is fine for the rclone
+sftp backend, but it may not be with other SFTP clients.
+
+If `--stdio` is specified, rclone will serve SFTP over stdio, which can
+be used with sshd via ~/.ssh/authorized_keys, for example:
+
+```text
+restrict,command="rclone serve sftp --stdio ./photos" ssh-rsa ...
+```
+
+On the client you need to set `--transfers 1` when using `--stdio`.
+Otherwise multiple instances of the rclone server are started by OpenSSH
+which can lead to "corrupted on transfer" errors. This is the case because
+the client chooses indiscriminately which server to send commands to while
+the servers all have different views of the state of the filing system.
+
+The "restrict" in authorized_keys prevents SHA1SUMs and MD5SUMs from being
+used. Omitting "restrict" and using `--sftp-path-override` to enable
+checksumming is possible but less secure and you could use the SFTP server
+provided by OpenSSH in this case.
+
+## VFS - Virtual File System
+
+This command uses the VFS layer. This adapts the cloud storage objects
+that rclone uses into something which looks much more like a disk
+filing system.
+
+Cloud storage objects have lots of properties which aren't like disk
+files - you can't extend them or write to the middle of them, so the
+VFS layer has to deal with that. Because there is no one right way of
+doing this there are various options explained below.
+
+The VFS layer also implements a directory cache - this caches info
+about files and directories (but not the data) in memory.
+
+## VFS Directory Cache
+
+Using the `--dir-cache-time` flag, you can control how long a
+directory should be considered up to date and not refreshed from the
+backend. Changes made through the VFS will appear immediately or
+invalidate the cache.
+
+```text
+ --dir-cache-time duration Time to cache directory entries for (default 5m0s)
+ --poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
+```
+
+However, changes made directly on the cloud storage by the web
+interface or a different copy of rclone will only be picked up once
+the directory cache expires if the backend configured does not support
+polling for changes. If the backend supports polling, changes will be
+picked up within the polling interval.
+
+You can send a `SIGHUP` signal to rclone for it to flush all
+directory caches, regardless of how old they are. Assuming only one
+rclone instance is running, you can reset the cache like this:
+
+```console
+kill -SIGHUP $(pidof rclone)
+```
+
+If you configure rclone with a [remote control](/rc) then you can use
+rclone rc to flush the whole directory cache:
+
+```console
+rclone rc vfs/forget
+```
+
+Or individual files or directories:
+
+```console
+rclone rc vfs/forget file=path/to/file dir=path/to/dir
+```
+
+## VFS File Buffering
+
+The `--buffer-size` flag determines the amount of memory,
+that will be used to buffer data in advance.
+
+Each open file will try to keep the specified amount of data in memory
+at all times. The buffered data is bound to one open file and won't be
+shared.
+
+This flag is a upper limit for the used memory per open file. The
+buffer will only use memory for data that is downloaded but not
+yet read. If the buffer is empty, only a small amount of memory will
+be used.
+
+The maximum memory used by rclone for buffering can be up to
+`--buffer-size * open files`.
+
+## VFS File Caching
+
+These flags control the VFS file caching options. File caching is
+necessary to make the VFS layer appear compatible with a normal file
+system. It can be disabled at the cost of some compatibility.
+
+For example you'll need to enable VFS caching if you want to read and
+write simultaneously to a file. See below for more details.
+
+Note that the VFS cache is separate from the cache backend and you may
+find that you need one or the other or both.
+
+```text
+ --cache-dir string Directory rclone will use for caching.
+ --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
+ --vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
+ --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
+ --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
+ --vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
+ --vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
+```
+
+If run with `-vv` rclone will print the location of the file cache. The
+files are stored in the user cache file area which is OS dependent but
+can be controlled with `--cache-dir` or setting the appropriate
+environment variable.
+
+The cache has 4 different modes selected by `--vfs-cache-mode`.
+The higher the cache mode the more compatible rclone becomes at the
+cost of using disk space.
+
+Note that files are written back to the remote only when they are
+closed and if they haven't been accessed for `--vfs-write-back`
+seconds. If rclone is quit or dies with files that haven't been
+uploaded, these will be uploaded next time rclone is run with the same
+flags.
+
+If using `--vfs-cache-max-size` or `--vfs-cache-min-free-space` note
+that the cache may exceed these quotas for two reasons. Firstly
+because it is only checked every `--vfs-cache-poll-interval`. Secondly
+because open files cannot be evicted from the cache. When
+`--vfs-cache-max-size` or `--vfs-cache-min-free-space` is exceeded,
+rclone will attempt to evict the least accessed files from the cache
+first. rclone will start with files that haven't been accessed for the
+longest. This cache flushing strategy is efficient and more relevant
+files are likely to remain cached.
+
+The `--vfs-cache-max-age` will evict files from the cache
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
+1 hour will start evicting files from cache that haven't been accessed
+for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
+and will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
+
+You **should not** run two copies of rclone using the same VFS cache
+with the same or overlapping remotes if using `--vfs-cache-mode > off`.
+This can potentially cause data corruption if you do. You can work
+around this by giving each rclone its own cache hierarchy with
+`--cache-dir`. You don't need to worry about this if the remotes in
+use don't overlap.
+
+### --vfs-cache-mode off
+
+In this mode (the default) the cache will read directly from the remote and write
+directly to the remote without caching anything on disk.
+
+This will mean some operations are not possible
+
+- Files can't be opened for both read AND write
+- Files opened for write can't be seeked
+- Existing files opened for write must have O_TRUNC set
+- Files open for read with O_TRUNC will be opened write only
+- Files open for write only will behave as if O_TRUNC was supplied
+- Open modes O_APPEND, O_TRUNC are ignored
+- If an upload fails it can't be retried
+
+### --vfs-cache-mode minimal
+
+This is very similar to "off" except that files opened for read AND
+write will be buffered to disk. This means that files opened for
+write will be a lot more compatible, but uses the minimal disk space.
+
+These operations are not possible
+
+- Files opened for write only can't be seeked
+- Existing files opened for write must have O_TRUNC set
+- Files opened for write only will ignore O_APPEND, O_TRUNC
+- If an upload fails it can't be retried
+
+### --vfs-cache-mode writes
+
+In this mode files opened for read only are still read directly from
+the remote, write only and read/write files are buffered to disk
+first.
+
+This mode should support all normal file system operations.
+
+If an upload fails it will be retried at exponentially increasing
+intervals up to 1 minute.
+
+### --vfs-cache-mode full
+
+In this mode all reads and writes are buffered to and from disk. When
+data is read from the remote this is buffered to disk as well.
+
+In this mode the files in the cache will be sparse files and rclone
+will keep track of which bits of the files it has downloaded.
+
+So if an application only reads the starts of each file, then rclone
+will only buffer the start of the file. These files will appear to be
+their full size in the cache, but they will be sparse files with only
+the data that has been downloaded present in them.
+
+This mode should support all normal file system operations and is
+otherwise identical to `--vfs-cache-mode` writes.
+
+When reading a file rclone will read `--buffer-size` plus
+`--vfs-read-ahead` bytes ahead. The `--buffer-size` is buffered in memory
+whereas the `--vfs-read-ahead` is buffered on disk.
+
+When using this mode it is recommended that `--buffer-size` is not set
+too large and `--vfs-read-ahead` is set large if required.
+
+**IMPORTANT** not all file systems support sparse files. In particular
+FAT/exFAT do not. Rclone will perform very badly if the cache
+directory is on a filesystem which doesn't support sparse files and it
+will log an ERROR message if one is detected.
+
+### Fingerprinting
+
+Various parts of the VFS use fingerprinting to see if a local file
+copy has changed relative to a remote file. Fingerprints are made
+from:
+
+- size
+- modification time
+- hash
+
+where available on an object.
+
+On some backends some of these attributes are slow to read (they take
+an extra API call per object, or extra work per object).
+
+For example `hash` is slow with the `local` and `sftp` backends as
+they have to read the entire file and hash it, and `modtime` is slow
+with the `s3`, `swift`, `ftp` and `qinqstor` backends because they
+need to do an extra API call to fetch it.
+
+If you use the `--vfs-fast-fingerprint` flag then rclone will not
+include the slow operations in the fingerprint. This makes the
+fingerprinting less accurate but much faster and will improve the
+opening time of cached files.
+
+If you are running a vfs cache over `local`, `s3` or `swift` backends
+then using this flag is recommended.
+
+Note that if you change the value of this flag, the fingerprints of
+the files in the cache may be invalidated and the files will need to
+be downloaded again.
+
+## VFS Chunked Reading
+
+When rclone reads files from a remote it reads them in chunks. This
+means that rather than requesting the whole file rclone reads the
+chunk specified. This can reduce the used download quota for some
+remotes by requesting only chunks from the remote that are actually
+read, at the cost of an increased number of requests.
+
+These flags control the chunking:
+
+```text
+ --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
+ --vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
+ --vfs-read-chunk-streams int The number of parallel streams to read at once
+```
+
+The chunking behaves differently depending on the `--vfs-read-chunk-streams` parameter.
+
+### `--vfs-read-chunk-streams` == 0
+
+Rclone will start reading a chunk of size `--vfs-read-chunk-size`,
+and then double the size for each read. When `--vfs-read-chunk-size-limit` is
+specified, and greater than `--vfs-read-chunk-size`, the chunk size for each
+open file will get doubled only until the specified value is reached. If the
+value is "off", which is the default, the limit is disabled and the chunk size
+will grow indefinitely.
+
+With `--vfs-read-chunk-size 100M` and `--vfs-read-chunk-size-limit 0`
+the following parts will be downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M
+and so on. When `--vfs-read-chunk-size-limit 500M` is specified, the result would
+be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so on.
+
+Setting `--vfs-read-chunk-size` to `0` or "off" disables chunked reading.
+
+The chunks will not be buffered in memory.
+
+### `--vfs-read-chunk-streams` > 0
+
+Rclone reads `--vfs-read-chunk-streams` chunks of size
+`--vfs-read-chunk-size` concurrently. The size for each read will stay
+constant.
+
+This improves performance performance massively on high latency links
+or very high bandwidth links to high performance object stores.
+
+Some experimentation will be needed to find the optimum values of
+`--vfs-read-chunk-size` and `--vfs-read-chunk-streams` as these will
+depend on the backend in use and the latency to the backend.
+
+For high performance object stores (eg AWS S3) a reasonable place to
+start might be `--vfs-read-chunk-streams 16` and
+`--vfs-read-chunk-size 4M`. In testing with AWS S3 the performance
+scaled roughly as the `--vfs-read-chunk-streams` setting.
+
+Similar settings should work for high latency links, but depending on
+the latency they may need more `--vfs-read-chunk-streams` in order to
+get the throughput.
+
+## VFS Performance
+
+These flags may be used to enable/disable features of the VFS for
+performance or other reasons. See also the [chunked reading](#vfs-chunked-reading)
+feature.
+
+In particular S3 and Swift benefit hugely from the `--no-modtime` flag
+(or use `--use-server-modtime` for a slightly different effect) as each
+read of the modification time takes a transaction.
+
+```text
+ --no-checksum Don't compare checksums on up/download.
+ --no-modtime Don't read/write the modification time (can speed things up).
+ --no-seek Don't allow seeking in files.
+ --read-only Only allow read-only access.
+```
+
+Sometimes rclone is delivered reads or writes out of order. Rather
+than seeking rclone will wait a short time for the in sequence read or
+write to come in. These flags only come into effect when not using an
+on disk cache file.
+
+```text
+ --vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
+ --vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
+```
+
+When using VFS write caching (`--vfs-cache-mode` with value writes or full),
+the global flag `--transfers` can be set to adjust the number of parallel uploads
+of modified files from the cache (the related global flag `--checkers` has no
+effect on the VFS).
+
+```text
+ --transfers int Number of file transfers to run in parallel (default 4)
+```
+
+## Symlinks
+
+By default the VFS does not support symlinks. However this may be
+enabled with either of the following flags:
+
+```text
+ --links Translate symlinks to/from regular files with a '.rclonelink' extension.
+ --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
+```
+
+As most cloud storage systems do not support symlinks directly, rclone
+stores the symlink as a normal file with a special extension. So a
+file which appears as a symlink `link-to-file.txt` would be stored on
+cloud storage as `link-to-file.txt.rclonelink` and the contents would
+be the path to the symlink destination.
+
+Note that `--links` enables symlink translation globally in rclone -
+this includes any backend which supports the concept (for example the
+local backend). `--vfs-links` just enables it for the VFS layer.
+
+This scheme is compatible with that used by the
+[local backend with the --local-links flag](https://rclone.org/local/#symlinks-junction-points).
+
+The `--vfs-links` flag has been designed for `rclone mount`, `rclone
+nfsmount` and `rclone serve nfs`.
+
+It hasn't been tested with the other `rclone serve` commands yet.
+
+A limitation of the current implementation is that it expects the
+caller to resolve sub-symlinks. For example given this directory tree
+
+```text
+.
+├── dir
+│ └── file.txt
+└── linked-dir -> dir
+```
+
+The VFS will correctly resolve `linked-dir` but not
+`linked-dir/file.txt`. This is not a problem for the tested commands
+but may be for other commands.
+
+**Note** that there is an outstanding issue with symlink support
+[issue #8245](https://github.com/rclone/rclone/issues/8245) with duplicate
+files being created when symlinks are moved into directories where
+there is a file of the same name (or vice versa).
+
+## VFS Case Sensitivity
+
+Linux file systems are case-sensitive: two files can differ only
+by case, and the exact case must be used when opening a file.
+
+File systems in modern Windows are case-insensitive but case-preserving:
+although existing files can be opened using any case, the exact case used
+to create the file is preserved and available for programs to query.
+It is not allowed for two files in the same directory to differ only by case.
+
+Usually file systems on macOS are case-insensitive. It is possible to make macOS
+file systems case-sensitive but that is not the default.
+
+The `--vfs-case-insensitive` VFS flag controls how rclone handles these
+two cases. If its value is "false", rclone passes file names to the remote
+as-is. If the flag is "true" (or appears without a value on the
+command line), rclone may perform a "fixup" as explained below.
+
+The user may specify a file name to open/delete/rename/etc with a case
+different than what is stored on the remote. If an argument refers
+to an existing file with exactly the same name, then the case of the existing
+file on the disk will be used. However, if a file name with exactly the same
+name is not found but a name differing only by case exists, rclone will
+transparently fixup the name. This fixup happens only when an existing file
+is requested. Case sensitivity of file names created anew by rclone is
+controlled by the underlying remote.
+
+Note that case sensitivity of the operating system running rclone (the target)
+may differ from case sensitivity of a file system presented by rclone (the source).
+The flag controls whether "fixup" is performed to satisfy the target.
+
+If the flag is not provided on the command line, then its default value depends
+on the operating system where rclone runs: "true" on Windows and macOS, "false"
+otherwise. If the flag is provided without a value, then it is "true".
+
+The `--no-unicode-normalization` flag controls whether a similar "fixup" is
+performed for filenames that differ but are [canonically
+equivalent](https://en.wikipedia.org/wiki/Unicode_equivalence) with respect to
+unicode. Unicode normalization can be particularly helpful for users of macOS,
+which prefers form NFD instead of the NFC used by most other platforms. It is
+therefore highly recommended to keep the default of `false` on macOS, to avoid
+encoding compatibility issues.
+
+In the (probably unlikely) event that a directory has multiple duplicate
+filenames after applying case and unicode normalization, the `--vfs-block-norm-dupes`
+flag allows hiding these duplicates. This comes with a performance tradeoff, as
+rclone will have to scan the entire directory for duplicates when listing a
+directory. For this reason, it is recommended to leave this disabled if not
+needed. However, macOS users may wish to consider using it, as otherwise, if a
+remote directory contains both NFC and NFD versions of the same filename, an odd
+situation will occur: both versions of the file will be visible in the mount,
+and both will appear to be editable, however, editing either version will
+actually result in only the NFD version getting edited under the hood. `--vfs-block-
+norm-dupes` prevents this confusion by detecting this scenario, hiding the
+duplicates, and logging an error, similar to how this is handled in `rclone
+sync`.
+
+## VFS Disk Options
+
+This flag allows you to manually set the statistics about the filing system.
+It can be useful when those statistics cannot be read correctly automatically.
+
+```text
+ --vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
+```
+
+## Alternate report of used bytes
+
+Some backends, most notably S3, do not report the amount of bytes used.
+If you need this information to be available when running `df` on the
+filesystem, then pass the flag `--vfs-used-is-size` to rclone.
+With this flag set, instead of relying on the backend to report this
+information, rclone will scan the whole remote similar to `rclone size`
+and compute the total used space itself.
+
+**WARNING**: Contrary to `rclone size`, this flag ignores filters so that the
+result is accurate. However, this is very inefficient and may cost lots of API
+calls resulting in extra charges. Use it as a last resort and only with caching.
+
+## VFS Metadata
+
+If you use the `--vfs-metadata-extension` flag you can get the VFS to
+expose files which contain the [metadata](https://rclone.org/docs/#metadata) as a JSON
+blob. These files will not appear in the directory listing, but can be
+`stat`-ed and opened and once they have been they **will** appear in
+directory listings until the directory cache expires.
+
+Note that some backends won't create metadata unless you pass in the
+`--metadata` flag.
+
+For example, using `rclone mount` with `--metadata --vfs-metadata-extension .metadata`
+we get
+
+```console
+$ ls -l /mnt/
+total 1048577
+-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
+
+$ cat /mnt/1G.metadata
+{
+ "atime": "2025-03-04T17:34:22.317069787Z",
+ "btime": "2025-03-03T16:03:37.708253808Z",
+ "gid": "1000",
+ "mode": "100664",
+ "mtime": "2025-03-03T16:03:39.640238323Z",
+ "uid": "1000"
+}
+
+$ ls -l /mnt/
+total 1048578
+-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
+-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
+```
+
+If the file has no metadata it will be returned as `{}` and if there
+is an error reading the metadata the error will be returned as
+`{"error":"error string"}`.
+
+## Auth Proxy
+
+If you supply the parameter `--auth-proxy /path/to/program` then
+rclone will use that program to generate backends on the fly which
+then are used to authenticate incoming requests. This uses a simple
+JSON based protocol with input on STDIN and output on STDOUT.
+
+**PLEASE NOTE:** `--auth-proxy` and `--authorized-keys` cannot be used
+together, if `--auth-proxy` is set the authorized keys option will be
+ignored.
+
+There is an example program
+[bin/test_proxy.py](https://github.com/rclone/rclone/blob/master/bin/test_proxy.py)
+in the rclone source code.
+
+The program's job is to take a `user` and `pass` on the input and turn
+those into the config for a backend on STDOUT in JSON format. This
+config will have any default parameters for the backend added, but it
+won't use configuration from environment variables or command line
+options - it is the job of the proxy program to make a complete
+config.
+
+This config generated must have this extra parameter
+
+- `_root` - root to use for the backend
+
+And it may have these parameters
+
+- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
+
+If password authentication was used by the client, input to the proxy
+process (on STDIN) would look similar to this:
+
+```json
+{
+ "user": "me",
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+}
+```
+
+If public-key authentication was used by the client, input to the
+proxy process (on STDIN) would look similar to this:
+
+```json
+{
+ "user": "me",
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+}
+```
+
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
+And as an example return this on STDOUT
+
+```json
+{
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+}
+```
+
+This would mean that an SFTP backend would be created on the fly for
+the `user` and `pass`/`public_key` returned in the output to the host given. Note
+that since `_obscure` is set to `pass`, rclone will obscure the `pass`
+parameter before creating the backend (which is required for sftp
+backends).
+
+The program can manipulate the supplied `user` in any way, for example
+to make proxy to many different sftp backends, you could make the
+`user` be `user@example.com` and then set the `host` to `example.com`
+in the output and the user to `user`. For security you'd probably want
+to restrict the `host` to a limited list.
+
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
@@ -16246,7 +16647,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -16301,7 +16702,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -16698,9 +17100,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -16708,7 +17111,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -16718,10 +17122,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -16747,11 +17185,12 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
@@ -18309,7 +18748,8 @@ will use this much memory for buffering.
When using `mount` or `cmount` each open file descriptor will use this much
memory for buffering.
-See the [mount](https://rclone.org/commands/rclone_mount/#file-buffering) documentation for more details.
+See the [mount](https://rclone.org/commands/rclone_mount/#vfs-file-buffering) documentation for
+more details.
Set to `0` to disable the buffering for the minimum memory usage.
@@ -19526,7 +19966,7 @@ Most multi-thread transfers do not take additional memory, but some do
at maximum `--transfers` \* `--multi-thread-chunk-size` \*
`--multi-thread-streams` or specifically for the s3 backend
`--transfers` \* `--s3-chunk-size` \* `--s3-concurrency`. However you
-can use the the [--max-buffer-memory](https://rclone.org/docs/#max-buffer-memory) flag
+can use the [--max-buffer-memory](https://rclone.org/docs/#max-buffer-memory) flag
to control the maximum memory used here.
**NB** that this **only** works with supported backends as the
@@ -25603,7 +26043,7 @@ Flags for general networking and HTTP stuff.
--tpslimit float Limit HTTP transactions per second to this
--tpslimit-burst int Max burst of transactions for --tpslimit (default 1)
--use-cookies Enable session cookiejar
- --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.0")
+ --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.1")
```
@@ -28416,11 +28856,12 @@ The following backends have known issues that need more investigation:
- [`TestBisyncRemoteLocal/normalization`](https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)
- [`TestBisyncLocalRemote/ext_paths`](https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)
- [`TestBisyncLocalRemote/extended_filenames`](https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)
- - [4 more](https://pub.rclone.org/integration-tests/current/)
+ - [3 more](https://pub.rclone.org/integration-tests/current/)
- `TestPcloud` (`pcloud`)
- - [`TestBisyncRemoteRemote/check_access`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
- - [`TestBisyncRemoteRemote/rmdirs`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
-- Updated: 2026-07-31-010017
+ - [`TestBisyncRemoteLocal/createemptysrcdirs`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+ - [`TestBisyncLocalRemote/resolve`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+ - [`TestBisyncRemoteRemote/createemptysrcdirs`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+- Updated: 2026-09-04-010006
The following backends either have not been tested recently or have known issues
@@ -29318,7 +29759,7 @@ and far less prone to critical errors / undetected changes
- Bisync is now capable of rolling a file listing back in cases of uncertainty,
essentially marking the file as needing to be rechecked next time.
- A few basic terminal colors are now supported, controllable with
-[`--color`](https://rclone.org/docs/#color) (`AUTO`|`NEVER`|`ALWAYS`)
+[`--color`](https://rclone.org/docs/#color-autoneveralways) (`AUTO`|`NEVER`|`ALWAYS`)
- Initial listing snapshots of Path1 and Path2 are now generated concurrently,
using the same "march" infrastructure as `check` and `sync`,
for performance improvements and less
@@ -29348,7 +29789,7 @@ behavior with new [`--conflict-resolve`](#conflict-resolve),
[`--conflict-suffix`](#conflict-suffix) flags.
- A new [`--resync-mode`](#resync-mode) flag allows more control over which
version of a file gets kept during a `--resync`.
-- Bisync now supports [`--retries`](https://rclone.org/docs/#retries-int) and [`--retries-sleep`](/docs/#retries-sleep-time)
+- Bisync now supports [`--retries`](https://rclone.org/docs/#retries-int) and [`--retries-sleep`](/docs/#retries-sleep-duration)
(when [`--resilient`](#resilient) is set.)
### `v1.64`
@@ -32177,38 +32618,47 @@ Properties:
- "br-ne1.magaluobjects.com"
- Fortaleza, CE (BR), br-ne1
- Provider: Magalu
- - "s3.eu-amsterdam.megas4.com"
- - Mega S4 Amsterdam
+ - "s3.eu-luxembourg-1.megas4.com"
+ - Mega S4 Luxembourg 1
- Provider: Mega
- - "s3.eu-luxembourg.megas4.com"
- - Mega S4 Luxembourg
+ - "s3.eu-luxembourg-2.megas4.com"
+ - Mega S4 Luxembourg 2
- Provider: Mega
- - "s3.eu-paris.megas4.com"
- - Mega S4 Paris
+ - "s3.eu-amsterdam-1.megas4.com"
+ - Mega S4 Amsterdam 1
- Provider: Mega
- - "s3.eu-barcelona.megas4.com"
- - Mega S4 Barcelona
+ - "s3.eu-amsterdam-2.megas4.com"
+ - Mega S4 Amsterdam 2
- Provider: Mega
- - "s3.ca-montreal.megas4.com"
- - Mega S4 Montreal
+ - "s3.eu-paris-1.megas4.com"
+ - Mega S4 Paris 1
- Provider: Mega
- - "s3.ca-vancouver.megas4.com"
- - Mega S4 Vancouver
+ - "s3.eu-paris-2.megas4.com"
+ - Mega S4 Paris 2
- Provider: Mega
- - "s3.ap-tokyo.megas4.com"
- - Mega S4 Tokyo
+ - "s3.eu-barcelona-1.megas4.com"
+ - Mega S4 Barcelona 1
- Provider: Mega
- - "s3.eu-central-1.s4.mega.io"
- - Mega S4 eu-central-1 (Amsterdam, legacy)
+ - "s3.eu-barcelona-2.megas4.com"
+ - Mega S4 Barcelona 2
- Provider: Mega
- - "s3.eu-central-2.s4.mega.io"
- - Mega S4 eu-central-2 (Bettembourg, legacy)
+ - "s3.ca-montreal-1.megas4.com"
+ - Mega S4 Montreal 1
- Provider: Mega
- - "s3.ca-central-1.s4.mega.io"
- - Mega S4 ca-central-1 (Montreal, legacy)
+ - "s3.ca-montreal-2.megas4.com"
+ - Mega S4 Montreal 2
- Provider: Mega
- - "s3.ca-west-1.s4.mega.io"
- - Mega S4 ca-west-1 (Vancouver, legacy)
+ - "s3.ca-vancouver-1.megas4.com"
+ - Mega S4 Vancouver 1
+ - Provider: Mega
+ - "s3.ca-vancouver-2.megas4.com"
+ - Mega S4 Vancouver 2
+ - Provider: Mega
+ - "s3.ap-tokyo-1.megas4.com"
+ - Mega S4 Tokyo 1
+ - Provider: Mega
+ - "s3.ap-tokyo-2.megas4.com"
+ - Mega S4 Tokyo 2
- Provider: Mega
- "oos.eu-west-2.outscale.com"
- Outscale EU West 2 (Paris)
@@ -34725,15 +35175,15 @@ section above.
From rclone v1.69 [Directory Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html)
are supported.
-You will need to set the `directory_buckets = true` config parameter
-or use `--s3-directory-buckets`.
+You will need to set the `directory_bucket = true` config parameter
+or use `--s3-directory-bucket`.
Note that rclone cannot yet:
- Create directory buckets
- List directory buckets
-See [the --s3-directory-buckets flag](#s3-directory-buckets) for more info
+See [the --s3-directory-bucket flag](#s3-directory-bucket) for more info
### AWS Snowball Edge
@@ -44801,6 +45251,15 @@ This means that
- filenames with the same name will encrypt the same
- filenames which start the same won't have a common prefix
+A version string of the form `-vYYYY-MM-DD-HHMMSS-NNN` on the end of a
+file name (as added by `--b2-versions` / `--s3-versions`) is left in
+plain text so that versioned files can be found. Directory names are
+encrypted in full. Rclone before v1.76 left such a suffix in plain
+text on directory names too, so a directory named like this created by
+an older rclone will appear in listings with a warning but can't be
+opened or removed until renamed on the underlying remote to the name
+given in the warning.
+
This uses a 32 byte key (256 bits) and a 16 byte (128 bits) IV both of
which are derived from the user password.
@@ -51174,7 +51633,7 @@ including
You should now see the three scopes on your Data access page. Now press save
at the bottom!
-6. After adding scopes, click Audience
+6. After adding scopes, click Audience.
Scroll down and click "+ Add users". Add yourself as a test user and press save.
7. Go to Overview on the left panel, click "Create OAuth client". Choose
@@ -53553,7 +54012,7 @@ path is resolved from the root of the domain.
If the path following the `remote:` ends with `/` it will be assumed to point
to a directory. If the path does not end with `/`, then a HEAD request is sent
-and the response used to decide if it it is treated as a file or a directory
+and the response used to decide if it is treated as a file or a directory
(run with `-vv` to see details). When [--http-no-head](#http-no-head) is
specified, a path without ending `/` is always assumed to be a file. If rclone
incorrectly assumes the path is a file, the solution is to specify the path with
@@ -53739,6 +54198,12 @@ For example, to set a Cookie use 'Cookie,name=value', or '"Cookie","name=value"'
You can set multiple headers, e.g. '"Cookie","name=value","Authorization","xxx"'.
+The headers are only sent to the host in the configured URL. If the
+server redirects to another host (including a subdomain or a different
+port) the headers are not sent to it, or to any further hop in that
+redirect chain. When headers are set, a redirect from https to http is
+refused as it would send them in cleartext.
+
Properties:
- Config: headers
@@ -62510,7 +62975,7 @@ Before you can use rclone with Sia, you will need to have a running copy of
network (e.g. a NAS). Please follow the [Get started](https://sia.tech/get-started)
guide and install one.
-rclone interacts with Sia network by talking to the Sia daemon via [HTTP API](https://sia.tech/docs/)
+rclone interacts with Sia network by talking to the Sia daemon via [HTTP API](https://docs.sia.tech/)
which is usually available on port *9980*. By default you will run the daemon
locally on the same computer so it's safe to leave the API password blank
(the API URL will be `http://127.0.0.1:9980` making external access impossible).
@@ -63414,7 +63879,7 @@ Request" error rather than a more sensible error when the
authentication fails for Swift.
So this most likely means your username / password is wrong. You can
-investigate further with the `--dump-bodies` flag.
+investigate further with the `--dump bodies` flag.
This may also be caused by specifying the region when you shouldn't
have (e.g. OVH).
@@ -66386,7 +66851,7 @@ correct, and support all features.
The shell type auto-detection logic, described above, means that
by default rclone will try to run a shell command the first time
a new sftp remote is accessed. If you configure a sftp remote
-without a config file, e.g. an [on the fly](https://rclone.org/docs/#backend-path-to-dir])
+without a config file, e.g. an [on the fly](https://rclone.org/docs/#backend-path-to-dir)
remote, rclone will have nowhere to store the result, and it
will re-run the command on every access. To avoid this you should
explicitly set the `shell_type` option to the correct value,
@@ -67386,7 +67851,7 @@ SFTP isn't supported under plan9 until [this
issue](https://github.com/pkg/sftp/issues/156) is fixed.
Note that since SFTP isn't HTTP based the following flags don't work
-with it: `--dump-headers`, `--dump-bodies`, `--dump-auth`.
+with it: `--dump headers`, `--dump bodies`, `--dump auth`.
Note that `--timeout` and `--contimeout` are both supported.
@@ -68074,7 +68539,7 @@ Side by side comparison with more details:
To make a new Storj configuration you need one of the following:
- Access Grant that someone else shared with you.
-- [API Key](https://documentation.storj.io/getting-started/uploading-your-first-object/create-an-api-key)
+- [API Key](https://storj.dev/learn/concepts/access/access-grants/api-key)
of a Storj project you are a member of.
Here is an example of how to make a remote called `remote`. First run:
@@ -69482,7 +69947,9 @@ Likewise plain WebDAV does not support hashes, however when used with
Fastmail Files, ownCloud or Nextcloud rclone will support SHA1 and MD5 hashes.
Depending on the exact version of ownCloud or Nextcloud hashes may
appear on all objects, or only on objects which had a hash uploaded
-with them.
+with them. With Nextcloud, rclone asks the server to calculate the SHA1
+of uploads which had no hash to send, such as streamed uploads, and
+after setting the modification time, which discards the stored hash.
### Standard options
@@ -71482,6 +71949,149 @@ Options:
# Changelog
+## v1.75.1 - 2026-09-04
+
+[See commits](https://github.com/rclone/rclone/compare/v1.75.0...v1.75.1)
+
+- Security
+ - archive
+ - Fix zip slip path traversal in untrusted zip files GHSA-66hp-wgxq-6f5q CVE-PENDING (Nick Craig-Wood)
+ - Hide any archive entry which escapes the directory being listed GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Reject unsafe entry names when mounting squashfs images GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix zip subdirectory root matching sibling directories GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix zip entry named "." hiding every other file GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix "directory not found" for archive paths containing "./" or "//" GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - build
+ - Fix multiple CVEs by upgrading to go1.26.6 (Nick Craig-Wood)
+ - CVE-2026-56860: net/url: quadratic complexity in resolvePath
+ - CVE-2026-56858: html/template: JavaScript regexp context tracking
+ - CVE-2026-56862: crypto/tls: limit handshake messages accepted post-handshake
+ - CVE-2026-56853: net/http: apply ReadHeaderTimeout to unencrypted HTTP/2 check
+ - CVE-2026-56859: encoding/xml: recursion depth guard during decode
+ - CVE-2026-33818: encoding/asn1: enforce maximum recursion depth
+ - CVE-2026-46600: net: panic parsing an invalid SVCB or HTTPS RR in dnsmessage
+ - CVE-2026-39821: net/http: reject ASCII-only Punycode-encoded labels in idna
+ - Update golang.org/x/crypto to v0.56.0 to fix multiple CVEs (Nick Craig-Wood)
+ - CVE-2026-56854: ssh: source-address critical option not enforced for non-public-key auth callbacks
+ - CVE-2026-78662: ssh: a malicious peer could flood an undecided channel's incoming requests, deadlocking the connection
+ - CVE-2026-56855: ssh: a malicious peer could send crafted messages on an established channel, deadlocking the connection
+ - Update golang.org/x/image to v0.45.0 to fix CVE-2026-46603 (Nick Craig-Wood)
+ - CVE-2026-46603: excessive memory allocation during VP8L decoding
+ - fs: Confine directory listing entries that escape the root GHSA-3vxh-3pcx-9m8q GHSA-38xv-hf3p-h7mq CVE-PENDING (Nick Craig-Wood)
+ - fshttp: Don't send `--header` values to other hosts on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - http: Don't leak configured headers to other hosts or over plaintext on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - lib/rest: Check HTTPS downgrades against the original request on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - local
+ - Fix dir metadata escaping the root through a planted symlink GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+ - Fix btime escaping the root via a planted symlink GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+ - Fix panic on Range request past the end of a symlink GHSA-p6m2-r3w9-mpxw CVE-PENDING (Nick Craig-Wood)
+ - serve docker
+ - Reject volume names that escape the base directory GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - Reject volume names resolving to the base directory itself GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - Re-derive volume mountpoint from name when restoring state GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - serve ftp: Fix auth-proxy sessions sharing credentials by username GHSA-c476-6w5q-jw77 CVE-PENDING (Nick Craig-Wood)
+ - serve s3
+ - Fix memory exhaustion from client-declared multipart part size GHSA-2p48-j3qc-rx9f CVE-PENDING (Nick Craig-Wood)
+ - Reject bogus multipart part sizes in the reorder buffer GHSA-2p48-j3qc-rx9f (Nick Craig-Wood)
+ - Fix auth proxy accepting any request signed with an empty secret GHSA-xwwr-4h3p-r22c CVE-PENDING (Nick Craig-Wood)
+ - **NB** the auth proxy protocol for `serve s3` has changed - the proxy program is now given the access key ID as `user` and must return the secret as `_secret_access_key`
+ - Fix each server accepting the `--auth-key` credentials of all the others (Nick Craig-Wood)
+ - Fix misleading anonymous access log when using an auth proxy via rc GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+ - serve sftp: Fix auth proxy configured via rc being silently ignored GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+- Bug Fixes
+ - accounting
+ - Fix memory leak on long-running rcd (nielash)
+ - Fix memory leak from stats groups on long-running rcd (nielash)
+ - Fix bwlimit burst overflow (Rayan Salhab)
+ - bisync
+ - Fix memory leak when running via the rc (nielash)
+ - Fix failed transfers of empty files being recorded as synced (Nick Craig-Wood)
+ - build: Make go1.26 the minimum required version as needed by golang.org/x/crypto v0.56.0 (Nick Craig-Wood)
+ - config: Redact env var config values in logs (Pastalikek65)
+ - doc fixes (Anton Karpov, CAOShurong, Dean Chen, Nick Craig-Wood, Recoordinate, Rodrigo Rodrigues, Shantanav Mukherjee, shaurya)
+ - lib/batcher: Prevent commits racing shutdown (Loi Nguyen)
+ - lib/transform: Fix panic in `truncate_keep_extension` (VXNCXNX)
+ - multipart: Fix chunked uploads storing truncated objects when the source ends early (Nick Craig-Wood)
+ - operations: Fix silent truncation of streaming uploads whose source ends early (Nick Craig-Wood)
+ - serve
+ - Fix VFS instance leaks on server startup failures and shutdown (Hakan İSMAİL)
+ - Pass the client IP address to the auth proxy (am-at-enrollvb)
+ - serve http: Prevent scrolling to the top on page reload (Sune Mølgaard)
+ - serve nfs: Fix EIO when creating symlinks with `--vfs-links` (SillyZir)
+ - serve s3
+ - Fix failed uploads deleting or corrupting the object at the key (Nick Craig-Wood)
+ - Fix crash when a multipart upload is aborted while a part is uploading (Nick Craig-Wood)
+ - Fix modtime not being set when only mtime metadata is supplied on PUT (Nick Craig-Wood)
+ - Upload all multipart uploads via the VFS so they obey `--bwlimit` and show in stats (Nick Craig-Wood)
+ - Reserve the `.rclone_temp_` prefix for temporary objects (Nick Craig-Wood)
+ - Clean up abandoned multipart uploads after `--multipart-expiry` (Nick Craig-Wood)
+ - vfscache
+ - Fix reader deadlock when the item size drops below the read offset (Dave)
+ - Fix log message growing without bound on repeated write errors (Vijay Misal)
+ - walk: Stop directory traversal when the context is cancelled (Rahman Yilmaz)
+- VFS
+ - Synchronize poll updates with shutdown (Loi Nguyen)
+ - Make poll shutdown lifecycle deterministic (Loi Nguyen)
+- Crypt
+ - Fix hash mismatches with `no_data_encryption` on backends which check upload hashes (Nick Craig-Wood)
+ - Fix directory names which look like versioned file names (TowyTowy)
+ - Warn about directories with legacy version-like encrypted names (Nick Craig-Wood)
+- Azure Blob
+ - Fix Entra ID server-side copy source authentication (Edward Klesel)
+ - Fix spurious vfs cache corruption errors during chunked reads (Nick Craig-Wood)
+- Azurefiles
+ - Fix zero padded files being created when the source ends early (Nick Craig-Wood)
+- Box
+ - Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
+- Compress
+ - Fix corrupted objects being created when the source ends early (Nick Craig-Wood)
+- Drive
+ - Don't list trashed files when removing a directory into the trash (alliasgher)
+- Dropbox
+ - Preserve Paper export paths on lookup (Loi Nguyen)
+ - Fix context cancellation (e.g. `--max-duration` limit) not stopping in-flight requests (debaditya)
+ - Fix chunked uploads of truncated files never finishing (Nick Craig-Wood)
+ - Don't retry chunked upload requests when the upload has been cancelled (Nick Craig-Wood)
+ - Decode received shared-file names (Sanjay Kanth A)
+ - Fix ChangeNotify when the root's case differs from Dropbox's (Loi Nguyen)
+- Filelu
+ - Fix truncated files being uploaded successfully when the source ends early (Nick Craig-Wood)
+ - Fix duplicate root path during multipart folder creation (kingston125)
+- Huaweidrive
+ - Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
+- Iclouddrive
+ - Fix uploads into an app container failing with 412 (Christian De Santis)
+- Internetarchive
+ - Fix corrupted files being created when the source ends early (Nick Craig-Wood)
+- Internxt
+ - Persist rotated token returned by the user info call (0rangeSeaW0lf)
+- Onedrive
+ - Fix 403 Forbidden for configuration personal onedrive (machsix)
+ - Fall back to manual drive ID entry when drive listing fails (SillyZir)
+ - Don't retry multipart upload chunk on 404 (upload session not found) (water)
+- Overview
+ - Fix "internal error: no overview data found" on 32 bit architectures (Nick Craig-Wood)
+- Pikpak
+ - Fix truncated files being created when the source ends early (Nick Craig-Wood)
+ - Fix truncated single part uploads reported as ok when source ends early (Nick Craig-Wood)
+- Protondrive
+ - Fix files uploaded with v1.75.0 not being readable in the Proton apps (Nick Craig-Wood)
+ - Fix corrupted uploads after a retried upload error (Nick Craig-Wood)
+- Quatrix
+ - Fix chunk upload retries and fix memory leak (Nick Craig-Wood)
+- S3
+ - Update Mega endpoints (Nick Craig-Wood)
+ - Treat UploadPart success without ETag as retryable error (CAOShurong)
+ - Fix server side copy failing with `--s3-no-head-object` (Anatoly Tarnavsky)
+- Sia
+ - Fix corrupted files being created when the source ends early (Nick Craig-Wood)
+- Smb
+ - Reuse the upload connection for SetModTime (alliasgher)
+- WebDAV
+ - Fix SetModTime failing and hashes missing on Nextcloud (Nick Craig-Wood)
+- Yandex
+ - Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
+
## v1.75.0 - 2026-07-31
[See commits](https://github.com/rclone/rclone/compare/v1.74.0...v1.75.0)
@@ -71490,11 +72100,11 @@ Options:
- [Scality](https://rclone.org/s3/#scality) (RING / ARTESCA)
- [Zero Services](https://rclone.org/s3/#zero-z3) (ZERO-Z3)
- Security
- - archive: Don't crash on malformed squashfs images GHSA-6jcg-q3wp-x2f4 CVE-PENDING (Nick Craig-Wood)
- - ftp: Fix ftp command injection when encoding doesn't include CRLF GHSA-8c48-q9wj-3w37 CVE-PENDING (Nick Craig-Wood)
+ - archive: Don't crash on malformed squashfs images GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
+ - ftp: Fix ftp command injection when encoding doesn't include CRLF GHSA-8c48-q9wj-3w37 CVE-2026-71311 (Nick Craig-Wood)
- lib/http: Use TLS on all `--addr` listeners when `--cert` and `--key` are set GHSA-mfvx-7rcj-9m5g (Nick Craig-Wood)
- - lib/proxy: Fix unbounded HTTP CONNECT headers causing OOM GHSA-xhf4-832v-7xcr CVE-PENDING (Nick Craig-Wood)
- - local: Stop source file names escaping the destination directory GHSA-7p4m-qxvv-g567 CVE-PENDING (Nick Craig-Wood)
+ - lib/proxy: Fix unbounded HTTP CONNECT headers causing OOM GHSA-xhf4-832v-7xcr CVE-2026-71310 (Nick Craig-Wood)
+ - local: Stop source file names escaping the destination directory GHSA-7p4m-qxvv-g567 CVE-2026-71313 (Nick Craig-Wood)
- rc
- Don't expose pprof debug handlers on an unauthenticated server GHSA-mfvx-7rcj-9m5g CVE-PENDING (Nick Craig-Wood)
- Require authentication to list the remotes with `--rc-serve` GHSA-mfvx-7rcj-9m5g (Nick Craig-Wood)
@@ -71503,9 +72113,9 @@ Options:
- Fix redirect credential leaks, reject HTTPS->HTTP and strip secrets GHSA-8mxv-9xhp-86h4 (Nick Craig-Wood)
- Strip S3 Express session token on cross-host redirects GHSA-8mxv-9xhp-86h4 (Nick Craig-Wood)
- serve ftp: Use constant time comparison for password check GHSA-mfvx-7rcj-9m5g (Nick Craig-Wood)
- - serve restic: Fix path traversal above the served directory GHSA-45pq-889g-fcgh CVE-PENDING (Nick Craig-Wood)
+ - serve restic: Fix path traversal above the served directory GHSA-45pq-889g-fcgh CVE-2026-71309 (Nick Craig-Wood)
- serve sftp: Don't crash the whole server on a bad request GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- - sftp: Fix command injection via crafted filenames on PowerShell remotes GHSA-2m8m-jhrm-w6j2 CVE-PENDING (Nick Craig-Wood)
+ - sftp: Fix command injection via crafted filenames on PowerShell remotes GHSA-2m8m-jhrm-w6j2 CVE-2026-71312 (Nick Craig-Wood)
- vfs: Don't crash the process if a backend panics on a background goroutine GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- webdav
- Fix HTTPS to HTTP redirects leaking credentials GHSA-h4mf-4v27-hggj (Nick Craig-Wood)
diff --git a/MANUAL.txt b/MANUAL.txt
index 784a34a88..8f1a6d5ad 100644
--- a/MANUAL.txt
+++ b/MANUAL.txt
@@ -1,6 +1,6 @@
rclone(1) User Manual
Nick Craig-Wood
-Jul 31, 2026
+Sep 04, 2026
NAME
@@ -632,7 +632,7 @@ developers so it may be out of date. Its current version is as below.
Source installation
-Make sure you have git and Go installed. Go version 1.25 or newer is
+Make sure you have git and Go installed. Go version 1.26 or newer is
required, the latest release is recommended. You can get it from your
package manager, or download it from golang.org/dl. Then you can run the
following:
@@ -4683,10 +4683,10 @@ Examples:
// Output: stories/The Quick Brown Fox!.txt
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{YYYYMMDD}"
- // Output: stories/The Quick Brown Fox!-20260731
+ // Output: stories/The Quick Brown Fox!-20260904
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{macfriendlytime}"
- // Output: stories/The Quick Brown Fox!-2026-07-31 0340PM
+ // Output: stories/The Quick Brown Fox!-2026-09-04 0450PM
rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,regex=[\\.\\w]/ab"
// Output: ababababababab/ababab ababababab ababababab ababab!abababab
@@ -6388,6 +6388,11 @@ macOS. For details, see vfs-case-sensitivity.
NFS mount
+For macOS (and other platforms where this path is supported), prefer the
+dedicated rclone nfsmount command. It starts the NFS server and performs
+the mount for you. rclone mount itself still uses FUSE (macFUSE/FUSE-T)
+and does not switch to NFS via a flag.
+
This method spins up an NFS server using serve nfs command and mounts it
to the specified mountpoint. If you run this in background mode using
|--daemon|, you will need to send SIGTERM signal to the rclone process
@@ -6704,8 +6709,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -6754,11 +6759,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -7796,6 +7802,11 @@ macOS. For details, see vfs-case-sensitivity.
NFS mount
+For macOS (and other platforms where this path is supported), prefer the
+dedicated rclone nfsmount command. It starts the NFS server and performs
+the mount for you. rclone mount itself still uses FUSE (macFUSE/FUSE-T)
+and does not switch to NFS via a flag.
+
This method spins up an NFS server using serve nfs command and mounts it
to the specified mountpoint. If you run this in background mode using
|--daemon|, you will need to send SIGTERM signal to the rclone process
@@ -8112,8 +8123,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -8162,11 +8173,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -9314,8 +9326,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -9364,11 +9376,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -9953,8 +9966,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -10003,11 +10016,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -10544,8 +10558,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -10594,11 +10608,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -10973,16 +10988,18 @@ This config generated must have this extra parameter
- _root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- _obscure - comma separated strings for parameters to obscure
+- _secret_access_key - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
If public-key authentication was used by the client, input to the proxy
@@ -10990,9 +11007,41 @@ process (on STDIN) would look similar to this:
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
+If the client authenticated with an S3 access key (rclone serve s3), the
+client never sends its secret, only a signature made with it, so the
+input contains just the access key ID as the user with no pass or
+public_key:
+
+ {
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+ }
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the proxy
+program is the source of truth for both the credentials and the backend
+they map to. If the program does not return _secret_access_key or
+returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but is
+checked with the program again after 5 minutes even if the access key ID
+is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+
+The client_ip key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
{
@@ -11016,11 +11065,12 @@ user@example.com and then set the host to example.com in the output and
the user to user. For security you'd probably want to restrict the host
to a limited list.
-An internal cache of backends is keyed on the user and a hash of the
-pass or public_key. This means that if a user's password or public-key
-changes, or the proxy returns different config parameters (eg a rotated
-api_key), a fresh backend will be created on the next request rather
-than the cached one being reused.
+An internal cache of backends is keyed on the user, a hash of the pass
+or public_key, and the client_ip. This means that if a user's password
+or public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated api_key), a
+fresh backend will be created on the next request rather than the cached
+one being reused.
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -11380,8 +11430,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -11430,11 +11480,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -11809,16 +11860,18 @@ This config generated must have this extra parameter
- _root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- _obscure - comma separated strings for parameters to obscure
+- _secret_access_key - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
If public-key authentication was used by the client, input to the proxy
@@ -11826,9 +11879,41 @@ process (on STDIN) would look similar to this:
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
+If the client authenticated with an S3 access key (rclone serve s3), the
+client never sends its secret, only a signature made with it, so the
+input contains just the access key ID as the user with no pass or
+public_key:
+
+ {
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+ }
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the proxy
+program is the source of truth for both the credentials and the backend
+they map to. If the program does not return _secret_access_key or
+returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but is
+checked with the program again after 5 minutes even if the access key ID
+is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+
+The client_ip key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
{
@@ -11852,11 +11937,12 @@ user@example.com and then set the host to example.com in the output and
the user to user. For security you'd probably want to restrict the host
to a limited list.
-An internal cache of backends is keyed on the user and a hash of the
-pass or public_key. This means that if a user's password or public-key
-changes, or the proxy returns different config parameters (eg a rotated
-api_key), a fresh backend will be created on the next request rather
-than the cached one being reused.
+An internal cache of backends is keyed on the user, a hash of the pass
+or public_key, and the client_ip. This means that if a user's password
+or public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated api_key), a
+fresh backend will be created on the next request rather than the cached
+one being reused.
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -12102,8 +12188,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -12152,11 +12238,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -12842,6 +12929,11 @@ correctly in the request. (See the AWS docs).
--auth-key can be repeated for multiple auth pairs. If --auth-key is not
provided then serve s3 will allow anonymous access.
+Alternatively --auth-proxy can be used to look up the secret for each
+access key ID and choose the backend it maps to (see Auth Proxy below).
+When an auth proxy is in use --auth-key is ignored and every request
+must be signed with the secret the proxy returns for its access key ID.
+
Like all rclone flags --auth-key can be set via environment variables,
in this case RCLONE_AUTH_KEY. Since this flag can be repeated, the input
to RCLONE_AUTH_KEY is CSV encoded. Because the accessKey,secretKey has a
@@ -12904,24 +12996,70 @@ which is defined like this:
access_key_id = ACCESS_KEY_ID
secret_access_key = SECRET_ACCESS_KEY
+Object uploads (PUT)
+
+A PutObject upload only ever changes the object at its key atomically,
+on success, a failed or interrupted PUT neither removes nor overwrites
+the object already stored at the key, and never leaves a partial object
+visible at it.
+
+Remotes that upload atomically (e.g. object stores such as s3) are
+streamed straight to the destination. On remotes where a partial upload
+would otherwise be visible (e.g. local), and whenever --vfs-cache-mode
+is writes or above, the upload is written to a temporary object that is
+renamed into place on success; these remotes need to support a
+server-side move or copy for this (nearly all do - without move or copy
+the upload is written directly and a failed PUT may leave a partial
+object at the key). If serve s3 is killed part-way through an upload the
+temporary object (named with a leading .rclone_temp_put_) may be left
+behind; it is hidden from S3 listings but must be removed manually.
+
Multipart uploads
-By default serve s3 streams each multipart upload, in part-number order,
-into a single PutStream upload to the underlying remote, so the whole
-file is never buffered in memory - memory use stays bounded by the parts
-in flight. The remote then performs its own internal upload (for example
-its own multipart upload, still with bounded memory). This works for any
-remote that supports PutStream, which is nearly all of them, including
-through crypt.
-
-The upload is atomic so the destination object only ever changes on a
+Multipart uploads are written, in part-number order, to a temporary
+object which is renamed into place, server-side, on completion, so the
+upload is atomic. The object at the key only ever changes on a
successful completion. A failed or aborted upload never affects any
-object already stored under that name. Remotes that upload atomically
-already (object stores such as s3) are streamed straight to the
-destination. On remotes where a partial upload would otherwise be
-visible (such as local), the parts are streamed to a temporary object
-that is moved into place, server-side, on completion; these remotes
-therefore also need to support a server-side move or copy.
+object already stored under that name and a partly-uploaded object never
+becomes visible under it.
+
+With the default --vfs-cache-mode off serve s3 streams each multipart
+upload, in part-number order, into a single streaming upload to the
+underlying remote, so the whole file is never buffered in memory. Memory
+use stays bounded by the parts in flight. The remote then performs its
+own internal upload (for example its own multipart upload, still with
+bounded memory). Remotes that don't support streaming uploads (those
+that must know the file size before the upload starts, such as onedrive,
+pcloud, jottacloud, mailru, opendrive, putio, protondrive and zoho) have
+the parts spooled to a temporary file on local disk instead, and
+uploaded with the size then known on completion, so they need local disk
+space for the largest objects in flight rather than memory.
+
+With --vfs-cache-mode writes (or full) the parts are written to a
+temporary file in the VFS cache and uploaded by the VFS write-back - see
+Multipart uploads and the VFS cache below.
+
+The rename into place needs the remote to support a server-side move or
+copy, which nearly all do. It is a cheap rename on most remotes, but on
+object stores without a real rename (such as s3 itself) the move is
+performed as a server-side copy and delete of the whole object, which
+can take time and API calls for large objects. Concurrent multipart
+uploads of the same key (which S3 permits) are safe. Each writes its own
+temporary object and the last to complete wins.
+
+On the few remotes that support neither server side move nor copy, the
+parts are written straight to the destination object instead and never
+buffered in memory. This is at some cost in atomicity - the incomplete
+object is visible under its final name while the upload is in flight, as
+it also is for a plain object PUT on such remotes, and concurrent
+multipart uploads of the same key write to the same object and can
+interleave. A failed or aborted upload still leaves any pre-existing
+object untouched provided the remote uploads atomically and the VFS
+cache is off; on a remote where partial uploads are visible it may leave
+partial data at the key (like a plain PUT there), and with
+--vfs-cache-mode writes (or full) a write to the cache cannot be
+abandoned, so an aborted upload's partial data is written back to the
+remote as if it had completed.
Features
@@ -12937,10 +13075,14 @@ Features
- The destination object only ever changes atomically, on completion:
an aborted or failed upload leaves any pre-existing object of the
same name untouched, and a partly-uploaded object never becomes
- visible.
-- Backend-agnostic - it only needs the remote to support PutStream
- (plus a server-side move or copy on remotes that don't upload
- atomically).
+ visible (except on the few remotes with no server-side move or copy,
+ as above).
+- Multipart uploads go through the VFS like any other upload, so they
+ show in rclone's transfer stats and obey --bwlimit.
+- Backend-agnostic - it only needs the remote to support a server-side
+ move or copy for the rename into place, which nearly all do; a
+ remote without streaming upload support spools to local disk as
+ above.
Limitations
@@ -12966,31 +13108,119 @@ Limitations
the whole upload and the client must start it again. (The remote's
own upload still retries its internal chunks.)
- Parts are serialised into one stream, so ingest from the client is
- effectively single-threaded, although the remote's own upload still
- runs concurrently.
-- On remotes that don't upload atomically (such as local), the
- completed object is moved into place with a server-side operation.
- This is a cheap rename on most such remotes. On these remotes, if
- serve s3 is killed part-way through an upload the temporary object
- (named with a leading .rclone_multipart_upload_) may be left behind;
- it is hidden from S3 listings but must be removed manually.
+ effectively single-threaded. When streaming, the remote's own upload
+ runs concurrently with the parts arriving; with the local disk spool
+ or the VFS cache the upload to the remote only starts on completion.
+- If serve s3 is killed part-way through an upload the temporary
+ object (named with a leading .rclone_temp_multipart_) may be left
+ behind; it is hidden from S3 listings but must be removed manually.
+
+Multipart uploads and the VFS cache
+
+With --vfs-cache-mode writes (or full) multipart uploads do not stream
+to the remote at all. The parts are written, in part-number order, to a
+temporary file in the VFS cache. On completion the file is renamed into
+place and uploaded by the VFS write-back, exactly like a plain object
+PUT. This needs no streaming upload support from the remote. The rename
+normally happens in the cache before the upload has started, but the VFS
+requires the remote to support a server-side move or copy to rename
+files at all (and uses one if the temporary file has already been
+written back, e.g. with --vfs-write-back 0). On remotes without either,
+the parts are written to the cache directly under the final key instead:
+the upload still never touches memory, but it loses its atomicity - the
+in-flight upload is visible at the key, and an aborted upload cannot be
+abandoned once in the cache, so its partial data is written back to the
+remote as if it were a completed object.
+
+Remotes that benefit from --vfs-cache-mode writes:
+
+- Remotes over slow or unreliable links. A failure in a streamed
+ upload aborts the whole multipart upload and the client must start
+ again from the first part; a failed write-back upload is retried by
+ the VFS (see --vfs-cache-max-age and friends) without the client
+ being involved. Ingest from the client also runs at local disk speed
+ rather than being throttled to the remote's pace.
+- Workloads that read back or overwrite what they just wrote. The
+ completed object stays in the cache, so subsequent GET/HEAD requests
+ are served locally, and plain PUTs and multipart uploads to the same
+ key go through the same cache entry so the last write wins
+ regardless of upload style.
+
+The trade-offs of the VFS cache:
+
+- The whole object lands on local disk, so the cache (--cache-dir)
+ needs space for the largest objects in flight; --vfs-cache-max-size
+ cannot evict files which are still being uploaded.
+- The 200 OK for CompleteMultipartUpload means the data is safely in
+ the local cache, not yet on the remote - the same durability the
+ cache gives plain PUTs. If an acknowledgement must mean the data has
+ reached the remote (for example WAL archiving), use the default
+ --vfs-cache-mode off.
+- The upload to the remote only starts on completion, rather than
+ overlapping with the parts arriving, so the data reaches the remote
+ later than with streaming.
+- If serve s3 is killed part-way through an upload, the temporary file
+ survives in the cache and the VFS cache recovery uploads it to the
+ remote on restart as a temporary object (named with a leading
+ .rclone_temp_multipart_); as with the streaming path, it is hidden
+ from S3 listings but must be removed manually.
+
+Cleaning up temporary objects
+
+If serve s3 is killed part-way through an upload it can leave a
+temporary object behind, named with a leading .rclone_temp_. This whole
+prefix is reserved: any object whose name (the last /-separated segment
+of its key) starts with .rclone_temp_ is hidden from S3 listings, so
+don't give real objects such names - an existing object with such a name
+disappears from listings (though it stays accessible directly by its
+key: only listings hide reserved names, GET, HEAD and DELETE of the
+exact key still work). A temporary object never holds acknowledged
+data - uploads whose temporary object survived were never confirmed to
+the client - so old ones are safe to delete:
+
+ rclone delete --min-age 24h --include ".rclone_temp_*" remote:path
+
+The --min-age protects uploads which are still in progress: make sure it
+is longer than your longest upload, especially if several serve s3
+instances share the same remote.
+
+rclone v1.75 named its temporary multipart objects
+.rclone_multipart_upload_*; leftovers from an older server are also
+hidden from listings and can be cleaned up the same way.
+
+Abandoned uploads
+
+A client which starts a multipart upload and vanishes without either
+completing or aborting it would otherwise hold on to its resources
+forever.
+
+An incomplete multipart upload which has had no activity for
+--multipart-expiry (default 24h) is therefore aborted and cleaned up,
+exactly as if the client had called AbortMultipartUpload, and a NOTICE
+is logged.
+
+An upload with a part still being received is never expired, however
+slowly the part is arriving, and each completed part restarts the clock,
+so the expiry only needs to outlast the client's pauses between parts,
+not the whole upload.
+
+Late operations on an expired upload fail with NoSuchUpload, as they do
+on real S3 when a lifecycle rule has aborted the upload. Set
+--multipart-expiry 0 to keep incomplete uploads forever.
Disabling streaming
-If you pass --disable-multipart-streaming, or the remote doesn't support
-PutStream (or doesn't upload atomically and can't move or copy
-server-side), multipart uploads are instead buffered in memory by the
-underlying S3 library: every part is held in memory and the whole object
-is written out in one go when the upload completes (the previous
-behaviour). This removes the in-order/contiguous-part restriction above,
+If you pass --disable-multipart-streaming, multipart uploads are instead
+buffered in memory by the underlying S3 library: every part is held in
+memory and the whole object is written out in one go when the upload
+completes. This removes the in-order/contiguous-part restriction above,
so parts can be uploaded in any order, but memory use grows with the
size of the upload, so it is only suitable for small objects. A one-off
-NOTICE is logged the first time this happens.
-
-Alternatively, if the client is an rclone s3 remote (like the [serves3]
-example above), you can set use_multipart_uploads = false on it so it
-uploads each object as a single stream and skips multipart uploads
-altogether.
+NOTICE is logged the first time this happens. This flag is the only
+thing that makes multipart uploads buffer in memory - it is never done
+because of missing remote capabilities. Consider --vfs-cache-mode writes
+instead, which buffers the upload in the VFS cache on disk and takes
+precedence over --disable-multipart-streaming.
Bugs
@@ -13229,8 +13459,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -13279,643 +13509,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
-
-You should not run two copies of rclone using the same VFS cache with
-the same or overlapping remotes if using --vfs-cache-mode > off. This
-can potentially cause data corruption if you do. You can work around
-this by giving each rclone its own cache hierarchy with --cache-dir. You
-don't need to worry about this if the remotes in use don't overlap.
-
---vfs-cache-mode off
-
-In this mode (the default) the cache will read directly from the remote
-and write directly to the remote without caching anything on disk.
-
-This will mean some operations are not possible
-
-- Files can't be opened for both read AND write
-- Files opened for write can't be seeked
-- Existing files opened for write must have O_TRUNC set
-- Files open for read with O_TRUNC will be opened write only
-- Files open for write only will behave as if O_TRUNC was supplied
-- Open modes O_APPEND, O_TRUNC are ignored
-- If an upload fails it can't be retried
-
---vfs-cache-mode minimal
-
-This is very similar to "off" except that files opened for read AND
-write will be buffered to disk. This means that files opened for write
-will be a lot more compatible, but uses the minimal disk space.
-
-These operations are not possible
-
-- Files opened for write only can't be seeked
-- Existing files opened for write must have O_TRUNC set
-- Files opened for write only will ignore O_APPEND, O_TRUNC
-- If an upload fails it can't be retried
-
---vfs-cache-mode writes
-
-In this mode files opened for read only are still read directly from the
-remote, write only and read/write files are buffered to disk first.
-
-This mode should support all normal file system operations.
-
-If an upload fails it will be retried at exponentially increasing
-intervals up to 1 minute.
-
---vfs-cache-mode full
-
-In this mode all reads and writes are buffered to and from disk. When
-data is read from the remote this is buffered to disk as well.
-
-In this mode the files in the cache will be sparse files and rclone will
-keep track of which bits of the files it has downloaded.
-
-So if an application only reads the starts of each file, then rclone
-will only buffer the start of the file. These files will appear to be
-their full size in the cache, but they will be sparse files with only
-the data that has been downloaded present in them.
-
-This mode should support all normal file system operations and is
-otherwise identical to --vfs-cache-mode writes.
-
-When reading a file rclone will read --buffer-size plus --vfs-read-ahead
-bytes ahead. The --buffer-size is buffered in memory whereas the
---vfs-read-ahead is buffered on disk.
-
-When using this mode it is recommended that --buffer-size is not set too
-large and --vfs-read-ahead is set large if required.
-
-IMPORTANT not all file systems support sparse files. In particular
-FAT/exFAT do not. Rclone will perform very badly if the cache directory
-is on a filesystem which doesn't support sparse files and it will log an
-ERROR message if one is detected.
-
-Fingerprinting
-
-Various parts of the VFS use fingerprinting to see if a local file copy
-has changed relative to a remote file. Fingerprints are made from:
-
-- size
-- modification time
-- hash
-
-where available on an object.
-
-On some backends some of these attributes are slow to read (they take an
-extra API call per object, or extra work per object).
-
-For example hash is slow with the local and sftp backends as they have
-to read the entire file and hash it, and modtime is slow with the s3,
-swift, ftp and qinqstor backends because they need to do an extra API
-call to fetch it.
-
-If you use the --vfs-fast-fingerprint flag then rclone will not include
-the slow operations in the fingerprint. This makes the fingerprinting
-less accurate but much faster and will improve the opening time of
-cached files.
-
-If you are running a vfs cache over local, s3 or swift backends then
-using this flag is recommended.
-
-Note that if you change the value of this flag, the fingerprints of the
-files in the cache may be invalidated and the files will need to be
-downloaded again.
-
-VFS Chunked Reading
-
-When rclone reads files from a remote it reads them in chunks. This
-means that rather than requesting the whole file rclone reads the chunk
-specified. This can reduce the used download quota for some remotes by
-requesting only chunks from the remote that are actually read, at the
-cost of an increased number of requests.
-
-These flags control the chunking:
-
- --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
- --vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
- --vfs-read-chunk-streams int The number of parallel streams to read at once
-
-The chunking behaves differently depending on the
---vfs-read-chunk-streams parameter.
-
---vfs-read-chunk-streams == 0
-
-Rclone will start reading a chunk of size --vfs-read-chunk-size, and
-then double the size for each read. When --vfs-read-chunk-size-limit is
-specified, and greater than --vfs-read-chunk-size, the chunk size for
-each open file will get doubled only until the specified value is
-reached. If the value is "off", which is the default, the limit is
-disabled and the chunk size will grow indefinitely.
-
-With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0 the
-following parts will be downloaded: 0-100M, 100M-200M, 200M-300M,
-300M-400M and so on. When --vfs-read-chunk-size-limit 500M is specified,
-the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M,
-1200M-1700M and so on.
-
-Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading.
-
-The chunks will not be buffered in memory.
-
---vfs-read-chunk-streams > 0
-
-Rclone reads --vfs-read-chunk-streams chunks of size
---vfs-read-chunk-size concurrently. The size for each read will stay
-constant.
-
-This improves performance performance massively on high latency links or
-very high bandwidth links to high performance object stores.
-
-Some experimentation will be needed to find the optimum values of
---vfs-read-chunk-size and --vfs-read-chunk-streams as these will depend
-on the backend in use and the latency to the backend.
-
-For high performance object stores (eg AWS S3) a reasonable place to
-start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M.
-In testing with AWS S3 the performance scaled roughly as the
---vfs-read-chunk-streams setting.
-
-Similar settings should work for high latency links, but depending on
-the latency they may need more --vfs-read-chunk-streams in order to get
-the throughput.
-
-VFS Performance
-
-These flags may be used to enable/disable features of the VFS for
-performance or other reasons. See also the chunked reading feature.
-
-In particular S3 and Swift benefit hugely from the --no-modtime flag (or
-use --use-server-modtime for a slightly different effect) as each read
-of the modification time takes a transaction.
-
- --no-checksum Don't compare checksums on up/download.
- --no-modtime Don't read/write the modification time (can speed things up).
- --no-seek Don't allow seeking in files.
- --read-only Only allow read-only access.
-
-Sometimes rclone is delivered reads or writes out of order. Rather than
-seeking rclone will wait a short time for the in sequence read or write
-to come in. These flags only come into effect when not using an on disk
-cache file.
-
- --vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
- --vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
-
-When using VFS write caching (--vfs-cache-mode with value writes or
-full), the global flag --transfers can be set to adjust the number of
-parallel uploads of modified files from the cache (the related global
-flag --checkers has no effect on the VFS).
-
- --transfers int Number of file transfers to run in parallel (default 4)
-
-Symlinks
-
-By default the VFS does not support symlinks. However this may be
-enabled with either of the following flags:
-
- --links Translate symlinks to/from regular files with a '.rclonelink' extension.
- --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
-
-As most cloud storage systems do not support symlinks directly, rclone
-stores the symlink as a normal file with a special extension. So a file
-which appears as a symlink link-to-file.txt would be stored on cloud
-storage as link-to-file.txt.rclonelink and the contents would be the
-path to the symlink destination.
-
-Note that --links enables symlink translation globally in rclone - this
-includes any backend which supports the concept (for example the local
-backend). --vfs-links just enables it for the VFS layer.
-
-This scheme is compatible with that used by the local backend with the
---local-links flag.
-
-The --vfs-links flag has been designed for rclone mount, rclone nfsmount
-and rclone serve nfs.
-
-It hasn't been tested with the other rclone serve commands yet.
-
-A limitation of the current implementation is that it expects the caller
-to resolve sub-symlinks. For example given this directory tree
-
- .
- ├── dir
- │ └── file.txt
- └── linked-dir -> dir
-
-The VFS will correctly resolve linked-dir but not linked-dir/file.txt.
-This is not a problem for the tested commands but may be for other
-commands.
-
-Note that there is an outstanding issue with symlink support issue #8245
-with duplicate files being created when symlinks are moved into
-directories where there is a file of the same name (or vice versa).
-
-VFS Case Sensitivity
-
-Linux file systems are case-sensitive: two files can differ only by
-case, and the exact case must be used when opening a file.
-
-File systems in modern Windows are case-insensitive but case-preserving:
-although existing files can be opened using any case, the exact case
-used to create the file is preserved and available for programs to
-query. It is not allowed for two files in the same directory to differ
-only by case.
-
-Usually file systems on macOS are case-insensitive. It is possible to
-make macOS file systems case-sensitive but that is not the default.
-
-The --vfs-case-insensitive VFS flag controls how rclone handles these
-two cases. If its value is "false", rclone passes file names to the
-remote as-is. If the flag is "true" (or appears without a value on the
-command line), rclone may perform a "fixup" as explained below.
-
-The user may specify a file name to open/delete/rename/etc with a case
-different than what is stored on the remote. If an argument refers to an
-existing file with exactly the same name, then the case of the existing
-file on the disk will be used. However, if a file name with exactly the
-same name is not found but a name differing only by case exists, rclone
-will transparently fixup the name. This fixup happens only when an
-existing file is requested. Case sensitivity of file names created anew
-by rclone is controlled by the underlying remote.
-
-Note that case sensitivity of the operating system running rclone (the
-target) may differ from case sensitivity of a file system presented by
-rclone (the source). The flag controls whether "fixup" is performed to
-satisfy the target.
-
-If the flag is not provided on the command line, then its default value
-depends on the operating system where rclone runs: "true" on Windows and
-macOS, "false" otherwise. If the flag is provided without a value, then
-it is "true".
-
-The --no-unicode-normalization flag controls whether a similar "fixup"
-is performed for filenames that differ but are canonically equivalent
-with respect to unicode. Unicode normalization can be particularly
-helpful for users of macOS, which prefers form NFD instead of the NFC
-used by most other platforms. It is therefore highly recommended to keep
-the default of false on macOS, to avoid encoding compatibility issues.
-
-In the (probably unlikely) event that a directory has multiple duplicate
-filenames after applying case and unicode normalization, the
---vfs-block-norm-dupes flag allows hiding these duplicates. This comes
-with a performance tradeoff, as rclone will have to scan the entire
-directory for duplicates when listing a directory. For this reason, it
-is recommended to leave this disabled if not needed. However, macOS
-users may wish to consider using it, as otherwise, if a remote directory
-contains both NFC and NFD versions of the same filename, an odd
-situation will occur: both versions of the file will be visible in the
-mount, and both will appear to be editable, however, editing either
-version will actually result in only the NFD version getting edited
-under the hood. --vfs-block- norm-dupes prevents this confusion by
-detecting this scenario, hiding the duplicates, and logging an error,
-similar to how this is handled in rclone sync.
-
-VFS Disk Options
-
-This flag allows you to manually set the statistics about the filing
-system. It can be useful when those statistics cannot be read correctly
-automatically.
-
- --vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
-
-Alternate report of used bytes
-
-Some backends, most notably S3, do not report the amount of bytes used.
-If you need this information to be available when running df on the
-filesystem, then pass the flag --vfs-used-is-size to rclone. With this
-flag set, instead of relying on the backend to report this information,
-rclone will scan the whole remote similar to rclone size and compute the
-total used space itself.
-
-WARNING: Contrary to rclone size, this flag ignores filters so that the
-result is accurate. However, this is very inefficient and may cost lots
-of API calls resulting in extra charges. Use it as a last resort and
-only with caching.
-
-VFS Metadata
-
-If you use the --vfs-metadata-extension flag you can get the VFS to
-expose files which contain the metadata as a JSON blob. These files will
-not appear in the directory listing, but can be stat-ed and opened and
-once they have been they will appear in directory listings until the
-directory cache expires.
-
-Note that some backends won't create metadata unless you pass in the
---metadata flag.
-
-For example, using rclone mount with
---metadata --vfs-metadata-extension .metadata we get
-
- $ ls -l /mnt/
- total 1048577
- -rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-
- $ cat /mnt/1G.metadata
- {
- "atime": "2025-03-04T17:34:22.317069787Z",
- "btime": "2025-03-03T16:03:37.708253808Z",
- "gid": "1000",
- "mode": "100664",
- "mtime": "2025-03-03T16:03:39.640238323Z",
- "uid": "1000"
- }
-
- $ ls -l /mnt/
- total 1048578
- -rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
- -rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
-
-If the file has no metadata it will be returned as {} and if there is an
-error reading the metadata the error will be returned as
-{"error":"error string"}.
-
- rclone serve s3 remote:path [flags]
-
-Options
-
- --addr stringArray IPaddress:Port or :Port to bind server to (default 127.0.0.1:8080)
- --allow-origin string Origin which cross-domain request (CORS) can be executed from
- --auth-key stringArray Set key pair for v4 authorization: access_key_id,secret_access_key
- --auth-proxy string A program to use to create the backend from the auth
- --baseurl string Prefix for URLs - leave blank for root
- --cert string TLS PEM key (concatenation of certificate and CA certificate)
- --client-ca string Client certificate authority to verify clients with
- --dir-cache-time Duration Time to cache directory entries for (default 5m0s)
- --dir-perms FileMode Directory permissions (default 777)
- --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend (see the Multipart uploads docs section)
- --etag-hash string Which hash to use for the ETag, or auto or blank for off (default "MD5")
- --file-perms FileMode File permissions (default 666)
- --force-path-style If true use path style access if false use virtual hosted style (default true)
- --gid uint32 Override the gid field set by the filesystem (not supported on Windows) (default 1000)
- -h, --help help for s3
- --htpasswd string A htpasswd file - if not provided no authentication is done
- --key string TLS PEM Private key
- --link-perms FileMode Link permissions (default 666)
- --max-header-bytes int Maximum size of request header (default 4096)
- --min-tls-version string Minimum TLS version that is acceptable (default "tls1.0")
- --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (see the Multipart uploads docs section) (default 256Mi)
- --no-checksum Don't compare checksums on up/download
- --no-cleanup Not to cleanup empty folder after object is deleted
- --no-modtime Don't read/write the modification time (can speed things up)
- --no-seek Don't allow seeking in files
- --pass string Password for authentication
- --poll-interval Duration Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)
- --read-only Only allow read-only access
- --realm string Realm for authentication
- --response-header stringArray Set HTTP header for all responses, overriding existing values
- --salt string Password hashing salt (default "dlPL2MqE")
- --server-read-timeout Duration Timeout for server reading data (default 1h0m0s)
- --server-write-timeout Duration Timeout for server writing data (default 1h0m0s)
- --uid uint32 Override the uid field set by the filesystem (not supported on Windows) (default 1000)
- --umask FileMode Override the permission bits set by the filesystem (not supported on Windows) (default 002)
- --user string User name for authentication
- --user-from-header string User name from a defined HTTP header
- --vfs-block-norm-dupes If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)
- --vfs-cache-max-age Duration Max time since last access of objects in the cache (default 1h0m0s)
- --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
- --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
- --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
- --vfs-cache-poll-interval Duration Interval to poll the cache for stale objects (default 1m0s)
- --vfs-case-insensitive If a file name not found, find a case insensitive match
- --vfs-disk-space-total-size SizeSuffix Specify the total space of disk (default off)
- --vfs-fast-fingerprint Use fast (less accurate) fingerprints for change detection
- --vfs-handle-caching Duration Time to keep file handle and downloaders alive after last close (default 5s)
- --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
- --vfs-metadata-extension string Set the extension to read metadata from
- --vfs-read-ahead SizeSuffix Extra read ahead over --buffer-size when using cache-mode full
- --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128Mi)
- --vfs-read-chunk-size-limit SizeSuffix If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited) (default off)
- --vfs-read-chunk-streams int The number of parallel streams to read at once
- --vfs-read-wait Duration Time to wait for in-sequence read before seeking (default 20ms)
- --vfs-refresh Refreshes the directory cache recursively in the background on start
- --vfs-used-is-size rclone size Use the rclone size algorithm for Used size
- --vfs-write-back Duration Time to writeback files after last use when using cache (default 5s)
- --vfs-write-wait Duration Time to wait for in-sequence write before giving error (default 1s)
-
-Options shared with other commands are described next. See the global
-flags page for global options not listed here.
-
-Filter Options
-
-Flags for filtering directory listings
-
- --delete-excluded Delete files on dest excluded from sync
- --exclude stringArray Exclude files matching pattern
- --exclude-from stringArray Read file exclude patterns from file (use - to read from stdin)
- --exclude-if-present stringArray Exclude directories if filename is present
- --files-from stringArray Read list of source-file names from file (use - to read from stdin)
- --files-from-raw stringArray Read list of source-file names from file without any processing of lines (use - to read from stdin)
- --files-from0 stringArray Read list of source-file names from file using NUL as separator (use - to read from stdin)
- -f, --filter stringArray Add a file filtering rule
- --filter-from stringArray Read file filtering patterns from a file (use - to read from stdin)
- --hash-filter string Partition filenames by hash k/n or randomly @/n
- --ignore-case Ignore case in filters (case insensitive)
- --include stringArray Include files matching pattern
- --include-from stringArray Read file include patterns from file (use - to read from stdin)
- --max-age Duration Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)
- --max-depth int If set limits the recursion depth to this (default -1)
- --max-size SizeSuffix Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)
- --metadata-exclude stringArray Exclude metadatas matching pattern
- --metadata-exclude-from stringArray Read metadata exclude patterns from file (use - to read from stdin)
- --metadata-filter stringArray Add a metadata filtering rule
- --metadata-filter-from stringArray Read metadata filtering patterns from a file (use - to read from stdin)
- --metadata-include stringArray Include metadatas matching pattern
- --metadata-include-from stringArray Read metadata include patterns from file (use - to read from stdin)
- --min-age Duration Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)
- --min-size SizeSuffix Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
-
-See Also
-
-- rclone serve - Serve a remote over a protocol.
-
-rclone serve sftp
-
-Serve the remote over SFTP.
-
-Synopsis
-
-Run an SFTP server to serve a remote over SFTP. This can be used with an
-SFTP client or you can make a remote of type sftp to use with it.
-
-You can use the filter flags (e.g. --include, --exclude) to control what
-is served.
-
-The server will respond to a small number of shell commands, mainly
-md5sum, sha1sum and df, which enable it to provide support for checksums
-and the about feature when accessed from an sftp remote.
-
-Note that this server uses standard 32 KiB packet payload size, which
-means you must not configure the client to expect anything else, e.g.
-with the chunk_size option on an sftp remote.
-
-The server will log errors. Use -v to see access logs.
-
---bwlimit will be respected for file transfers. Use --stats to control
-the stats printing.
-
-You must provide some means of authentication, either with
---user/--pass, an authorized keys file (specify location with
---authorized-keys - the default is the same as ssh), an --auth-proxy, or
-set the --no-auth flag for no authentication when logging in.
-
-If you don't supply a host --key then rclone will generate rsa, ecdsa
-and ed25519 variants, and cache them for later use in rclone's cache
-directory (see rclone help flags cache-dir) in the "serve-sftp"
-directory.
-
-By default the server binds to localhost:2022 - if you want it to be
-reachable externally then supply --addr :2022 for example.
-
-This also supports being run with socket activation, in which case it
-will listen on the first passed FD. It can be configured with .socket
-and .service unit files as described in
-https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html.
-
-Socket activation can be tested ad-hoc with the
-systemd-socket-activatecommand:
-
- systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
-
-This will socket-activate rclone on the first connection to port 2222
-over TCP.
-
-Note that the default of --vfs-cache-mode off is fine for the rclone
-sftp backend, but it may not be with other SFTP clients.
-
-If --stdio is specified, rclone will serve SFTP over stdio, which can be
-used with sshd via ~/.ssh/authorized_keys, for example:
-
- restrict,command="rclone serve sftp --stdio ./photos" ssh-rsa ...
-
-On the client you need to set --transfers 1 when using --stdio.
-Otherwise multiple instances of the rclone server are started by OpenSSH
-which can lead to "corrupted on transfer" errors. This is the case
-because the client chooses indiscriminately which server to send
-commands to while the servers all have different views of the state of
-the filing system.
-
-The "restrict" in authorized_keys prevents SHA1SUMs and MD5SUMs from
-being used. Omitting "restrict" and using --sftp-path-override to enable
-checksumming is possible but less secure and you could use the SFTP
-server provided by OpenSSH in this case.
-
-VFS - Virtual File System
-
-This command uses the VFS layer. This adapts the cloud storage objects
-that rclone uses into something which looks much more like a disk filing
-system.
-
-Cloud storage objects have lots of properties which aren't like disk
-files - you can't extend them or write to the middle of them, so the VFS
-layer has to deal with that. Because there is no one right way of doing
-this there are various options explained below.
-
-The VFS layer also implements a directory cache - this caches info about
-files and directories (but not the data) in memory.
-
-VFS Directory Cache
-
-Using the --dir-cache-time flag, you can control how long a directory
-should be considered up to date and not refreshed from the backend.
-Changes made through the VFS will appear immediately or invalidate the
-cache.
-
- --dir-cache-time duration Time to cache directory entries for (default 5m0s)
- --poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
-
-However, changes made directly on the cloud storage by the web interface
-or a different copy of rclone will only be picked up once the directory
-cache expires if the backend configured does not support polling for
-changes. If the backend supports polling, changes will be picked up
-within the polling interval.
-
-You can send a SIGHUP signal to rclone for it to flush all directory
-caches, regardless of how old they are. Assuming only one rclone
-instance is running, you can reset the cache like this:
-
- kill -SIGHUP $(pidof rclone)
-
-If you configure rclone with a remote control then you can use rclone rc
-to flush the whole directory cache:
-
- rclone rc vfs/forget
-
-Or individual files or directories:
-
- rclone rc vfs/forget file=path/to/file dir=path/to/dir
-
-VFS File Buffering
-
-The --buffer-size flag determines the amount of memory, that will be
-used to buffer data in advance.
-
-Each open file will try to keep the specified amount of data in memory
-at all times. The buffered data is bound to one open file and won't be
-shared.
-
-This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
-
-The maximum memory used by rclone for buffering can be up to
---buffer-size * open files.
-
-VFS File Caching
-
-These flags control the VFS file caching options. File caching is
-necessary to make the VFS layer appear compatible with a normal file
-system. It can be disabled at the cost of some compatibility.
-
-For example you'll need to enable VFS caching if you want to read and
-write simultaneously to a file. See below for more details.
-
-Note that the VFS cache is separate from the cache backend and you may
-find that you need one or the other or both.
-
- --cache-dir string Directory rclone will use for caching.
- --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
- --vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
- --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
- --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
- --vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
- --vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
-
-If run with -vv rclone will print the location of the file cache. The
-files are stored in the user cache file area which is OS dependent but
-can be controlled with --cache-dir or setting the appropriate
-environment variable.
-
-The cache has 4 different modes selected by --vfs-cache-mode. The higher
-the cache mode the more compatible rclone becomes at the cost of using
-disk space.
-
-Note that files are written back to the remote only when they are closed
-and if they haven't been accessed for --vfs-write-back seconds. If
-rclone is quit or dies with files that haven't been uploaded, these will
-be uploaded next time rclone is run with the same flags.
-
-If using --vfs-cache-max-size or --vfs-cache-min-free-space note that
-the cache may exceed these quotas for two reasons. Firstly because it is
-only checked every --vfs-cache-poll-interval. Secondly because open
-files cannot be evicted from the cache. When --vfs-cache-max-size or
---vfs-cache-min-free-space is exceeded, rclone will attempt to evict the
-least accessed files from the cache first. rclone will start with files
-that haven't been accessed for the longest. This cache flushing strategy
-is efficient and more relevant files are likely to remain cached.
-
-The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -14290,16 +13889,18 @@ This config generated must have this extra parameter
- _root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- _obscure - comma separated strings for parameters to obscure
+- _secret_access_key - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
If public-key authentication was used by the client, input to the proxy
@@ -14307,9 +13908,41 @@ process (on STDIN) would look similar to this:
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
+If the client authenticated with an S3 access key (rclone serve s3), the
+client never sends its secret, only a signature made with it, so the
+input contains just the access key ID as the user with no pass or
+public_key:
+
+ {
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+ }
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the proxy
+program is the source of truth for both the credentials and the backend
+they map to. If the program does not return _secret_access_key or
+returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but is
+checked with the program again after 5 minutes even if the access key ID
+is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+
+The client_ip key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
{
@@ -14333,11 +13966,755 @@ user@example.com and then set the host to example.com in the output and
the user to user. For security you'd probably want to restrict the host
to a limited list.
-An internal cache of backends is keyed on the user and a hash of the
-pass or public_key. This means that if a user's password or public-key
-changes, or the proxy returns different config parameters (eg a rotated
-api_key), a fresh backend will be created on the next request rather
-than the cached one being reused.
+An internal cache of backends is keyed on the user, a hash of the pass
+or public_key, and the client_ip. This means that if a user's password
+or public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated api_key), a
+fresh backend will be created on the next request rather than the cached
+one being reused.
+
+This can be used to build general purpose proxies to any kind of backend
+that rclone supports.
+
+ rclone serve s3 remote:path [flags]
+
+Options
+
+ --addr stringArray IPaddress:Port or :Port to bind server to (default 127.0.0.1:8080)
+ --allow-origin string Origin which cross-domain request (CORS) can be executed from
+ --auth-key stringArray Set key pair for v4 authorization: access_key_id,secret_access_key
+ --auth-proxy string A program to use to create the backend from the auth
+ --baseurl string Prefix for URLs - leave blank for root
+ --cert string TLS PEM key (concatenation of certificate and CA certificate)
+ --client-ca string Client certificate authority to verify clients with
+ --dir-cache-time Duration Time to cache directory entries for (default 5m0s)
+ --dir-perms FileMode Directory permissions (default 777)
+ --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend
+ --etag-hash string Which hash to use for the ETag, or auto or blank for off (default "MD5")
+ --file-perms FileMode File permissions (default 666)
+ --force-path-style If true use path style access if false use virtual hosted style (default true)
+ --gid uint32 Override the gid field set by the filesystem (not supported on Windows) (default 1000)
+ -h, --help help for s3
+ --htpasswd string A htpasswd file - if not provided no authentication is done
+ --key string TLS PEM Private key
+ --link-perms FileMode Link permissions (default 666)
+ --max-header-bytes int Maximum size of request header (default 4096)
+ --min-tls-version string Minimum TLS version that is acceptable (default "tls1.0")
+ --multipart-expiry Duration Abort incomplete multipart uploads idle for longer than this, 0 to keep forever (default 1d)
+ --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (default 256Mi)
+ --no-checksum Don't compare checksums on up/download
+ --no-cleanup Not to cleanup empty folder after object is deleted
+ --no-modtime Don't read/write the modification time (can speed things up)
+ --no-seek Don't allow seeking in files
+ --pass string Password for authentication
+ --poll-interval Duration Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)
+ --read-only Only allow read-only access
+ --realm string Realm for authentication
+ --response-header stringArray Set HTTP header for all responses, overriding existing values
+ --salt string Password hashing salt (default "dlPL2MqE")
+ --server-read-timeout Duration Timeout for server reading data (default 1h0m0s)
+ --server-write-timeout Duration Timeout for server writing data (default 1h0m0s)
+ --uid uint32 Override the uid field set by the filesystem (not supported on Windows) (default 1000)
+ --umask FileMode Override the permission bits set by the filesystem (not supported on Windows) (default 002)
+ --user string User name for authentication
+ --user-from-header string User name from a defined HTTP header
+ --vfs-block-norm-dupes If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)
+ --vfs-cache-max-age Duration Max time since last access of objects in the cache (default 1h0m0s)
+ --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
+ --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
+ --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
+ --vfs-cache-poll-interval Duration Interval to poll the cache for stale objects (default 1m0s)
+ --vfs-case-insensitive If a file name not found, find a case insensitive match
+ --vfs-disk-space-total-size SizeSuffix Specify the total space of disk (default off)
+ --vfs-fast-fingerprint Use fast (less accurate) fingerprints for change detection
+ --vfs-handle-caching Duration Time to keep file handle and downloaders alive after last close (default 5s)
+ --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
+ --vfs-metadata-extension string Set the extension to read metadata from
+ --vfs-read-ahead SizeSuffix Extra read ahead over --buffer-size when using cache-mode full
+ --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128Mi)
+ --vfs-read-chunk-size-limit SizeSuffix If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited) (default off)
+ --vfs-read-chunk-streams int The number of parallel streams to read at once
+ --vfs-read-wait Duration Time to wait for in-sequence read before seeking (default 20ms)
+ --vfs-refresh Refreshes the directory cache recursively in the background on start
+ --vfs-used-is-size rclone size Use the rclone size algorithm for Used size
+ --vfs-write-back Duration Time to writeback files after last use when using cache (default 5s)
+ --vfs-write-wait Duration Time to wait for in-sequence write before giving error (default 1s)
+
+Options shared with other commands are described next. See the global
+flags page for global options not listed here.
+
+Filter Options
+
+Flags for filtering directory listings
+
+ --delete-excluded Delete files on dest excluded from sync
+ --exclude stringArray Exclude files matching pattern
+ --exclude-from stringArray Read file exclude patterns from file (use - to read from stdin)
+ --exclude-if-present stringArray Exclude directories if filename is present
+ --files-from stringArray Read list of source-file names from file (use - to read from stdin)
+ --files-from-raw stringArray Read list of source-file names from file without any processing of lines (use - to read from stdin)
+ --files-from0 stringArray Read list of source-file names from file using NUL as separator (use - to read from stdin)
+ -f, --filter stringArray Add a file filtering rule
+ --filter-from stringArray Read file filtering patterns from a file (use - to read from stdin)
+ --hash-filter string Partition filenames by hash k/n or randomly @/n
+ --ignore-case Ignore case in filters (case insensitive)
+ --include stringArray Include files matching pattern
+ --include-from stringArray Read file include patterns from file (use - to read from stdin)
+ --max-age Duration Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)
+ --max-depth int If set limits the recursion depth to this (default -1)
+ --max-size SizeSuffix Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)
+ --metadata-exclude stringArray Exclude metadatas matching pattern
+ --metadata-exclude-from stringArray Read metadata exclude patterns from file (use - to read from stdin)
+ --metadata-filter stringArray Add a metadata filtering rule
+ --metadata-filter-from stringArray Read metadata filtering patterns from a file (use - to read from stdin)
+ --metadata-include stringArray Include metadatas matching pattern
+ --metadata-include-from stringArray Read metadata include patterns from file (use - to read from stdin)
+ --min-age Duration Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)
+ --min-size SizeSuffix Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
+
+See Also
+
+- rclone serve - Serve a remote over a protocol.
+
+rclone serve sftp
+
+Serve the remote over SFTP.
+
+Synopsis
+
+Run an SFTP server to serve a remote over SFTP. This can be used with an
+SFTP client or you can make a remote of type sftp to use with it.
+
+You can use the filter flags (e.g. --include, --exclude) to control what
+is served.
+
+The server will respond to a small number of shell commands, mainly
+md5sum, sha1sum and df, which enable it to provide support for checksums
+and the about feature when accessed from an sftp remote.
+
+Note that this server uses standard 32 KiB packet payload size, which
+means you must not configure the client to expect anything else, e.g.
+with the chunk_size option on an sftp remote.
+
+The server will log errors. Use -v to see access logs.
+
+--bwlimit will be respected for file transfers. Use --stats to control
+the stats printing.
+
+You must provide some means of authentication, either with
+--user/--pass, an authorized keys file (specify location with
+--authorized-keys - the default is the same as ssh), an --auth-proxy, or
+set the --no-auth flag for no authentication when logging in.
+
+If you don't supply a host --key then rclone will generate rsa, ecdsa
+and ed25519 variants, and cache them for later use in rclone's cache
+directory (see rclone help flags cache-dir) in the "serve-sftp"
+directory.
+
+By default the server binds to localhost:2022 - if you want it to be
+reachable externally then supply --addr :2022 for example.
+
+This also supports being run with socket activation, in which case it
+will listen on the first passed FD. It can be configured with .socket
+and .service unit files as described in
+https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html.
+
+Socket activation can be tested ad-hoc with the
+systemd-socket-activatecommand:
+
+ systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
+
+This will socket-activate rclone on the first connection to port 2222
+over TCP.
+
+Note that the default of --vfs-cache-mode off is fine for the rclone
+sftp backend, but it may not be with other SFTP clients.
+
+If --stdio is specified, rclone will serve SFTP over stdio, which can be
+used with sshd via ~/.ssh/authorized_keys, for example:
+
+ restrict,command="rclone serve sftp --stdio ./photos" ssh-rsa ...
+
+On the client you need to set --transfers 1 when using --stdio.
+Otherwise multiple instances of the rclone server are started by OpenSSH
+which can lead to "corrupted on transfer" errors. This is the case
+because the client chooses indiscriminately which server to send
+commands to while the servers all have different views of the state of
+the filing system.
+
+The "restrict" in authorized_keys prevents SHA1SUMs and MD5SUMs from
+being used. Omitting "restrict" and using --sftp-path-override to enable
+checksumming is possible but less secure and you could use the SFTP
+server provided by OpenSSH in this case.
+
+VFS - Virtual File System
+
+This command uses the VFS layer. This adapts the cloud storage objects
+that rclone uses into something which looks much more like a disk filing
+system.
+
+Cloud storage objects have lots of properties which aren't like disk
+files - you can't extend them or write to the middle of them, so the VFS
+layer has to deal with that. Because there is no one right way of doing
+this there are various options explained below.
+
+The VFS layer also implements a directory cache - this caches info about
+files and directories (but not the data) in memory.
+
+VFS Directory Cache
+
+Using the --dir-cache-time flag, you can control how long a directory
+should be considered up to date and not refreshed from the backend.
+Changes made through the VFS will appear immediately or invalidate the
+cache.
+
+ --dir-cache-time duration Time to cache directory entries for (default 5m0s)
+ --poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
+
+However, changes made directly on the cloud storage by the web interface
+or a different copy of rclone will only be picked up once the directory
+cache expires if the backend configured does not support polling for
+changes. If the backend supports polling, changes will be picked up
+within the polling interval.
+
+You can send a SIGHUP signal to rclone for it to flush all directory
+caches, regardless of how old they are. Assuming only one rclone
+instance is running, you can reset the cache like this:
+
+ kill -SIGHUP $(pidof rclone)
+
+If you configure rclone with a remote control then you can use rclone rc
+to flush the whole directory cache:
+
+ rclone rc vfs/forget
+
+Or individual files or directories:
+
+ rclone rc vfs/forget file=path/to/file dir=path/to/dir
+
+VFS File Buffering
+
+The --buffer-size flag determines the amount of memory, that will be
+used to buffer data in advance.
+
+Each open file will try to keep the specified amount of data in memory
+at all times. The buffered data is bound to one open file and won't be
+shared.
+
+This flag is a upper limit for the used memory per open file. The buffer
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
+
+The maximum memory used by rclone for buffering can be up to
+--buffer-size * open files.
+
+VFS File Caching
+
+These flags control the VFS file caching options. File caching is
+necessary to make the VFS layer appear compatible with a normal file
+system. It can be disabled at the cost of some compatibility.
+
+For example you'll need to enable VFS caching if you want to read and
+write simultaneously to a file. See below for more details.
+
+Note that the VFS cache is separate from the cache backend and you may
+find that you need one or the other or both.
+
+ --cache-dir string Directory rclone will use for caching.
+ --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
+ --vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
+ --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
+ --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
+ --vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
+ --vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
+
+If run with -vv rclone will print the location of the file cache. The
+files are stored in the user cache file area which is OS dependent but
+can be controlled with --cache-dir or setting the appropriate
+environment variable.
+
+The cache has 4 different modes selected by --vfs-cache-mode. The higher
+the cache mode the more compatible rclone becomes at the cost of using
+disk space.
+
+Note that files are written back to the remote only when they are closed
+and if they haven't been accessed for --vfs-write-back seconds. If
+rclone is quit or dies with files that haven't been uploaded, these will
+be uploaded next time rclone is run with the same flags.
+
+If using --vfs-cache-max-size or --vfs-cache-min-free-space note that
+the cache may exceed these quotas for two reasons. Firstly because it is
+only checked every --vfs-cache-poll-interval. Secondly because open
+files cannot be evicted from the cache. When --vfs-cache-max-size or
+--vfs-cache-min-free-space is exceeded, rclone will attempt to evict the
+least accessed files from the cache first. rclone will start with files
+that haven't been accessed for the longest. This cache flushing strategy
+is efficient and more relevant files are likely to remain cached.
+
+The --vfs-cache-max-age will evict files from the cache after the set
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
+
+You should not run two copies of rclone using the same VFS cache with
+the same or overlapping remotes if using --vfs-cache-mode > off. This
+can potentially cause data corruption if you do. You can work around
+this by giving each rclone its own cache hierarchy with --cache-dir. You
+don't need to worry about this if the remotes in use don't overlap.
+
+--vfs-cache-mode off
+
+In this mode (the default) the cache will read directly from the remote
+and write directly to the remote without caching anything on disk.
+
+This will mean some operations are not possible
+
+- Files can't be opened for both read AND write
+- Files opened for write can't be seeked
+- Existing files opened for write must have O_TRUNC set
+- Files open for read with O_TRUNC will be opened write only
+- Files open for write only will behave as if O_TRUNC was supplied
+- Open modes O_APPEND, O_TRUNC are ignored
+- If an upload fails it can't be retried
+
+--vfs-cache-mode minimal
+
+This is very similar to "off" except that files opened for read AND
+write will be buffered to disk. This means that files opened for write
+will be a lot more compatible, but uses the minimal disk space.
+
+These operations are not possible
+
+- Files opened for write only can't be seeked
+- Existing files opened for write must have O_TRUNC set
+- Files opened for write only will ignore O_APPEND, O_TRUNC
+- If an upload fails it can't be retried
+
+--vfs-cache-mode writes
+
+In this mode files opened for read only are still read directly from the
+remote, write only and read/write files are buffered to disk first.
+
+This mode should support all normal file system operations.
+
+If an upload fails it will be retried at exponentially increasing
+intervals up to 1 minute.
+
+--vfs-cache-mode full
+
+In this mode all reads and writes are buffered to and from disk. When
+data is read from the remote this is buffered to disk as well.
+
+In this mode the files in the cache will be sparse files and rclone will
+keep track of which bits of the files it has downloaded.
+
+So if an application only reads the starts of each file, then rclone
+will only buffer the start of the file. These files will appear to be
+their full size in the cache, but they will be sparse files with only
+the data that has been downloaded present in them.
+
+This mode should support all normal file system operations and is
+otherwise identical to --vfs-cache-mode writes.
+
+When reading a file rclone will read --buffer-size plus --vfs-read-ahead
+bytes ahead. The --buffer-size is buffered in memory whereas the
+--vfs-read-ahead is buffered on disk.
+
+When using this mode it is recommended that --buffer-size is not set too
+large and --vfs-read-ahead is set large if required.
+
+IMPORTANT not all file systems support sparse files. In particular
+FAT/exFAT do not. Rclone will perform very badly if the cache directory
+is on a filesystem which doesn't support sparse files and it will log an
+ERROR message if one is detected.
+
+Fingerprinting
+
+Various parts of the VFS use fingerprinting to see if a local file copy
+has changed relative to a remote file. Fingerprints are made from:
+
+- size
+- modification time
+- hash
+
+where available on an object.
+
+On some backends some of these attributes are slow to read (they take an
+extra API call per object, or extra work per object).
+
+For example hash is slow with the local and sftp backends as they have
+to read the entire file and hash it, and modtime is slow with the s3,
+swift, ftp and qinqstor backends because they need to do an extra API
+call to fetch it.
+
+If you use the --vfs-fast-fingerprint flag then rclone will not include
+the slow operations in the fingerprint. This makes the fingerprinting
+less accurate but much faster and will improve the opening time of
+cached files.
+
+If you are running a vfs cache over local, s3 or swift backends then
+using this flag is recommended.
+
+Note that if you change the value of this flag, the fingerprints of the
+files in the cache may be invalidated and the files will need to be
+downloaded again.
+
+VFS Chunked Reading
+
+When rclone reads files from a remote it reads them in chunks. This
+means that rather than requesting the whole file rclone reads the chunk
+specified. This can reduce the used download quota for some remotes by
+requesting only chunks from the remote that are actually read, at the
+cost of an increased number of requests.
+
+These flags control the chunking:
+
+ --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
+ --vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
+ --vfs-read-chunk-streams int The number of parallel streams to read at once
+
+The chunking behaves differently depending on the
+--vfs-read-chunk-streams parameter.
+
+--vfs-read-chunk-streams == 0
+
+Rclone will start reading a chunk of size --vfs-read-chunk-size, and
+then double the size for each read. When --vfs-read-chunk-size-limit is
+specified, and greater than --vfs-read-chunk-size, the chunk size for
+each open file will get doubled only until the specified value is
+reached. If the value is "off", which is the default, the limit is
+disabled and the chunk size will grow indefinitely.
+
+With --vfs-read-chunk-size 100M and --vfs-read-chunk-size-limit 0 the
+following parts will be downloaded: 0-100M, 100M-200M, 200M-300M,
+300M-400M and so on. When --vfs-read-chunk-size-limit 500M is specified,
+the result would be 0-100M, 100M-300M, 300M-700M, 700M-1200M,
+1200M-1700M and so on.
+
+Setting --vfs-read-chunk-size to 0 or "off" disables chunked reading.
+
+The chunks will not be buffered in memory.
+
+--vfs-read-chunk-streams > 0
+
+Rclone reads --vfs-read-chunk-streams chunks of size
+--vfs-read-chunk-size concurrently. The size for each read will stay
+constant.
+
+This improves performance performance massively on high latency links or
+very high bandwidth links to high performance object stores.
+
+Some experimentation will be needed to find the optimum values of
+--vfs-read-chunk-size and --vfs-read-chunk-streams as these will depend
+on the backend in use and the latency to the backend.
+
+For high performance object stores (eg AWS S3) a reasonable place to
+start might be --vfs-read-chunk-streams 16 and --vfs-read-chunk-size 4M.
+In testing with AWS S3 the performance scaled roughly as the
+--vfs-read-chunk-streams setting.
+
+Similar settings should work for high latency links, but depending on
+the latency they may need more --vfs-read-chunk-streams in order to get
+the throughput.
+
+VFS Performance
+
+These flags may be used to enable/disable features of the VFS for
+performance or other reasons. See also the chunked reading feature.
+
+In particular S3 and Swift benefit hugely from the --no-modtime flag (or
+use --use-server-modtime for a slightly different effect) as each read
+of the modification time takes a transaction.
+
+ --no-checksum Don't compare checksums on up/download.
+ --no-modtime Don't read/write the modification time (can speed things up).
+ --no-seek Don't allow seeking in files.
+ --read-only Only allow read-only access.
+
+Sometimes rclone is delivered reads or writes out of order. Rather than
+seeking rclone will wait a short time for the in sequence read or write
+to come in. These flags only come into effect when not using an on disk
+cache file.
+
+ --vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
+ --vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
+
+When using VFS write caching (--vfs-cache-mode with value writes or
+full), the global flag --transfers can be set to adjust the number of
+parallel uploads of modified files from the cache (the related global
+flag --checkers has no effect on the VFS).
+
+ --transfers int Number of file transfers to run in parallel (default 4)
+
+Symlinks
+
+By default the VFS does not support symlinks. However this may be
+enabled with either of the following flags:
+
+ --links Translate symlinks to/from regular files with a '.rclonelink' extension.
+ --vfs-links Translate symlinks to/from regular files with a '.rclonelink' extension for the VFS
+
+As most cloud storage systems do not support symlinks directly, rclone
+stores the symlink as a normal file with a special extension. So a file
+which appears as a symlink link-to-file.txt would be stored on cloud
+storage as link-to-file.txt.rclonelink and the contents would be the
+path to the symlink destination.
+
+Note that --links enables symlink translation globally in rclone - this
+includes any backend which supports the concept (for example the local
+backend). --vfs-links just enables it for the VFS layer.
+
+This scheme is compatible with that used by the local backend with the
+--local-links flag.
+
+The --vfs-links flag has been designed for rclone mount, rclone nfsmount
+and rclone serve nfs.
+
+It hasn't been tested with the other rclone serve commands yet.
+
+A limitation of the current implementation is that it expects the caller
+to resolve sub-symlinks. For example given this directory tree
+
+ .
+ ├── dir
+ │ └── file.txt
+ └── linked-dir -> dir
+
+The VFS will correctly resolve linked-dir but not linked-dir/file.txt.
+This is not a problem for the tested commands but may be for other
+commands.
+
+Note that there is an outstanding issue with symlink support issue #8245
+with duplicate files being created when symlinks are moved into
+directories where there is a file of the same name (or vice versa).
+
+VFS Case Sensitivity
+
+Linux file systems are case-sensitive: two files can differ only by
+case, and the exact case must be used when opening a file.
+
+File systems in modern Windows are case-insensitive but case-preserving:
+although existing files can be opened using any case, the exact case
+used to create the file is preserved and available for programs to
+query. It is not allowed for two files in the same directory to differ
+only by case.
+
+Usually file systems on macOS are case-insensitive. It is possible to
+make macOS file systems case-sensitive but that is not the default.
+
+The --vfs-case-insensitive VFS flag controls how rclone handles these
+two cases. If its value is "false", rclone passes file names to the
+remote as-is. If the flag is "true" (or appears without a value on the
+command line), rclone may perform a "fixup" as explained below.
+
+The user may specify a file name to open/delete/rename/etc with a case
+different than what is stored on the remote. If an argument refers to an
+existing file with exactly the same name, then the case of the existing
+file on the disk will be used. However, if a file name with exactly the
+same name is not found but a name differing only by case exists, rclone
+will transparently fixup the name. This fixup happens only when an
+existing file is requested. Case sensitivity of file names created anew
+by rclone is controlled by the underlying remote.
+
+Note that case sensitivity of the operating system running rclone (the
+target) may differ from case sensitivity of a file system presented by
+rclone (the source). The flag controls whether "fixup" is performed to
+satisfy the target.
+
+If the flag is not provided on the command line, then its default value
+depends on the operating system where rclone runs: "true" on Windows and
+macOS, "false" otherwise. If the flag is provided without a value, then
+it is "true".
+
+The --no-unicode-normalization flag controls whether a similar "fixup"
+is performed for filenames that differ but are canonically equivalent
+with respect to unicode. Unicode normalization can be particularly
+helpful for users of macOS, which prefers form NFD instead of the NFC
+used by most other platforms. It is therefore highly recommended to keep
+the default of false on macOS, to avoid encoding compatibility issues.
+
+In the (probably unlikely) event that a directory has multiple duplicate
+filenames after applying case and unicode normalization, the
+--vfs-block-norm-dupes flag allows hiding these duplicates. This comes
+with a performance tradeoff, as rclone will have to scan the entire
+directory for duplicates when listing a directory. For this reason, it
+is recommended to leave this disabled if not needed. However, macOS
+users may wish to consider using it, as otherwise, if a remote directory
+contains both NFC and NFD versions of the same filename, an odd
+situation will occur: both versions of the file will be visible in the
+mount, and both will appear to be editable, however, editing either
+version will actually result in only the NFD version getting edited
+under the hood. --vfs-block- norm-dupes prevents this confusion by
+detecting this scenario, hiding the duplicates, and logging an error,
+similar to how this is handled in rclone sync.
+
+VFS Disk Options
+
+This flag allows you to manually set the statistics about the filing
+system. It can be useful when those statistics cannot be read correctly
+automatically.
+
+ --vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
+
+Alternate report of used bytes
+
+Some backends, most notably S3, do not report the amount of bytes used.
+If you need this information to be available when running df on the
+filesystem, then pass the flag --vfs-used-is-size to rclone. With this
+flag set, instead of relying on the backend to report this information,
+rclone will scan the whole remote similar to rclone size and compute the
+total used space itself.
+
+WARNING: Contrary to rclone size, this flag ignores filters so that the
+result is accurate. However, this is very inefficient and may cost lots
+of API calls resulting in extra charges. Use it as a last resort and
+only with caching.
+
+VFS Metadata
+
+If you use the --vfs-metadata-extension flag you can get the VFS to
+expose files which contain the metadata as a JSON blob. These files will
+not appear in the directory listing, but can be stat-ed and opened and
+once they have been they will appear in directory listings until the
+directory cache expires.
+
+Note that some backends won't create metadata unless you pass in the
+--metadata flag.
+
+For example, using rclone mount with
+--metadata --vfs-metadata-extension .metadata we get
+
+ $ ls -l /mnt/
+ total 1048577
+ -rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
+
+ $ cat /mnt/1G.metadata
+ {
+ "atime": "2025-03-04T17:34:22.317069787Z",
+ "btime": "2025-03-03T16:03:37.708253808Z",
+ "gid": "1000",
+ "mode": "100664",
+ "mtime": "2025-03-03T16:03:39.640238323Z",
+ "uid": "1000"
+ }
+
+ $ ls -l /mnt/
+ total 1048578
+ -rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
+ -rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
+
+If the file has no metadata it will be returned as {} and if there is an
+error reading the metadata the error will be returned as
+{"error":"error string"}.
+
+Auth Proxy
+
+If you supply the parameter --auth-proxy /path/to/program then rclone
+will use that program to generate backends on the fly which then are
+used to authenticate incoming requests. This uses a simple JSON based
+protocol with input on STDIN and output on STDOUT.
+
+PLEASE NOTE: --auth-proxy and --authorized-keys cannot be used together,
+if --auth-proxy is set the authorized keys option will be ignored.
+
+There is an example program bin/test_proxy.py in the rclone source code.
+
+The program's job is to take a user and pass on the input and turn those
+into the config for a backend on STDOUT in JSON format. This config will
+have any default parameters for the backend added, but it won't use
+configuration from environment variables or command line options - it is
+the job of the proxy program to make a complete config.
+
+This config generated must have this extra parameter
+
+- _root - root to use for the backend
+
+And it may have these parameters
+
+- _obscure - comma separated strings for parameters to obscure
+- _secret_access_key - the secret for S3 access key auth (see below)
+
+If password authentication was used by the client, input to the proxy
+process (on STDIN) would look similar to this:
+
+ {
+ "user": "me",
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+ }
+
+If public-key authentication was used by the client, input to the proxy
+process (on STDIN) would look similar to this:
+
+ {
+ "user": "me",
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+ }
+
+If the client authenticated with an S3 access key (rclone serve s3), the
+client never sends its secret, only a signature made with it, so the
+input contains just the access key ID as the user with no pass or
+public_key:
+
+ {
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+ }
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the proxy
+program is the source of truth for both the credentials and the backend
+they map to. If the program does not return _secret_access_key or
+returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but is
+checked with the program again after 5 minutes even if the access key ID
+is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+
+The client_ip key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
+And as an example return this on STDOUT
+
+ {
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+ }
+
+This would mean that an SFTP backend would be created on the fly for the
+user and pass/public_key returned in the output to the host given. Note
+that since _obscure is set to pass, rclone will obscure the pass
+parameter before creating the backend (which is required for sftp
+backends).
+
+The program can manipulate the supplied user in any way, for example to
+make proxy to many different sftp backends, you could make the user be
+user@example.com and then set the host to example.com in the output and
+the user to user. For security you'd probably want to restrict the host
+to a limited list.
+
+An internal cache of backends is keyed on the user, a hash of the pass
+or public_key, and the client_ip. This means that if a user's password
+or public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated api_key), a
+fresh backend will be created on the next request rather than the cached
+one being reused.
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -14765,8 +15142,8 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The buffer
-will only use memory for data that is downloaded but not not yet read.
-If the buffer is empty, only a small amount of memory will be used.
+will only use memory for data that is downloaded but not yet read. If
+the buffer is empty, only a small amount of memory will be used.
The maximum memory used by rclone for buffering can be up to
--buffer-size * open files.
@@ -14815,11 +15192,12 @@ that haven't been accessed for the longest. This cache flushing strategy
is efficient and more relevant files are likely to remain cached.
The --vfs-cache-max-age will evict files from the cache after the set
-time since last access has passed. The default value of 1 hour will
-start evicting files from cache that haven't been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting. Specify the time with standard
-notation, s, m, h, d, w .
+time since last access has passed; it is based on access time, not on
+when the file was first added to the cache. The default value of 1 hour
+will start evicting files from cache that haven't been accessed for 1
+hour. When a cached file is accessed the 1 hour timer is reset to 0 and
+will wait for 1 more hour before evicting. Specify the time with
+standard notation, s, m, h, d, w .
You should not run two copies of rclone using the same VFS cache with
the same or overlapping remotes if using --vfs-cache-mode > off. This
@@ -15194,16 +15572,18 @@ This config generated must have this extra parameter
- _root - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- _obscure - comma separated strings for parameters to obscure
+- _secret_access_key - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
If public-key authentication was used by the client, input to the proxy
@@ -15211,9 +15591,41 @@ process (on STDIN) would look similar to this:
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
+If the client authenticated with an S3 access key (rclone serve s3), the
+client never sends its secret, only a signature made with it, so the
+input contains just the access key ID as the user with no pass or
+public_key:
+
+ {
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+ }
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the _secret_access_key field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the proxy
+program is the source of truth for both the credentials and the backend
+they map to. If the program does not return _secret_access_key or
+returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but is
+checked with the program again after 5 minutes even if the access key ID
+is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes. A rotated secret takes effect on the first
+request signed with it.
+
+The client_ip key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
{
@@ -15237,11 +15649,12 @@ user@example.com and then set the host to example.com in the output and
the user to user. For security you'd probably want to restrict the host
to a limited list.
-An internal cache of backends is keyed on the user and a hash of the
-pass or public_key. This means that if a user's password or public-key
-changes, or the proxy returns different config parameters (eg a rotated
-api_key), a fresh backend will be created on the next request rather
-than the cached one being reused.
+An internal cache of backends is keyed on the user, a hash of the pass
+or public_key, and the client_ip. This means that if a user's password
+or public-key changes, the client connects from a new IP address, or the
+proxy returns different config parameters (eg a rotated api_key), a
+fresh backend will be created on the next request rather than the cached
+one being reused.
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -17772,8 +18185,8 @@ Most multi-thread transfers do not take additional memory, but some do
(for example uploading to s3). In the worst case memory usage can be at
maximum --transfers * --multi-thread-chunk-size * --multi-thread-streams
or specifically for the s3 backend --transfers * --s3-chunk-size *
---s3-concurrency. However you can use the the --max-buffer-memory flag
-to control the maximum memory used here.
+--s3-concurrency. However you can use the --max-buffer-memory flag to
+control the maximum memory used here.
NB that this only works with supported backends as the destination but
will work with any backend as the source.
@@ -23750,7 +24163,7 @@ Flags for general networking and HTTP stuff.
--tpslimit float Limit HTTP transactions per second to this
--tpslimit-burst int Max burst of transactions for --tpslimit (default 1)
--use-cookies Enable session cookiejar
- --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.0")
+ --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.1")
Performance
@@ -26475,11 +26888,12 @@ The following backends have known issues that need more investigation:
- TestBisyncRemoteLocal/normalization
- TestBisyncLocalRemote/ext_paths
- TestBisyncLocalRemote/extended_filenames
- - 4 more
+ - 3 more
- TestPcloud (pcloud)
- - TestBisyncRemoteRemote/check_access
- - TestBisyncRemoteRemote/rmdirs
-- Updated: 2026-07-31-010017
+ - TestBisyncRemoteLocal/createemptysrcdirs
+ - TestBisyncLocalRemote/resolve
+ - TestBisyncRemoteRemote/createemptysrcdirs
+- Updated: 2026-09-04-010006
The following backends either have not been tested recently or have
known issues that are deemed unfixable for the time being:
@@ -30206,38 +30620,47 @@ Properties:
- "br-ne1.magaluobjects.com"
- Fortaleza, CE (BR), br-ne1
- Provider: Magalu
- - "s3.eu-amsterdam.megas4.com"
- - Mega S4 Amsterdam
+ - "s3.eu-luxembourg-1.megas4.com"
+ - Mega S4 Luxembourg 1
- Provider: Mega
- - "s3.eu-luxembourg.megas4.com"
- - Mega S4 Luxembourg
+ - "s3.eu-luxembourg-2.megas4.com"
+ - Mega S4 Luxembourg 2
- Provider: Mega
- - "s3.eu-paris.megas4.com"
- - Mega S4 Paris
+ - "s3.eu-amsterdam-1.megas4.com"
+ - Mega S4 Amsterdam 1
- Provider: Mega
- - "s3.eu-barcelona.megas4.com"
- - Mega S4 Barcelona
+ - "s3.eu-amsterdam-2.megas4.com"
+ - Mega S4 Amsterdam 2
- Provider: Mega
- - "s3.ca-montreal.megas4.com"
- - Mega S4 Montreal
+ - "s3.eu-paris-1.megas4.com"
+ - Mega S4 Paris 1
- Provider: Mega
- - "s3.ca-vancouver.megas4.com"
- - Mega S4 Vancouver
+ - "s3.eu-paris-2.megas4.com"
+ - Mega S4 Paris 2
- Provider: Mega
- - "s3.ap-tokyo.megas4.com"
- - Mega S4 Tokyo
+ - "s3.eu-barcelona-1.megas4.com"
+ - Mega S4 Barcelona 1
- Provider: Mega
- - "s3.eu-central-1.s4.mega.io"
- - Mega S4 eu-central-1 (Amsterdam, legacy)
+ - "s3.eu-barcelona-2.megas4.com"
+ - Mega S4 Barcelona 2
- Provider: Mega
- - "s3.eu-central-2.s4.mega.io"
- - Mega S4 eu-central-2 (Bettembourg, legacy)
+ - "s3.ca-montreal-1.megas4.com"
+ - Mega S4 Montreal 1
- Provider: Mega
- - "s3.ca-central-1.s4.mega.io"
- - Mega S4 ca-central-1 (Montreal, legacy)
+ - "s3.ca-montreal-2.megas4.com"
+ - Mega S4 Montreal 2
- Provider: Mega
- - "s3.ca-west-1.s4.mega.io"
- - Mega S4 ca-west-1 (Vancouver, legacy)
+ - "s3.ca-vancouver-1.megas4.com"
+ - Mega S4 Vancouver 1
+ - Provider: Mega
+ - "s3.ca-vancouver-2.megas4.com"
+ - Mega S4 Vancouver 2
+ - Provider: Mega
+ - "s3.ap-tokyo-1.megas4.com"
+ - Mega S4 Tokyo 1
+ - Provider: Mega
+ - "s3.ap-tokyo-2.megas4.com"
+ - Mega S4 Tokyo 2
- Provider: Mega
- "oos.eu-west-2.outscale.com"
- Outscale EU West 2 (Paris)
@@ -32756,15 +33179,15 @@ AWS Directory Buckets
From rclone v1.69 Directory Buckets are supported.
-You will need to set the directory_buckets = true config parameter or
-use --s3-directory-buckets.
+You will need to set the directory_bucket = true config parameter or use
+--s3-directory-bucket.
Note that rclone cannot yet:
- Create directory buckets
- List directory buckets
-See the --s3-directory-buckets flag for more info
+See the --s3-directory-bucket flag for more info
AWS Snowball Edge
@@ -42443,6 +42866,15 @@ This means that
- filenames with the same name will encrypt the same
- filenames which start the same won't have a common prefix
+A version string of the form -vYYYY-MM-DD-HHMMSS-NNN on the end of a
+file name (as added by --b2-versions / --s3-versions) is left in plain
+text so that versioned files can be found. Directory names are encrypted
+in full. Rclone before v1.76 left such a suffix in plain text on
+directory names too, so a directory named like this created by an older
+rclone will appear in listings with a warning but can't be opened or
+removed until renamed on the underlying remote to the name given in the
+warning.
+
This uses a 32 byte key (256 bits) and a 16 byte (128 bits) IV both of
which are derived from the user password.
@@ -48609,7 +49041,7 @@ Here is how to create your own Google Drive client ID for rclone:
You should now see the three scopes on your Data access page. Now
press save at the bottom!
-6. After adding scopes, click Audience Scroll down and click "+ Add
+6. After adding scopes, click Audience. Scroll down and click "+ Add
users". Add yourself as a test user and press save.
7. Go to Overview on the left panel, click "Create OAuth client".
@@ -50989,7 +51421,7 @@ absolute path is resolved from the root of the domain.
If the path following the remote: ends with / it will be assumed to
point to a directory. If the path does not end with /, then a HEAD
-request is sent and the response used to decide if it it is treated as a
+request is sent and the response used to decide if it is treated as a
file or a directory (run with -vv to see details). When --http-no-head
is specified, a path without ending / is always assumed to be a file. If
rclone incorrectly assumes the path is a file, the solution is to
@@ -51158,6 +51590,12 @@ For example, to set a Cookie use 'Cookie,name=value', or
You can set multiple headers, e.g.
'"Cookie","name=value","Authorization","xxx"'.
+The headers are only sent to the host in the configured URL. If the
+server redirects to another host (including a subdomain or a different
+port) the headers are not sent to it, or to any further hop in that
+redirect chain. When headers are set, a redirect from https to http is
+refused as it would send them in cleartext.
+
Properties:
- Config: headers
@@ -60744,7 +61182,7 @@ Request" error rather than a more sensible error when the authentication
fails for Swift.
So this most likely means your username / password is wrong. You can
-investigate further with the --dump-bodies flag.
+investigate further with the --dump bodies flag.
This may also be caused by specifying the region when you shouldn't have
(e.g. OVH).
@@ -64569,7 +65007,7 @@ found in this paper.
SFTP isn't supported under plan9 until this issue is fixed.
Note that since SFTP isn't HTTP based the following flags don't work
-with it: --dump-headers, --dump-bodies, --dump-auth.
+with it: --dump headers, --dump bodies, --dump auth.
Note that --timeout and --contimeout are both supported.
@@ -66626,7 +67064,9 @@ Likewise plain WebDAV does not support hashes, however when used with
Fastmail Files, ownCloud or Nextcloud rclone will support SHA1 and MD5
hashes. Depending on the exact version of ownCloud or Nextcloud hashes
may appear on all objects, or only on objects which had a hash uploaded
-with them.
+with them. With Nextcloud, rclone asks the server to calculate the SHA1
+of uploads which had no hash to send, such as streamed uploads, and
+after setting the modification time, which discards the stored hash.
Standard options
@@ -68564,6 +69004,242 @@ Options:
Changelog
+v1.75.1 - 2026-09-04
+
+See commits
+
+- Security
+ - archive
+ - Fix zip slip path traversal in untrusted zip files
+ GHSA-66hp-wgxq-6f5q CVE-PENDING (Nick Craig-Wood)
+ - Hide any archive entry which escapes the directory being
+ listed GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Reject unsafe entry names when mounting squashfs images
+ GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix zip subdirectory root matching sibling directories
+ GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix zip entry named "." hiding every other file
+ GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix "directory not found" for archive paths containing "./"
+ or "//" GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - build
+ - Fix multiple CVEs by upgrading to go1.26.6 (Nick Craig-Wood)
+ - CVE-2026-56860: net/url: quadratic complexity in
+ resolvePath
+ - CVE-2026-56858: html/template: JavaScript regexp context
+ tracking
+ - CVE-2026-56862: crypto/tls: limit handshake messages
+ accepted post-handshake
+ - CVE-2026-56853: net/http: apply ReadHeaderTimeout to
+ unencrypted HTTP/2 check
+ - CVE-2026-56859: encoding/xml: recursion depth guard
+ during decode
+ - CVE-2026-33818: encoding/asn1: enforce maximum recursion
+ depth
+ - CVE-2026-46600: net: panic parsing an invalid SVCB or
+ HTTPS RR in dnsmessage
+ - CVE-2026-39821: net/http: reject ASCII-only
+ Punycode-encoded labels in idna
+ - Update golang.org/x/crypto to v0.56.0 to fix multiple CVEs
+ (Nick Craig-Wood)
+ - CVE-2026-56854: ssh: source-address critical option not
+ enforced for non-public-key auth callbacks
+ - CVE-2026-78662: ssh: a malicious peer could flood an
+ undecided channel's incoming requests, deadlocking the
+ connection
+ - CVE-2026-56855: ssh: a malicious peer could send crafted
+ messages on an established channel, deadlocking the
+ connection
+ - Update golang.org/x/image to v0.45.0 to fix CVE-2026-46603
+ (Nick Craig-Wood)
+ - CVE-2026-46603: excessive memory allocation during VP8L
+ decoding
+ - fs: Confine directory listing entries that escape the root
+ GHSA-3vxh-3pcx-9m8q GHSA-38xv-hf3p-h7mq CVE-PENDING (Nick
+ Craig-Wood)
+ - fshttp: Don't send --header values to other hosts on redirect
+ GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - http: Don't leak configured headers to other hosts or over
+ plaintext on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick
+ Craig-Wood)
+ - lib/rest: Check HTTPS downgrades against the original request on
+ redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - local
+ - Fix dir metadata escaping the root through a planted symlink
+ GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+ - Fix btime escaping the root via a planted symlink
+ GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+ - Fix panic on Range request past the end of a symlink
+ GHSA-p6m2-r3w9-mpxw CVE-PENDING (Nick Craig-Wood)
+ - serve docker
+ - Reject volume names that escape the base directory
+ GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - Reject volume names resolving to the base directory itself
+ GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - Re-derive volume mountpoint from name when restoring state
+ GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - serve ftp: Fix auth-proxy sessions sharing credentials by
+ username GHSA-c476-6w5q-jw77 CVE-PENDING (Nick Craig-Wood)
+ - serve s3
+ - Fix memory exhaustion from client-declared multipart part
+ size GHSA-2p48-j3qc-rx9f CVE-PENDING (Nick Craig-Wood)
+ - Reject bogus multipart part sizes in the reorder buffer
+ GHSA-2p48-j3qc-rx9f (Nick Craig-Wood)
+ - Fix auth proxy accepting any request signed with an empty
+ secret GHSA-xwwr-4h3p-r22c CVE-PENDING (Nick Craig-Wood)
+ - NB the auth proxy protocol for serve s3 has changed -
+ the proxy program is now given the access key ID as user
+ and must return the secret as _secret_access_key
+ - Fix each server accepting the --auth-key credentials of all
+ the others (Nick Craig-Wood)
+ - Fix misleading anonymous access log when using an auth proxy
+ via rc GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+ - serve sftp: Fix auth proxy configured via rc being silently
+ ignored GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+- Bug Fixes
+ - accounting
+ - Fix memory leak on long-running rcd (nielash)
+ - Fix memory leak from stats groups on long-running rcd
+ (nielash)
+ - Fix bwlimit burst overflow (Rayan Salhab)
+ - bisync
+ - Fix memory leak when running via the rc (nielash)
+ - Fix failed transfers of empty files being recorded as synced
+ (Nick Craig-Wood)
+ - build: Make go1.26 the minimum required version as needed by
+ golang.org/x/crypto v0.56.0 (Nick Craig-Wood)
+ - config: Redact env var config values in logs (Pastalikek65)
+ - doc fixes (Anton Karpov, CAOShurong, Dean Chen, Nick Craig-Wood,
+ Recoordinate, Rodrigo Rodrigues, Shantanav Mukherjee, shaurya)
+ - lib/batcher: Prevent commits racing shutdown (Loi Nguyen)
+ - lib/transform: Fix panic in truncate_keep_extension (VXNCXNX)
+ - multipart: Fix chunked uploads storing truncated objects when
+ the source ends early (Nick Craig-Wood)
+ - operations: Fix silent truncation of streaming uploads whose
+ source ends early (Nick Craig-Wood)
+ - serve
+ - Fix VFS instance leaks on server startup failures and
+ shutdown (Hakan İSMAİL)
+ - Pass the client IP address to the auth proxy
+ (am-at-enrollvb)
+ - serve http: Prevent scrolling to the top on page reload (Sune
+ Mølgaard)
+ - serve nfs: Fix EIO when creating symlinks with --vfs-links
+ (SillyZir)
+ - serve s3
+ - Fix failed uploads deleting or corrupting the object at the
+ key (Nick Craig-Wood)
+ - Fix crash when a multipart upload is aborted while a part is
+ uploading (Nick Craig-Wood)
+ - Fix modtime not being set when only mtime metadata is
+ supplied on PUT (Nick Craig-Wood)
+ - Upload all multipart uploads via the VFS so they obey
+ --bwlimit and show in stats (Nick Craig-Wood)
+ - Reserve the .rclone_temp_ prefix for temporary objects (Nick
+ Craig-Wood)
+ - Clean up abandoned multipart uploads after
+ --multipart-expiry (Nick Craig-Wood)
+ - vfscache
+ - Fix reader deadlock when the item size drops below the read
+ offset (Dave)
+ - Fix log message growing without bound on repeated write
+ errors (Vijay Misal)
+ - walk: Stop directory traversal when the context is cancelled
+ (Rahman Yilmaz)
+- VFS
+ - Synchronize poll updates with shutdown (Loi Nguyen)
+ - Make poll shutdown lifecycle deterministic (Loi Nguyen)
+- Crypt
+ - Fix hash mismatches with no_data_encryption on backends which
+ check upload hashes (Nick Craig-Wood)
+ - Fix directory names which look like versioned file names
+ (TowyTowy)
+ - Warn about directories with legacy version-like encrypted names
+ (Nick Craig-Wood)
+- Azure Blob
+ - Fix Entra ID server-side copy source authentication (Edward
+ Klesel)
+ - Fix spurious vfs cache corruption errors during chunked reads
+ (Nick Craig-Wood)
+- Azurefiles
+ - Fix zero padded files being created when the source ends early
+ (Nick Craig-Wood)
+- Box
+ - Fix truncated files being uploaded successfully when the source
+ ends early (Rohit Behera)
+- Compress
+ - Fix corrupted objects being created when the source ends early
+ (Nick Craig-Wood)
+- Drive
+ - Don't list trashed files when removing a directory into the
+ trash (alliasgher)
+- Dropbox
+ - Preserve Paper export paths on lookup (Loi Nguyen)
+ - Fix context cancellation (e.g. --max-duration limit) not
+ stopping in-flight requests (debaditya)
+ - Fix chunked uploads of truncated files never finishing (Nick
+ Craig-Wood)
+ - Don't retry chunked upload requests when the upload has been
+ cancelled (Nick Craig-Wood)
+ - Decode received shared-file names (Sanjay Kanth A)
+ - Fix ChangeNotify when the root's case differs from Dropbox's
+ (Loi Nguyen)
+- Filelu
+ - Fix truncated files being uploaded successfully when the source
+ ends early (Nick Craig-Wood)
+ - Fix duplicate root path during multipart folder creation
+ (kingston125)
+- Huaweidrive
+ - Fix truncated files being uploaded successfully when the source
+ ends early (Rohit Behera)
+- Iclouddrive
+ - Fix uploads into an app container failing with 412 (Christian De
+ Santis)
+- Internetarchive
+ - Fix corrupted files being created when the source ends early
+ (Nick Craig-Wood)
+- Internxt
+ - Persist rotated token returned by the user info call
+ (0rangeSeaW0lf)
+- Onedrive
+ - Fix 403 Forbidden for configuration personal onedrive (machsix)
+ - Fall back to manual drive ID entry when drive listing fails
+ (SillyZir)
+ - Don't retry multipart upload chunk on 404 (upload session not
+ found) (water)
+- Overview
+ - Fix "internal error: no overview data found" on 32 bit
+ architectures (Nick Craig-Wood)
+- Pikpak
+ - Fix truncated files being created when the source ends early
+ (Nick Craig-Wood)
+ - Fix truncated single part uploads reported as ok when source
+ ends early (Nick Craig-Wood)
+- Protondrive
+ - Fix files uploaded with v1.75.0 not being readable in the Proton
+ apps (Nick Craig-Wood)
+ - Fix corrupted uploads after a retried upload error (Nick
+ Craig-Wood)
+- Quatrix
+ - Fix chunk upload retries and fix memory leak (Nick Craig-Wood)
+- S3
+ - Update Mega endpoints (Nick Craig-Wood)
+ - Treat UploadPart success without ETag as retryable error
+ (CAOShurong)
+ - Fix server side copy failing with --s3-no-head-object (Anatoly
+ Tarnavsky)
+- Sia
+ - Fix corrupted files being created when the source ends early
+ (Nick Craig-Wood)
+- Smb
+ - Reuse the upload connection for SetModTime (alliasgher)
+- WebDAV
+ - Fix SetModTime failing and hashes missing on Nextcloud (Nick
+ Craig-Wood)
+- Yandex
+ - Fix truncated files being uploaded successfully when the source
+ ends early (Rohit Behera)
+
v1.75.0 - 2026-07-31
See commits
@@ -68573,15 +69249,15 @@ See commits
- Zero Services (ZERO-Z3)
- Security
- archive: Don't crash on malformed squashfs images
- GHSA-6jcg-q3wp-x2f4 CVE-PENDING (Nick Craig-Wood)
+ GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- ftp: Fix ftp command injection when encoding doesn't include
- CRLF GHSA-8c48-q9wj-3w37 CVE-PENDING (Nick Craig-Wood)
+ CRLF GHSA-8c48-q9wj-3w37 CVE-2026-71311 (Nick Craig-Wood)
- lib/http: Use TLS on all --addr listeners when --cert and --key
are set GHSA-mfvx-7rcj-9m5g (Nick Craig-Wood)
- lib/proxy: Fix unbounded HTTP CONNECT headers causing OOM
- GHSA-xhf4-832v-7xcr CVE-PENDING (Nick Craig-Wood)
+ GHSA-xhf4-832v-7xcr CVE-2026-71310 (Nick Craig-Wood)
- local: Stop source file names escaping the destination directory
- GHSA-7p4m-qxvv-g567 CVE-PENDING (Nick Craig-Wood)
+ GHSA-7p4m-qxvv-g567 CVE-2026-71313 (Nick Craig-Wood)
- rc
- Don't expose pprof debug handlers on an unauthenticated
server GHSA-mfvx-7rcj-9m5g CVE-PENDING (Nick Craig-Wood)
@@ -68597,11 +69273,11 @@ See commits
- serve ftp: Use constant time comparison for password check
GHSA-mfvx-7rcj-9m5g (Nick Craig-Wood)
- serve restic: Fix path traversal above the served directory
- GHSA-45pq-889g-fcgh CVE-PENDING (Nick Craig-Wood)
+ GHSA-45pq-889g-fcgh CVE-2026-71309 (Nick Craig-Wood)
- serve sftp: Don't crash the whole server on a bad request
GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- sftp: Fix command injection via crafted filenames on PowerShell
- remotes GHSA-2m8m-jhrm-w6j2 CVE-PENDING (Nick Craig-Wood)
+ remotes GHSA-2m8m-jhrm-w6j2 CVE-2026-71312 (Nick Craig-Wood)
- vfs: Don't crash the process if a backend panics on a background
goroutine GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
- webdav
diff --git a/docs/content/bisync.md b/docs/content/bisync.md
index 6198378cd..0577e924a 100644
--- a/docs/content/bisync.md
+++ b/docs/content/bisync.md
@@ -1059,11 +1059,12 @@ The following backends have known issues that need more investigation:
- [`TestBisyncRemoteLocal/normalization`](https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)
- [`TestBisyncLocalRemote/ext_paths`](https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)
- [`TestBisyncLocalRemote/extended_filenames`](https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)
- - [4 more](https://pub.rclone.org/integration-tests/current/)
+ - [3 more](https://pub.rclone.org/integration-tests/current/)
- `TestPcloud` (`pcloud`)
- - [`TestBisyncRemoteRemote/check_access`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
- - [`TestBisyncRemoteRemote/rmdirs`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
-- Updated: 2026-07-31-010017
+ - [`TestBisyncRemoteLocal/createemptysrcdirs`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+ - [`TestBisyncLocalRemote/resolve`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+ - [`TestBisyncRemoteRemote/createemptysrcdirs`](https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+- Updated: 2026-09-04-010006
The following backends either have not been tested recently or have known issues
diff --git a/docs/content/changelog.md b/docs/content/changelog.md
index e30db99e3..d386c2465 100644
--- a/docs/content/changelog.md
+++ b/docs/content/changelog.md
@@ -6,6 +6,149 @@ description: "Rclone Changelog"
# Changelog
+## v1.75.1 - 2026-09-04
+
+[See commits](https://github.com/rclone/rclone/compare/v1.75.0...v1.75.1)
+
+- Security
+ - archive
+ - Fix zip slip path traversal in untrusted zip files GHSA-66hp-wgxq-6f5q CVE-PENDING (Nick Craig-Wood)
+ - Hide any archive entry which escapes the directory being listed GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Reject unsafe entry names when mounting squashfs images GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix zip subdirectory root matching sibling directories GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix zip entry named "." hiding every other file GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - Fix "directory not found" for archive paths containing "./" or "//" GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+ - build
+ - Fix multiple CVEs by upgrading to go1.26.6 (Nick Craig-Wood)
+ - CVE-2026-56860: net/url: quadratic complexity in resolvePath
+ - CVE-2026-56858: html/template: JavaScript regexp context tracking
+ - CVE-2026-56862: crypto/tls: limit handshake messages accepted post-handshake
+ - CVE-2026-56853: net/http: apply ReadHeaderTimeout to unencrypted HTTP/2 check
+ - CVE-2026-56859: encoding/xml: recursion depth guard during decode
+ - CVE-2026-33818: encoding/asn1: enforce maximum recursion depth
+ - CVE-2026-46600: net: panic parsing an invalid SVCB or HTTPS RR in dnsmessage
+ - CVE-2026-39821: net/http: reject ASCII-only Punycode-encoded labels in idna
+ - Update golang.org/x/crypto to v0.56.0 to fix multiple CVEs (Nick Craig-Wood)
+ - CVE-2026-56854: ssh: source-address critical option not enforced for non-public-key auth callbacks
+ - CVE-2026-78662: ssh: a malicious peer could flood an undecided channel's incoming requests, deadlocking the connection
+ - CVE-2026-56855: ssh: a malicious peer could send crafted messages on an established channel, deadlocking the connection
+ - Update golang.org/x/image to v0.45.0 to fix CVE-2026-46603 (Nick Craig-Wood)
+ - CVE-2026-46603: excessive memory allocation during VP8L decoding
+ - fs: Confine directory listing entries that escape the root GHSA-3vxh-3pcx-9m8q GHSA-38xv-hf3p-h7mq CVE-PENDING (Nick Craig-Wood)
+ - fshttp: Don't send `--header` values to other hosts on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - http: Don't leak configured headers to other hosts or over plaintext on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - lib/rest: Check HTTPS downgrades against the original request on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+ - local
+ - Fix dir metadata escaping the root through a planted symlink GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+ - Fix btime escaping the root via a planted symlink GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+ - Fix panic on Range request past the end of a symlink GHSA-p6m2-r3w9-mpxw CVE-PENDING (Nick Craig-Wood)
+ - serve docker
+ - Reject volume names that escape the base directory GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - Reject volume names resolving to the base directory itself GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - Re-derive volume mountpoint from name when restoring state GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+ - serve ftp: Fix auth-proxy sessions sharing credentials by username GHSA-c476-6w5q-jw77 CVE-PENDING (Nick Craig-Wood)
+ - serve s3
+ - Fix memory exhaustion from client-declared multipart part size GHSA-2p48-j3qc-rx9f CVE-PENDING (Nick Craig-Wood)
+ - Reject bogus multipart part sizes in the reorder buffer GHSA-2p48-j3qc-rx9f (Nick Craig-Wood)
+ - Fix auth proxy accepting any request signed with an empty secret GHSA-xwwr-4h3p-r22c CVE-PENDING (Nick Craig-Wood)
+ - **NB** the auth proxy protocol for `serve s3` has changed - the proxy program is now given the access key ID as `user` and must return the secret as `_secret_access_key`
+ - Fix each server accepting the `--auth-key` credentials of all the others (Nick Craig-Wood)
+ - Fix misleading anonymous access log when using an auth proxy via rc GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+ - serve sftp: Fix auth proxy configured via rc being silently ignored GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+- Bug Fixes
+ - accounting
+ - Fix memory leak on long-running rcd (nielash)
+ - Fix memory leak from stats groups on long-running rcd (nielash)
+ - Fix bwlimit burst overflow (Rayan Salhab)
+ - bisync
+ - Fix memory leak when running via the rc (nielash)
+ - Fix failed transfers of empty files being recorded as synced (Nick Craig-Wood)
+ - build: Make go1.26 the minimum required version as needed by golang.org/x/crypto v0.56.0 (Nick Craig-Wood)
+ - config: Redact env var config values in logs (Pastalikek65)
+ - doc fixes (Anton Karpov, CAOShurong, Dean Chen, Nick Craig-Wood, Recoordinate, Rodrigo Rodrigues, Shantanav Mukherjee, shaurya)
+ - lib/batcher: Prevent commits racing shutdown (Loi Nguyen)
+ - lib/transform: Fix panic in `truncate_keep_extension` (VXNCXNX)
+ - multipart: Fix chunked uploads storing truncated objects when the source ends early (Nick Craig-Wood)
+ - operations: Fix silent truncation of streaming uploads whose source ends early (Nick Craig-Wood)
+ - serve
+ - Fix VFS instance leaks on server startup failures and shutdown (Hakan İSMAİL)
+ - Pass the client IP address to the auth proxy (am-at-enrollvb)
+ - serve http: Prevent scrolling to the top on page reload (Sune Mølgaard)
+ - serve nfs: Fix EIO when creating symlinks with `--vfs-links` (SillyZir)
+ - serve s3
+ - Fix failed uploads deleting or corrupting the object at the key (Nick Craig-Wood)
+ - Fix crash when a multipart upload is aborted while a part is uploading (Nick Craig-Wood)
+ - Fix modtime not being set when only mtime metadata is supplied on PUT (Nick Craig-Wood)
+ - Upload all multipart uploads via the VFS so they obey `--bwlimit` and show in stats (Nick Craig-Wood)
+ - Reserve the `.rclone_temp_` prefix for temporary objects (Nick Craig-Wood)
+ - Clean up abandoned multipart uploads after `--multipart-expiry` (Nick Craig-Wood)
+ - vfscache
+ - Fix reader deadlock when the item size drops below the read offset (Dave)
+ - Fix log message growing without bound on repeated write errors (Vijay Misal)
+ - walk: Stop directory traversal when the context is cancelled (Rahman Yilmaz)
+- VFS
+ - Synchronize poll updates with shutdown (Loi Nguyen)
+ - Make poll shutdown lifecycle deterministic (Loi Nguyen)
+- Crypt
+ - Fix hash mismatches with `no_data_encryption` on backends which check upload hashes (Nick Craig-Wood)
+ - Fix directory names which look like versioned file names (TowyTowy)
+ - Warn about directories with legacy version-like encrypted names (Nick Craig-Wood)
+- Azure Blob
+ - Fix Entra ID server-side copy source authentication (Edward Klesel)
+ - Fix spurious vfs cache corruption errors during chunked reads (Nick Craig-Wood)
+- Azurefiles
+ - Fix zero padded files being created when the source ends early (Nick Craig-Wood)
+- Box
+ - Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
+- Compress
+ - Fix corrupted objects being created when the source ends early (Nick Craig-Wood)
+- Drive
+ - Don't list trashed files when removing a directory into the trash (alliasgher)
+- Dropbox
+ - Preserve Paper export paths on lookup (Loi Nguyen)
+ - Fix context cancellation (e.g. `--max-duration` limit) not stopping in-flight requests (debaditya)
+ - Fix chunked uploads of truncated files never finishing (Nick Craig-Wood)
+ - Don't retry chunked upload requests when the upload has been cancelled (Nick Craig-Wood)
+ - Decode received shared-file names (Sanjay Kanth A)
+ - Fix ChangeNotify when the root's case differs from Dropbox's (Loi Nguyen)
+- Filelu
+ - Fix truncated files being uploaded successfully when the source ends early (Nick Craig-Wood)
+ - Fix duplicate root path during multipart folder creation (kingston125)
+- Huaweidrive
+ - Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
+- Iclouddrive
+ - Fix uploads into an app container failing with 412 (Christian De Santis)
+- Internetarchive
+ - Fix corrupted files being created when the source ends early (Nick Craig-Wood)
+- Internxt
+ - Persist rotated token returned by the user info call (0rangeSeaW0lf)
+- Onedrive
+ - Fix 403 Forbidden for configuration personal onedrive (machsix)
+ - Fall back to manual drive ID entry when drive listing fails (SillyZir)
+ - Don't retry multipart upload chunk on 404 (upload session not found) (water)
+- Overview
+ - Fix "internal error: no overview data found" on 32 bit architectures (Nick Craig-Wood)
+- Pikpak
+ - Fix truncated files being created when the source ends early (Nick Craig-Wood)
+ - Fix truncated single part uploads reported as ok when source ends early (Nick Craig-Wood)
+- Protondrive
+ - Fix files uploaded with v1.75.0 not being readable in the Proton apps (Nick Craig-Wood)
+ - Fix corrupted uploads after a retried upload error (Nick Craig-Wood)
+- Quatrix
+ - Fix chunk upload retries and fix memory leak (Nick Craig-Wood)
+- S3
+ - Update Mega endpoints (Nick Craig-Wood)
+ - Treat UploadPart success without ETag as retryable error (CAOShurong)
+ - Fix server side copy failing with `--s3-no-head-object` (Anatoly Tarnavsky)
+- Sia
+ - Fix corrupted files being created when the source ends early (Nick Craig-Wood)
+- Smb
+ - Reuse the upload connection for SetModTime (alliasgher)
+- WebDAV
+ - Fix SetModTime failing and hashes missing on Nextcloud (Nick Craig-Wood)
+- Yandex
+ - Fix truncated files being uploaded successfully when the source ends early (Rohit Behera)
+
## v1.75.0 - 2026-07-31
[See commits](https://github.com/rclone/rclone/compare/v1.74.0...v1.75.0)
diff --git a/docs/content/commands/rclone.md b/docs/content/commands/rclone.md
index 33446e0ae..7d36fbd8e 100644
--- a/docs/content/commands/rclone.md
+++ b/docs/content/commands/rclone.md
@@ -1107,7 +1107,7 @@ rclone [flags]
--use-json-log Use json log format
--use-mmap Use mmap allocator (see docs)
--use-server-modtime Use server modified time instead of object metadata
- --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.0")
+ --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.1")
-v, --verbose count Print lots more stuff (repeat for more)
-V, --version Print the version number
--webdav-auth-redirect Preserve authentication on redirect
diff --git a/docs/content/commands/rclone_convmv.md b/docs/content/commands/rclone_convmv.md
index 379c8e17a..1a7e1d263 100644
--- a/docs/content/commands/rclone_convmv.md
+++ b/docs/content/commands/rclone_convmv.md
@@ -231,12 +231,12 @@ rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,command=e
```console
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{YYYYMMDD}"
-// Output: stories/The Quick Brown Fox!-20260731
+// Output: stories/The Quick Brown Fox!-20260904
```
```console
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{macfriendlytime}"
-// Output: stories/The Quick Brown Fox!-2026-07-31 0340PM
+// Output: stories/The Quick Brown Fox!-2026-09-04 0450PM
```
```console
diff --git a/docs/content/commands/rclone_mount.md b/docs/content/commands/rclone_mount.md
index 89fff842a..0a9d18001 100644
--- a/docs/content/commands/rclone_mount.md
+++ b/docs/content/commands/rclone_mount.md
@@ -292,6 +292,11 @@ for all `mount` and `serve` commands on macOS. For details, see [vfs-case-sensit
### NFS mount
+For macOS (and other platforms where this path is supported), prefer the dedicated
+[rclone nfsmount](/commands/rclone_nfsmount/) command. It starts the NFS server and
+performs the mount for you. `rclone mount` itself still uses FUSE (macFUSE/FUSE-T)
+and does not switch to NFS via a flag.
+
This method spins up an NFS server using [serve nfs](/commands/rclone_serve_nfs/)
command and mounts it to the specified mountpoint. If you run this in background
mode using |--daemon|, you will need to send SIGTERM signal to the rclone process
@@ -629,7 +634,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -684,7 +689,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
diff --git a/docs/content/commands/rclone_nfsmount.md b/docs/content/commands/rclone_nfsmount.md
index f298ed210..5d7cca2cc 100644
--- a/docs/content/commands/rclone_nfsmount.md
+++ b/docs/content/commands/rclone_nfsmount.md
@@ -293,6 +293,11 @@ for all `mount` and `serve` commands on macOS. For details, see [vfs-case-sensit
### NFS mount
+For macOS (and other platforms where this path is supported), prefer the dedicated
+[rclone nfsmount](/commands/rclone_nfsmount/) command. It starts the NFS server and
+performs the mount for you. `rclone mount` itself still uses FUSE (macFUSE/FUSE-T)
+and does not switch to NFS via a flag.
+
This method spins up an NFS server using [serve nfs](/commands/rclone_serve_nfs/)
command and mounts it to the specified mountpoint. If you run this in background
mode using |--daemon|, you will need to send SIGTERM signal to the rclone process
@@ -630,7 +635,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -685,7 +690,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
diff --git a/docs/content/commands/rclone_serve_dlna.md b/docs/content/commands/rclone_serve_dlna.md
index c93394468..52d36dba4 100644
--- a/docs/content/commands/rclone_serve_dlna.md
+++ b/docs/content/commands/rclone_serve_dlna.md
@@ -100,7 +100,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -155,7 +155,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
diff --git a/docs/content/commands/rclone_serve_docker.md b/docs/content/commands/rclone_serve_docker.md
index c0674d67e..4337babd7 100644
--- a/docs/content/commands/rclone_serve_docker.md
+++ b/docs/content/commands/rclone_serve_docker.md
@@ -162,7 +162,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -217,7 +217,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
diff --git a/docs/content/commands/rclone_serve_ftp.md b/docs/content/commands/rclone_serve_ftp.md
index c8bb7c7b5..9892fb16a 100644
--- a/docs/content/commands/rclone_serve_ftp.md
+++ b/docs/content/commands/rclone_serve_ftp.md
@@ -93,7 +93,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -148,7 +148,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -545,9 +546,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -555,7 +557,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -565,10 +568,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -594,11 +631,12 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
diff --git a/docs/content/commands/rclone_serve_http.md b/docs/content/commands/rclone_serve_http.md
index 1ea78cae8..883eff598 100644
--- a/docs/content/commands/rclone_serve_http.md
+++ b/docs/content/commands/rclone_serve_http.md
@@ -236,7 +236,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -291,7 +291,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -688,9 +689,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -698,7 +700,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -708,10 +711,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -737,11 +774,12 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
diff --git a/docs/content/commands/rclone_serve_nfs.md b/docs/content/commands/rclone_serve_nfs.md
index 52a94b3e2..f922a66a1 100644
--- a/docs/content/commands/rclone_serve_nfs.md
+++ b/docs/content/commands/rclone_serve_nfs.md
@@ -167,7 +167,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -222,7 +222,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
diff --git a/docs/content/commands/rclone_serve_s3.md b/docs/content/commands/rclone_serve_s3.md
index c831576eb..0371eaf3c 100644
--- a/docs/content/commands/rclone_serve_s3.md
+++ b/docs/content/commands/rclone_serve_s3.md
@@ -26,6 +26,12 @@ docs](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)).
`--auth-key` is not provided then `serve s3` will allow anonymous
access.
+Alternatively `--auth-proxy` can be used to look up the secret for each
+access key ID and choose the backend it maps to (see [Auth
+Proxy](#auth-proxy) below). When an auth proxy is in use `--auth-key`
+is ignored and every request must be signed with the secret the proxy
+returns for its access key ID.
+
Like all rclone flags `--auth-key` can be set via environment
variables, in this case `RCLONE_AUTH_KEY`. Since this flag can be
repeated, the input to `RCLONE_AUTH_KEY` is CSV encoded. Because the
@@ -101,24 +107,73 @@ access_key_id = ACCESS_KEY_ID
secret_access_key = SECRET_ACCESS_KEY
```
+## Object uploads (PUT)
+
+A `PutObject` upload only ever changes the object at its key atomically, on
+success, a failed or interrupted PUT neither removes nor overwrites the
+object already stored at the key, and never leaves a partial object visible
+at it.
+
+Remotes that upload atomically (e.g. object stores such as `s3`) are streamed
+straight to the destination. On remotes where a partial upload would
+otherwise be visible (e.g. `local`), and whenever `--vfs-cache-mode` is
+`writes` or above, the upload is written to a temporary object that is
+renamed into place on success; these remotes need to support a server-side
+move or copy for this (nearly all do - without move or copy the upload is
+written directly and a failed PUT may leave a partial object at the key). If
+`serve s3` is killed part-way through an upload the temporary object (named
+with a leading `.rclone_temp_put_`) may be left behind; it is hidden from
+S3 listings but must be removed manually.
+
## Multipart uploads
-By default `serve s3` **streams** each multipart upload, in part-number
-order, into a single `PutStream` upload to the underlying remote, so the
-whole file is never buffered in memory - memory use stays bounded by the
-parts in flight. The remote then performs its own internal upload (for
-example its own multipart upload, still with bounded memory). This works
-for any remote that supports `PutStream`, which is nearly all of them,
-including through `crypt`.
-
-The upload is atomic so the destination object only ever changes on a
+Multipart uploads are written, in part-number order, to a temporary
+object which is renamed into place, server-side, on completion, so the
+upload is atomic. The object at the key only ever changes on a
successful completion. A failed or aborted upload never affects any
-object already stored under that name. Remotes that upload atomically
-already (object stores such as `s3`) are streamed straight to the
-destination. On remotes where a partial upload would otherwise be visible
-(such as `local`), the parts are streamed to a temporary object that is
-moved into place, server-side, on completion; these remotes therefore
-also need to support a server-side move or copy.
+object already stored under that name and a partly-uploaded object
+never becomes visible under it.
+
+With the default `--vfs-cache-mode off` `serve s3` **streams** each
+multipart upload, in part-number order, into a single streaming upload
+to the underlying remote, so the whole file is never buffered in
+memory. Memory use stays bounded by the parts in flight. The remote
+then performs its own internal upload (for example its own multipart
+upload, still with bounded memory). Remotes that don't support
+streaming uploads (those that must know the file size before the
+upload starts, such as `onedrive`, `pcloud`, `jottacloud`, `mailru`,
+`opendrive`, `putio`, `protondrive` and `zoho`) have the parts spooled
+to a temporary file on **local disk** instead, and uploaded with the
+size then known on completion, so they need local disk space for the
+largest objects in flight rather than memory.
+
+With `--vfs-cache-mode writes` (or `full`) the parts are written to a
+temporary file in the VFS cache and uploaded by the VFS write-back -
+see [Multipart uploads and the VFS
+cache](#multipart-uploads-and-the-vfs-cache) below.
+
+The rename into place needs the remote to support a server-side move
+or copy, which nearly all do. It is a cheap rename on most remotes,
+but on object stores without a real rename (such as `s3` itself) the
+move is performed as a server-side copy and delete of the whole
+object, which can take time and API calls for large objects.
+Concurrent multipart uploads of the same key (which S3 permits) are
+safe. Each writes its own temporary object and the last to complete
+wins.
+
+On the few remotes that support neither server side move nor copy, the
+parts are written straight to the destination object instead and never
+buffered in memory. This is at some cost in atomicity - the incomplete
+object is visible under its final name while the upload is in flight,
+as it also is for a plain object PUT on such remotes, and concurrent
+multipart uploads of the same key write to the same object and can
+interleave. A failed or aborted upload still leaves any pre-existing
+object untouched provided the remote uploads atomically and the VFS
+cache is off; on a remote where partial uploads are visible it may
+leave partial data at the key (like a plain PUT there), and with
+`--vfs-cache-mode writes` (or `full`) a write to the cache cannot be
+abandoned, so an aborted upload's partial data is written back to the
+remote as if it had completed.
**Features**
@@ -133,10 +188,14 @@ also need to support a server-side move or copy.
as one continuous stream.
- The destination object only ever changes atomically, on completion: an
aborted or failed upload leaves any pre-existing object of the same
- name untouched, and a partly-uploaded object never becomes visible.
-- Backend-agnostic - it only needs the remote to support `PutStream`
- (plus a server-side move or copy on remotes that don't upload
- atomically).
+ name untouched, and a partly-uploaded object never becomes visible
+ (except on the few remotes with no server-side move or copy, as
+ above).
+- Multipart uploads go through the VFS like any other upload, so they
+ show in rclone's transfer stats and obey `--bwlimit`.
+- Backend-agnostic - it only needs the remote to support a server-side
+ move or copy for the rename into place, which nearly all do; a remote
+ without streaming upload support spools to local disk as above.
**Limitations**
@@ -162,31 +221,121 @@ also need to support a server-side move or copy.
upload and the client must start it again. (The remote's own upload
still retries its internal chunks.)
- Parts are serialised into one stream, so ingest from the client is
- effectively single-threaded, although the remote's own upload still
- runs concurrently.
-- On remotes that don't upload atomically (such as `local`), the
- completed object is moved into place with a server-side operation.
- This is a cheap rename on most such remotes. On these remotes, if
- `serve s3` is killed part-way through an upload the temporary object
- (named with a leading `.rclone_multipart_upload_`) may be left behind;
- it is hidden from S3 listings but must be removed manually.
+ effectively single-threaded. When streaming, the remote's own upload
+ runs concurrently with the parts arriving; with the local disk spool
+ or the VFS cache the upload to the remote only starts on completion.
+- If `serve s3` is killed part-way through an upload the temporary
+ object (named with a leading `.rclone_temp_multipart_`) may be left
+ behind; it is hidden from S3 listings but must be removed manually.
+
+### Multipart uploads and the VFS cache
+
+With `--vfs-cache-mode writes` (or `full`) multipart uploads do not
+stream to the remote at all. The parts are written, in part-number
+order, to a temporary file in the VFS cache. On completion the file is
+renamed into place and uploaded by the VFS write-back, exactly like a
+plain object PUT. This needs no streaming upload support from the
+remote. The rename normally happens in the cache before the upload has
+started, but the VFS requires the remote to support a server-side move
+or copy to rename files at all (and uses one if the temporary file has
+already been written back, e.g. with `--vfs-write-back 0`). On remotes
+without either, the parts are written to the cache directly under the
+final key instead: the upload still never touches memory, but it loses
+its atomicity - the in-flight upload is visible at the key, and an
+aborted upload cannot be abandoned once in the cache, so its partial
+data is written back to the remote as if it were a completed object.
+
+Remotes that benefit from `--vfs-cache-mode writes`:
+
+- **Remotes over slow or unreliable links.** A failure in a streamed
+ upload aborts the whole multipart upload and the client must start
+ again from the first part; a failed write-back upload is retried by
+ the VFS (see `--vfs-cache-max-age` and friends) without the client
+ being involved. Ingest from the client also runs at local disk speed
+ rather than being throttled to the remote's pace.
+- **Workloads that read back or overwrite what they just wrote.** The
+ completed object stays in the cache, so subsequent `GET`/`HEAD`
+ requests are served locally, and plain PUTs and multipart uploads to
+ the same key go through the same cache entry so the last write wins
+ regardless of upload style.
+
+The trade-offs of the VFS cache:
+
+- The whole object lands on local disk, so the cache (`--cache-dir`)
+ needs space for the largest objects in flight; `--vfs-cache-max-size`
+ cannot evict files which are still being uploaded.
+- The `200 OK` for `CompleteMultipartUpload` means the data is safely
+ in the **local cache**, not yet on the remote - the same durability
+ the cache gives plain PUTs. If an acknowledgement must mean the data
+ has reached the remote (for example WAL archiving), use the default
+ `--vfs-cache-mode off`.
+- The upload to the remote only starts on completion, rather than
+ overlapping with the parts arriving, so the data reaches the remote
+ later than with streaming.
+- If `serve s3` is killed part-way through an upload, the temporary
+ file survives in the cache and the VFS cache recovery uploads it to
+ the remote on restart as a temporary object (named with a leading
+ `.rclone_temp_multipart_`); as with the streaming path, it is
+ hidden from S3 listings but must be removed manually.
+
+### Cleaning up temporary objects
+
+If `serve s3` is killed part-way through an upload it can leave a
+temporary object behind, named with a leading `.rclone_temp_`. This
+whole prefix is reserved: any object whose name (the last
+`/`-separated segment of its key) starts with `.rclone_temp_` is
+hidden from S3 listings, so don't give real objects such names - an
+existing object with such a name disappears from listings (though it
+stays accessible directly by its key: only listings hide reserved
+names, `GET`, `HEAD` and `DELETE` of the exact key still work). A
+temporary object never holds acknowledged data - uploads whose
+temporary object survived were never confirmed to the client - so old
+ones are safe to delete:
+
+ rclone delete --min-age 24h --include ".rclone_temp_*" remote:path
+
+The `--min-age` protects uploads which are still in progress: make sure
+it is longer than your longest upload, especially if several `serve s3`
+instances share the same remote.
+
+rclone v1.75 named its temporary multipart objects
+`.rclone_multipart_upload_*`; leftovers from an older server are also
+hidden from listings and can be cleaned up the same way.
+
+### Abandoned uploads
+
+A client which starts a multipart upload and vanishes without either
+completing or aborting it would otherwise hold on to its resources
+forever.
+
+An incomplete multipart upload which has had no activity for
+`--multipart-expiry` (default `24h`) is therefore aborted and cleaned
+up, exactly as if the client had called `AbortMultipartUpload`, and a
+`NOTICE` is logged.
+
+An upload with a part still being received is never expired, however
+slowly the part is arriving, and each completed part restarts the
+clock, so the expiry only needs to outlast the client's pauses
+*between* parts, not the whole upload.
+
+Late operations on an expired upload fail with `NoSuchUpload`, as they
+do on real S3 when a lifecycle rule has aborted the upload. Set
+`--multipart-expiry 0` to keep incomplete uploads forever.
### Disabling streaming
-If you pass `--disable-multipart-streaming`, or the remote doesn't
-support `PutStream` (or doesn't upload atomically and can't move or copy
-server-side), multipart uploads are instead **buffered in memory**
-by the underlying S3 library: every part is held in memory and the whole
-object is written out in one go when the upload completes (the previous
-behaviour). This removes the in-order/contiguous-part restriction above,
-so parts can be uploaded in any order, but **memory use grows with the
-size of the upload**, so it is only suitable for small objects. A one-off
-`NOTICE` is logged the first time this happens.
-
-Alternatively, if the client is an rclone `s3` remote (like the
-`[serves3]` example above), you can set `use_multipart_uploads = false`
-on it so it uploads each object as a single stream and skips multipart
-uploads altogether.
+If you pass `--disable-multipart-streaming`, multipart uploads are
+instead **buffered in memory** by the underlying S3 library: every
+part is held in memory and the whole object is written out in one go
+when the upload completes. This removes the in-order/contiguous-part
+restriction above, so parts can be uploaded in any order, but **memory
+use grows with the size of the upload**, so it is only suitable for
+small objects. A one-off `NOTICE` is logged the first time this
+happens. This flag is the only thing that makes multipart uploads
+buffer in memory - it is never done because of missing remote
+capabilities. Consider `--vfs-cache-mode writes` instead, which
+buffers the upload in the VFS cache on disk and takes precedence over
+`--disable-multipart-streaming`.
## Bugs
@@ -436,7 +585,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -491,7 +640,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -862,6 +1012,127 @@ If the file has no metadata it will be returned as `{}` and if there
is an error reading the metadata the error will be returned as
`{"error":"error string"}`.
+## Auth Proxy
+
+If you supply the parameter `--auth-proxy /path/to/program` then
+rclone will use that program to generate backends on the fly which
+then are used to authenticate incoming requests. This uses a simple
+JSON based protocol with input on STDIN and output on STDOUT.
+
+**PLEASE NOTE:** `--auth-proxy` and `--authorized-keys` cannot be used
+together, if `--auth-proxy` is set the authorized keys option will be
+ignored.
+
+There is an example program
+[bin/test_proxy.py](https://github.com/rclone/rclone/blob/master/bin/test_proxy.py)
+in the rclone source code.
+
+The program's job is to take a `user` and `pass` on the input and turn
+those into the config for a backend on STDOUT in JSON format. This
+config will have any default parameters for the backend added, but it
+won't use configuration from environment variables or command line
+options - it is the job of the proxy program to make a complete
+config.
+
+This config generated must have this extra parameter
+
+- `_root` - root to use for the backend
+
+And it may have these parameters
+
+- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
+
+If password authentication was used by the client, input to the proxy
+process (on STDIN) would look similar to this:
+
+```json
+{
+ "user": "me",
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
+}
+```
+
+If public-key authentication was used by the client, input to the
+proxy process (on STDIN) would look similar to this:
+
+```json
+{
+ "user": "me",
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
+}
+```
+
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
+And as an example return this on STDOUT
+
+```json
+{
+ "type": "sftp",
+ "_root": "",
+ "_obscure": "pass",
+ "user": "me",
+ "pass": "mypassword",
+ "host": "sftp.example.com"
+}
+```
+
+This would mean that an SFTP backend would be created on the fly for
+the `user` and `pass`/`public_key` returned in the output to the host given. Note
+that since `_obscure` is set to `pass`, rclone will obscure the `pass`
+parameter before creating the backend (which is required for sftp
+backends).
+
+The program can manipulate the supplied `user` in any way, for example
+to make proxy to many different sftp backends, you could make the
+`user` be `user@example.com` and then set the `host` to `example.com`
+in the output and the user to `user`. For security you'd probably want
+to restrict the `host` to a limited list.
+
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
+
+This can be used to build general purpose proxies to any kind of
+backend that rclone supports.
+
```
rclone serve s3 remote:path [flags]
```
@@ -878,7 +1149,7 @@ rclone serve s3 remote:path [flags]
--client-ca string Client certificate authority to verify clients with
--dir-cache-time Duration Time to cache directory entries for (default 5m0s)
--dir-perms FileMode Directory permissions (default 777)
- --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend (see the Multipart uploads docs section)
+ --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend
--etag-hash string Which hash to use for the ETag, or auto or blank for off (default "MD5")
--file-perms FileMode File permissions (default 666)
--force-path-style If true use path style access if false use virtual hosted style (default true)
@@ -889,7 +1160,8 @@ rclone serve s3 remote:path [flags]
--link-perms FileMode Link permissions (default 666)
--max-header-bytes int Maximum size of request header (default 4096)
--min-tls-version string Minimum TLS version that is acceptable (default "tls1.0")
- --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (see the Multipart uploads docs section) (default 256Mi)
+ --multipart-expiry Duration Abort incomplete multipart uploads idle for longer than this, 0 to keep forever (default 1d)
+ --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (default 256Mi)
--no-checksum Don't compare checksums on up/download
--no-cleanup Not to cleanup empty folder after object is deleted
--no-modtime Don't read/write the modification time (can speed things up)
diff --git a/docs/content/commands/rclone_serve_sftp.md b/docs/content/commands/rclone_serve_sftp.md
index d74f23bea..9cb078885 100644
--- a/docs/content/commands/rclone_serve_sftp.md
+++ b/docs/content/commands/rclone_serve_sftp.md
@@ -140,7 +140,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -195,7 +195,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -592,9 +593,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -602,7 +604,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -612,10 +615,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -641,11 +678,12 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
diff --git a/docs/content/commands/rclone_serve_webdav.md b/docs/content/commands/rclone_serve_webdav.md
index 3196a03ab..afdc3f140 100644
--- a/docs/content/commands/rclone_serve_webdav.md
+++ b/docs/content/commands/rclone_serve_webdav.md
@@ -313,7 +313,7 @@ at all times. The buffered data is bound to one open file and won't be
shared.
This flag is a upper limit for the used memory per open file. The
-buffer will only use memory for data that is downloaded but not not
+buffer will only use memory for data that is downloaded but not
yet read. If the buffer is empty, only a small amount of memory will
be used.
@@ -368,7 +368,8 @@ longest. This cache flushing strategy is efficient and more relevant
files are likely to remain cached.
The `--vfs-cache-max-age` will evict files from the cache
-after the set time since last access has passed. The default value of
+after the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache. The default value of
1 hour will start evicting files from cache that haven't been accessed
for 1 hour. When a cached file is accessed the 1 hour timer is reset to 0
and will wait for 1 more hour before evicting. Specify the time with
@@ -765,9 +766,10 @@ This config generated must have this extra parameter
- `_root` - root to use for the backend
-And it may have this parameter
+And it may have these parameters
- `_obscure` - comma separated strings for parameters to obscure
+- `_secret_access_key` - the secret for S3 access key auth (see below)
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -775,7 +777,8 @@ process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "pass": "mypassword"
+ "pass": "mypassword",
+ "client_ip": "192.168.1.1"
}
```
@@ -785,10 +788,44 @@ proxy process (on STDIN) would look similar to this:
```json
{
"user": "me",
- "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf"
+ "public_key": "AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf",
+ "client_ip": "192.168.1.1"
}
```
+If the client authenticated with an S3 access key (`rclone serve s3`),
+the client never sends its secret, only a signature made with it, so
+the input contains just the access key ID as the `user` with no `pass`
+or `public_key`:
+
+```json
+{
+ "user": "AKIAIOSFODNN7EXAMPLE",
+ "client_ip": "192.168.1.1"
+}
+```
+
+In this case the program must look up the secret access key for that
+access key ID and return it in the `_secret_access_key` field of the
+output. Rclone then uses that secret to verify the signature on the
+request, refusing the request if it does not match. This means the
+proxy program is the source of truth for both the credentials and the
+backend they map to. If the program does not return
+`_secret_access_key` or returns it empty the request is refused.
+
+The program's answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access
+key ID is in constant use, so revoking an access key ID in the
+program takes effect within 5 minutes. A rotated secret takes effect
+on the first request signed with it.
+
+The `client_ip` key holds the IP address the client connected from,
+without a port number. It can be used to restrict logins to certain
+networks, or to log authentication attempts centrally. It is omitted if
+the client has no IP address, for example when connecting over a unix
+socket. Note that if rclone is behind a reverse proxy this will be the
+address of the reverse proxy and not the original client.
+
And as an example return this on STDOUT
```json
@@ -814,11 +851,12 @@ to make proxy to many different sftp backends, you could make the
in the output and the user to `user`. For security you'd probably want
to restrict the `host` to a limited list.
-An internal cache of backends is keyed on the `user` and a hash of the
-`pass` or `public_key`. This means that if a user's password or
-public-key changes, or the proxy returns different config parameters
-(eg a rotated `api_key`), a fresh backend will be created on the next
-request rather than the cached one being reused.
+An internal cache of backends is keyed on the `user`, a hash of the
+`pass` or `public_key`, and the `client_ip`. This means that if a
+user's password or public-key changes, the client connects from a new IP
+address, or the proxy returns different config parameters (eg a rotated
+`api_key`), a fresh backend will be created on the next request rather
+than the cached one being reused.
This can be used to build general purpose proxies to any kind of
backend that rclone supports.
diff --git a/docs/content/flags.md b/docs/content/flags.md
index 335608f0a..18a43fd0a 100644
--- a/docs/content/flags.md
+++ b/docs/content/flags.md
@@ -121,7 +121,7 @@ Flags for general networking and HTTP stuff.
--tpslimit float Limit HTTP transactions per second to this
--tpslimit-burst int Max burst of transactions for --tpslimit (default 1)
--use-cookies Enable session cookiejar
- --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.0")
+ --user-agent string Set the user-agent to a specified string (default "rclone/v1.75.1")
```
diff --git a/docs/content/http.md b/docs/content/http.md
index 98fe9051d..5e1a320ff 100644
--- a/docs/content/http.md
+++ b/docs/content/http.md
@@ -210,6 +210,12 @@ For example, to set a Cookie use 'Cookie,name=value', or '"Cookie","name=value"'
You can set multiple headers, e.g. '"Cookie","name=value","Authorization","xxx"'.
+The headers are only sent to the host in the configured URL. If the
+server redirects to another host (including a subdomain or a different
+port) the headers are not sent to it, or to any further hop in that
+redirect chain. When headers are set, a redirect from https to http is
+refused as it would send them in cleartext.
+
Properties:
- Config: headers
diff --git a/docs/content/s3.md b/docs/content/s3.md
index 98962229d..96aff4a5b 100644
--- a/docs/content/s3.md
+++ b/docs/content/s3.md
@@ -2291,38 +2291,47 @@ Properties:
- "br-ne1.magaluobjects.com"
- Fortaleza, CE (BR), br-ne1
- Provider: Magalu
- - "s3.eu-amsterdam.megas4.com"
- - Mega S4 Amsterdam
+ - "s3.eu-luxembourg-1.megas4.com"
+ - Mega S4 Luxembourg 1
- Provider: Mega
- - "s3.eu-luxembourg.megas4.com"
- - Mega S4 Luxembourg
+ - "s3.eu-luxembourg-2.megas4.com"
+ - Mega S4 Luxembourg 2
- Provider: Mega
- - "s3.eu-paris.megas4.com"
- - Mega S4 Paris
+ - "s3.eu-amsterdam-1.megas4.com"
+ - Mega S4 Amsterdam 1
- Provider: Mega
- - "s3.eu-barcelona.megas4.com"
- - Mega S4 Barcelona
+ - "s3.eu-amsterdam-2.megas4.com"
+ - Mega S4 Amsterdam 2
- Provider: Mega
- - "s3.ca-montreal.megas4.com"
- - Mega S4 Montreal
+ - "s3.eu-paris-1.megas4.com"
+ - Mega S4 Paris 1
- Provider: Mega
- - "s3.ca-vancouver.megas4.com"
- - Mega S4 Vancouver
+ - "s3.eu-paris-2.megas4.com"
+ - Mega S4 Paris 2
- Provider: Mega
- - "s3.ap-tokyo.megas4.com"
- - Mega S4 Tokyo
+ - "s3.eu-barcelona-1.megas4.com"
+ - Mega S4 Barcelona 1
- Provider: Mega
- - "s3.eu-central-1.s4.mega.io"
- - Mega S4 eu-central-1 (Amsterdam, legacy)
+ - "s3.eu-barcelona-2.megas4.com"
+ - Mega S4 Barcelona 2
- Provider: Mega
- - "s3.eu-central-2.s4.mega.io"
- - Mega S4 eu-central-2 (Bettembourg, legacy)
+ - "s3.ca-montreal-1.megas4.com"
+ - Mega S4 Montreal 1
- Provider: Mega
- - "s3.ca-central-1.s4.mega.io"
- - Mega S4 ca-central-1 (Montreal, legacy)
+ - "s3.ca-montreal-2.megas4.com"
+ - Mega S4 Montreal 2
- Provider: Mega
- - "s3.ca-west-1.s4.mega.io"
- - Mega S4 ca-west-1 (Vancouver, legacy)
+ - "s3.ca-vancouver-1.megas4.com"
+ - Mega S4 Vancouver 1
+ - Provider: Mega
+ - "s3.ca-vancouver-2.megas4.com"
+ - Mega S4 Vancouver 2
+ - Provider: Mega
+ - "s3.ap-tokyo-1.megas4.com"
+ - Mega S4 Tokyo 1
+ - Provider: Mega
+ - "s3.ap-tokyo-2.megas4.com"
+ - Mega S4 Tokyo 2
- Provider: Mega
- "oos.eu-west-2.outscale.com"
- Outscale EU West 2 (Paris)
diff --git a/lib/transform/transform.md b/lib/transform/transform.md
index 5e6bab81f..54d7b84b6 100644
--- a/lib/transform/transform.md
+++ b/lib/transform/transform.md
@@ -218,12 +218,12 @@ rclone convmv "stories/The Quick Brown Fox!.txt" --name-transform "all,command=e
```console
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{YYYYMMDD}"
-// Output: stories/The Quick Brown Fox!-20260731
+// Output: stories/The Quick Brown Fox!-20260904
```
```console
rclone convmv "stories/The Quick Brown Fox!" --name-transform "date=-{macfriendlytime}"
-// Output: stories/The Quick Brown Fox!-2026-07-31 0455PM
+// Output: stories/The Quick Brown Fox!-2026-09-04 0502PM
```
```console
diff --git a/rclone.1 b/rclone.1
index 38b3c5526..efd66cf5c 100644
--- a/rclone.1
+++ b/rclone.1
@@ -15,7 +15,7 @@
. ftr VB CB
. ftr VBI CBI
.\}
-.TH "rclone" "1" "Jul 31, 2026" "User Manual" ""
+.TH "rclone" "1" "Sep 04, 2026" "User Manual" ""
.hy
.SH NAME
.PP
@@ -961,7 +961,7 @@ Its current version is as below.
.SS Source installation
.PP
Make sure you have git and Go (https://golang.org/) installed.
-Go version 1.25 or newer is required, the latest release is recommended.
+Go version 1.26 or newer is required, the latest release is recommended.
You can get it from your package manager, or download it from
golang.org/dl (https://golang.org/dl/).
Then you can run the following:
@@ -6393,14 +6393,14 @@ rclone convmv \[dq]stories/The Quick Brown Fox!.txt\[dq] --name-transform \[dq]a
.nf
\f[C]
rclone convmv \[dq]stories/The Quick Brown Fox!\[dq] --name-transform \[dq]date=-{YYYYMMDD}\[dq]
-// Output: stories/The Quick Brown Fox!-20260731
+// Output: stories/The Quick Brown Fox!-20260904
\f[R]
.fi
.IP
.nf
\f[C]
rclone convmv \[dq]stories/The Quick Brown Fox!\[dq] --name-transform \[dq]date=-{macfriendlytime}\[dq]
-// Output: stories/The Quick Brown Fox!-2026-07-31 0340PM
+// Output: stories/The Quick Brown Fox!-2026-09-04 0450PM
\f[R]
.fi
.IP
@@ -8592,6 +8592,13 @@ For details, see
vfs-case-sensitivity (https://rclone.org/commands/rclone_mount/#vfs-case-sensitivity).
.SS NFS mount
.PP
+For macOS (and other platforms where this path is supported), prefer the
+dedicated rclone nfsmount (https://rclone.org/commands/rclone_nfsmount/)
+command.
+It starts the NFS server and performs the mount for you.
+\f[V]rclone mount\f[R] itself still uses FUSE (macFUSE/FUSE-T) and does
+not switch to NFS via a flag.
+.PP
This method spins up an NFS server using serve
nfs (https://rclone.org/commands/rclone_serve_nfs/) command and mounts
it to the specified mountpoint.
@@ -8993,8 +9000,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -9056,7 +9063,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -10319,6 +10327,13 @@ For details, see
vfs-case-sensitivity (https://rclone.org/commands/rclone_mount/#vfs-case-sensitivity).
.SS NFS mount
.PP
+For macOS (and other platforms where this path is supported), prefer the
+dedicated rclone nfsmount (https://rclone.org/commands/rclone_nfsmount/)
+command.
+It starts the NFS server and performs the mount for you.
+\f[V]rclone mount\f[R] itself still uses FUSE (macFUSE/FUSE-T) and does
+not switch to NFS via a flag.
+.PP
This method spins up an NFS server using serve
nfs (https://rclone.org/commands/rclone_serve_nfs/) command and mounts
it to the specified mountpoint.
@@ -10721,8 +10736,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -10784,7 +10799,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -12263,8 +12279,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -12326,7 +12342,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -13028,8 +13045,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -13091,7 +13108,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -13726,8 +13744,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -13789,7 +13807,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -14243,9 +14262,12 @@ This config generated must have this extra parameter
.IP \[bu] 2
\f[V]_root\f[R] - root to use for the backend
.PP
-And it may have this parameter
+And it may have these parameters
.IP \[bu] 2
\f[V]_obscure\f[R] - comma separated strings for parameters to obscure
+.IP \[bu] 2
+\f[V]_secret_access_key\f[R] - the secret for S3 access key auth (see
+below)
.PP
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -14254,7 +14276,8 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]pass\[dq]: \[dq]mypassword\[dq]
+ \[dq]pass\[dq]: \[dq]mypassword\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
@@ -14266,11 +14289,51 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq]
+ \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
.PP
+If the client authenticated with an S3 access key
+(\f[V]rclone serve s3\f[R]), the client never sends its secret, only a
+signature made with it, so the input contains just the access key ID as
+the \f[V]user\f[R] with no \f[V]pass\f[R] or \f[V]public_key\f[R]:
+.IP
+.nf
+\f[C]
+{
+ \[dq]user\[dq]: \[dq]AKIAIOSFODNN7EXAMPLE\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
+}
+\f[R]
+.fi
+.PP
+In this case the program must look up the secret access key for that
+access key ID and return it in the \f[V]_secret_access_key\f[R] field of
+the output.
+Rclone then uses that secret to verify the signature on the request,
+refusing the request if it does not match.
+This means the proxy program is the source of truth for both the
+credentials and the backend they map to.
+If the program does not return \f[V]_secret_access_key\f[R] or returns
+it empty the request is refused.
+.PP
+The program\[aq]s answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes.
+A rotated secret takes effect on the first request signed with it.
+.PP
+The \f[V]client_ip\f[R] key holds the IP address the client connected
+from, without a port number.
+It can be used to restrict logins to certain networks, or to log
+authentication attempts centrally.
+It is omitted if the client has no IP address, for example when
+connecting over a unix socket.
+Note that if rclone is behind a reverse proxy this will be the address
+of the reverse proxy and not the original client.
+.PP
And as an example return this on STDOUT
.IP
.nf
@@ -14301,12 +14364,12 @@ the \f[V]user\f[R] be \f[V]user\[at]example.com\f[R] and then set the
For security you\[aq]d probably want to restrict the \f[V]host\f[R] to a
limited list.
.PP
-An internal cache of backends is keyed on the \f[V]user\f[R] and a hash
-of the \f[V]pass\f[R] or \f[V]public_key\f[R].
-This means that if a user\[aq]s password or public-key changes, or the
-proxy returns different config parameters (eg a rotated
-\f[V]api_key\f[R]), a fresh backend will be created on the next request
-rather than the cached one being reused.
+An internal cache of backends is keyed on the \f[V]user\f[R], a hash of
+the \f[V]pass\f[R] or \f[V]public_key\f[R], and the \f[V]client_ip\f[R].
+This means that if a user\[aq]s password or public-key changes, the
+client connects from a new IP address, or the proxy returns different
+config parameters (eg a rotated \f[V]api_key\f[R]), a fresh backend will
+be created on the next request rather than the cached one being reused.
.PP
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -14777,8 +14840,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -14840,7 +14903,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -15294,9 +15358,12 @@ This config generated must have this extra parameter
.IP \[bu] 2
\f[V]_root\f[R] - root to use for the backend
.PP
-And it may have this parameter
+And it may have these parameters
.IP \[bu] 2
\f[V]_obscure\f[R] - comma separated strings for parameters to obscure
+.IP \[bu] 2
+\f[V]_secret_access_key\f[R] - the secret for S3 access key auth (see
+below)
.PP
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -15305,7 +15372,8 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]pass\[dq]: \[dq]mypassword\[dq]
+ \[dq]pass\[dq]: \[dq]mypassword\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
@@ -15317,11 +15385,51 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq]
+ \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
.PP
+If the client authenticated with an S3 access key
+(\f[V]rclone serve s3\f[R]), the client never sends its secret, only a
+signature made with it, so the input contains just the access key ID as
+the \f[V]user\f[R] with no \f[V]pass\f[R] or \f[V]public_key\f[R]:
+.IP
+.nf
+\f[C]
+{
+ \[dq]user\[dq]: \[dq]AKIAIOSFODNN7EXAMPLE\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
+}
+\f[R]
+.fi
+.PP
+In this case the program must look up the secret access key for that
+access key ID and return it in the \f[V]_secret_access_key\f[R] field of
+the output.
+Rclone then uses that secret to verify the signature on the request,
+refusing the request if it does not match.
+This means the proxy program is the source of truth for both the
+credentials and the backend they map to.
+If the program does not return \f[V]_secret_access_key\f[R] or returns
+it empty the request is refused.
+.PP
+The program\[aq]s answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes.
+A rotated secret takes effect on the first request signed with it.
+.PP
+The \f[V]client_ip\f[R] key holds the IP address the client connected
+from, without a port number.
+It can be used to restrict logins to certain networks, or to log
+authentication attempts centrally.
+It is omitted if the client has no IP address, for example when
+connecting over a unix socket.
+Note that if rclone is behind a reverse proxy this will be the address
+of the reverse proxy and not the original client.
+.PP
And as an example return this on STDOUT
.IP
.nf
@@ -15352,12 +15460,12 @@ the \f[V]user\f[R] be \f[V]user\[at]example.com\f[R] and then set the
For security you\[aq]d probably want to restrict the \f[V]host\f[R] to a
limited list.
.PP
-An internal cache of backends is keyed on the \f[V]user\f[R] and a hash
-of the \f[V]pass\f[R] or \f[V]public_key\f[R].
-This means that if a user\[aq]s password or public-key changes, or the
-proxy returns different config parameters (eg a rotated
-\f[V]api_key\f[R]), a fresh backend will be created on the next request
-rather than the cached one being reused.
+An internal cache of backends is keyed on the \f[V]user\f[R], a hash of
+the \f[V]pass\f[R] or \f[V]public_key\f[R], and the \f[V]client_ip\f[R].
+This means that if a user\[aq]s password or public-key changes, the
+client connects from a new IP address, or the proxy returns different
+config parameters (eg a rotated \f[V]api_key\f[R]), a fresh backend will
+be created on the next request rather than the cached one being reused.
.PP
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -15655,8 +15763,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -15718,7 +15826,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -16536,6 +16645,13 @@ docs (https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)).
If \f[V]--auth-key\f[R] is not provided then \f[V]serve s3\f[R] will
allow anonymous access.
.PP
+Alternatively \f[V]--auth-proxy\f[R] can be used to look up the secret
+for each access key ID and choose the backend it maps to (see Auth Proxy
+below).
+When an auth proxy is in use \f[V]--auth-key\f[R] is ignored and every
+request must be signed with the secret the proxy returns for its access
+key ID.
+.PP
Like all rclone flags \f[V]--auth-key\f[R] can be set via environment
variables, in this case \f[V]RCLONE_AUTH_KEY\f[R].
Since this flag can be repeated, the input to \f[V]RCLONE_AUTH_KEY\f[R]
@@ -16626,27 +16742,79 @@ access_key_id = ACCESS_KEY_ID
secret_access_key = SECRET_ACCESS_KEY
\f[R]
.fi
+.SS Object uploads (PUT)
+.PP
+A \f[V]PutObject\f[R] upload only ever changes the object at its key
+atomically, on success, a failed or interrupted PUT neither removes nor
+overwrites the object already stored at the key, and never leaves a
+partial object visible at it.
+.PP
+Remotes that upload atomically (e.g.
+object stores such as \f[V]s3\f[R]) are streamed straight to the
+destination.
+On remotes where a partial upload would otherwise be visible (e.g.
+\f[V]local\f[R]), and whenever \f[V]--vfs-cache-mode\f[R] is
+\f[V]writes\f[R] or above, the upload is written to a temporary object
+that is renamed into place on success; these remotes need to support a
+server-side move or copy for this (nearly all do - without move or copy
+the upload is written directly and a failed PUT may leave a partial
+object at the key).
+If \f[V]serve s3\f[R] is killed part-way through an upload the temporary
+object (named with a leading \f[V].rclone_temp_put_\f[R]) may be left
+behind; it is hidden from S3 listings but must be removed manually.
.SS Multipart uploads
.PP
-By default \f[V]serve s3\f[R] \f[B]streams\f[R] each multipart upload,
-in part-number order, into a single \f[V]PutStream\f[R] upload to the
-underlying remote, so the whole file is never buffered in memory -
-memory use stays bounded by the parts in flight.
+Multipart uploads are written, in part-number order, to a temporary
+object which is renamed into place, server-side, on completion, so the
+upload is atomic.
+The object at the key only ever changes on a successful completion.
+A failed or aborted upload never affects any object already stored under
+that name and a partly-uploaded object never becomes visible under it.
+.PP
+With the default \f[V]--vfs-cache-mode off\f[R] \f[V]serve s3\f[R]
+\f[B]streams\f[R] each multipart upload, in part-number order, into a
+single streaming upload to the underlying remote, so the whole file is
+never buffered in memory.
+Memory use stays bounded by the parts in flight.
The remote then performs its own internal upload (for example its own
multipart upload, still with bounded memory).
-This works for any remote that supports \f[V]PutStream\f[R], which is
-nearly all of them, including through \f[V]crypt\f[R].
+Remotes that don\[aq]t support streaming uploads (those that must know
+the file size before the upload starts, such as \f[V]onedrive\f[R],
+\f[V]pcloud\f[R], \f[V]jottacloud\f[R], \f[V]mailru\f[R],
+\f[V]opendrive\f[R], \f[V]putio\f[R], \f[V]protondrive\f[R] and
+\f[V]zoho\f[R]) have the parts spooled to a temporary file on \f[B]local
+disk\f[R] instead, and uploaded with the size then known on completion,
+so they need local disk space for the largest objects in flight rather
+than memory.
.PP
-The upload is atomic so the destination object only ever changes on a
-successful completion.
-A failed or aborted upload never affects any object already stored under
-that name.
-Remotes that upload atomically already (object stores such as
-\f[V]s3\f[R]) are streamed straight to the destination.
-On remotes where a partial upload would otherwise be visible (such as
-\f[V]local\f[R]), the parts are streamed to a temporary object that is
-moved into place, server-side, on completion; these remotes therefore
-also need to support a server-side move or copy.
+With \f[V]--vfs-cache-mode writes\f[R] (or \f[V]full\f[R]) the parts are
+written to a temporary file in the VFS cache and uploaded by the VFS
+write-back - see Multipart uploads and the VFS cache below.
+.PP
+The rename into place needs the remote to support a server-side move or
+copy, which nearly all do.
+It is a cheap rename on most remotes, but on object stores without a
+real rename (such as \f[V]s3\f[R] itself) the move is performed as a
+server-side copy and delete of the whole object, which can take time and
+API calls for large objects.
+Concurrent multipart uploads of the same key (which S3 permits) are
+safe.
+Each writes its own temporary object and the last to complete wins.
+.PP
+On the few remotes that support neither server side move nor copy, the
+parts are written straight to the destination object instead and never
+buffered in memory.
+This is at some cost in atomicity - the incomplete object is visible
+under its final name while the upload is in flight, as it also is for a
+plain object PUT on such remotes, and concurrent multipart uploads of
+the same key write to the same object and can interleave.
+A failed or aborted upload still leaves any pre-existing object
+untouched provided the remote uploads atomically and the VFS cache is
+off; on a remote where partial uploads are visible it may leave partial
+data at the key (like a plain PUT there), and with
+\f[V]--vfs-cache-mode writes\f[R] (or \f[V]full\f[R]) a write to the
+cache cannot be abandoned, so an aborted upload\[aq]s partial data is
+written back to the remote as if it had completed.
.PP
\f[B]Features\f[R]
.IP \[bu] 2
@@ -16665,11 +16833,15 @@ encrypted as one continuous stream.
.IP \[bu] 2
The destination object only ever changes atomically, on completion: an
aborted or failed upload leaves any pre-existing object of the same name
-untouched, and a partly-uploaded object never becomes visible.
+untouched, and a partly-uploaded object never becomes visible (except on
+the few remotes with no server-side move or copy, as above).
.IP \[bu] 2
-Backend-agnostic - it only needs the remote to support
-\f[V]PutStream\f[R] (plus a server-side move or copy on remotes that
-don\[aq]t upload atomically).
+Multipart uploads go through the VFS like any other upload, so they show
+in rclone\[aq]s transfer stats and obey \f[V]--bwlimit\f[R].
+.IP \[bu] 2
+Backend-agnostic - it only needs the remote to support a server-side
+move or copy for the rename into place, which nearly all do; a remote
+without streaming upload support spools to local disk as above.
.PP
\f[B]Limitations\f[R]
.IP \[bu] 2
@@ -16701,33 +16873,134 @@ upload and the client must start it again.
(The remote\[aq]s own upload still retries its internal chunks.)
.IP \[bu] 2
Parts are serialised into one stream, so ingest from the client is
-effectively single-threaded, although the remote\[aq]s own upload still
-runs concurrently.
+effectively single-threaded.
+When streaming, the remote\[aq]s own upload runs concurrently with the
+parts arriving; with the local disk spool or the VFS cache the upload to
+the remote only starts on completion.
.IP \[bu] 2
-On remotes that don\[aq]t upload atomically (such as \f[V]local\f[R]),
-the completed object is moved into place with a server-side operation.
-This is a cheap rename on most such remotes.
-On these remotes, if \f[V]serve s3\f[R] is killed part-way through an
-upload the temporary object (named with a leading
-\f[V].rclone_multipart_upload_\f[R]) may be left behind; it is hidden
-from S3 listings but must be removed manually.
+If \f[V]serve s3\f[R] is killed part-way through an upload the temporary
+object (named with a leading \f[V].rclone_temp_multipart_\f[R]) may be
+left behind; it is hidden from S3 listings but must be removed manually.
+.SS Multipart uploads and the VFS cache
+.PP
+With \f[V]--vfs-cache-mode writes\f[R] (or \f[V]full\f[R]) multipart
+uploads do not stream to the remote at all.
+The parts are written, in part-number order, to a temporary file in the
+VFS cache.
+On completion the file is renamed into place and uploaded by the VFS
+write-back, exactly like a plain object PUT.
+This needs no streaming upload support from the remote.
+The rename normally happens in the cache before the upload has started,
+but the VFS requires the remote to support a server-side move or copy to
+rename files at all (and uses one if the temporary file has already been
+written back, e.g.
+with \f[V]--vfs-write-back 0\f[R]).
+On remotes without either, the parts are written to the cache directly
+under the final key instead: the upload still never touches memory, but
+it loses its atomicity - the in-flight upload is visible at the key, and
+an aborted upload cannot be abandoned once in the cache, so its partial
+data is written back to the remote as if it were a completed object.
+.PP
+Remotes that benefit from \f[V]--vfs-cache-mode writes\f[R]:
+.IP \[bu] 2
+\f[B]Remotes over slow or unreliable links.\f[R] A failure in a streamed
+upload aborts the whole multipart upload and the client must start again
+from the first part; a failed write-back upload is retried by the VFS
+(see \f[V]--vfs-cache-max-age\f[R] and friends) without the client being
+involved.
+Ingest from the client also runs at local disk speed rather than being
+throttled to the remote\[aq]s pace.
+.IP \[bu] 2
+\f[B]Workloads that read back or overwrite what they just wrote.\f[R]
+The completed object stays in the cache, so subsequent
+\f[V]GET\f[R]/\f[V]HEAD\f[R] requests are served locally, and plain PUTs
+and multipart uploads to the same key go through the same cache entry so
+the last write wins regardless of upload style.
+.PP
+The trade-offs of the VFS cache:
+.IP \[bu] 2
+The whole object lands on local disk, so the cache
+(\f[V]--cache-dir\f[R]) needs space for the largest objects in flight;
+\f[V]--vfs-cache-max-size\f[R] cannot evict files which are still being
+uploaded.
+.IP \[bu] 2
+The \f[V]200 OK\f[R] for \f[V]CompleteMultipartUpload\f[R] means the
+data is safely in the \f[B]local cache\f[R], not yet on the remote - the
+same durability the cache gives plain PUTs.
+If an acknowledgement must mean the data has reached the remote (for
+example WAL archiving), use the default \f[V]--vfs-cache-mode off\f[R].
+.IP \[bu] 2
+The upload to the remote only starts on completion, rather than
+overlapping with the parts arriving, so the data reaches the remote
+later than with streaming.
+.IP \[bu] 2
+If \f[V]serve s3\f[R] is killed part-way through an upload, the
+temporary file survives in the cache and the VFS cache recovery uploads
+it to the remote on restart as a temporary object (named with a leading
+\f[V].rclone_temp_multipart_\f[R]); as with the streaming path, it is
+hidden from S3 listings but must be removed manually.
+.SS Cleaning up temporary objects
+.PP
+If \f[V]serve s3\f[R] is killed part-way through an upload it can leave
+a temporary object behind, named with a leading \f[V].rclone_temp_\f[R].
+This whole prefix is reserved: any object whose name (the last
+\f[V]/\f[R]-separated segment of its key) starts with
+\f[V].rclone_temp_\f[R] is hidden from S3 listings, so don\[aq]t give
+real objects such names - an existing object with such a name disappears
+from listings (though it stays accessible directly by its key: only
+listings hide reserved names, \f[V]GET\f[R], \f[V]HEAD\f[R] and
+\f[V]DELETE\f[R] of the exact key still work).
+A temporary object never holds acknowledged data - uploads whose
+temporary object survived were never confirmed to the client - so old
+ones are safe to delete:
+.IP
+.nf
+\f[C]
+rclone delete --min-age 24h --include \[dq].rclone_temp_*\[dq] remote:path
+\f[R]
+.fi
+.PP
+The \f[V]--min-age\f[R] protects uploads which are still in progress:
+make sure it is longer than your longest upload, especially if several
+\f[V]serve s3\f[R] instances share the same remote.
+.PP
+rclone v1.75 named its temporary multipart objects
+\f[V].rclone_multipart_upload_*\f[R]; leftovers from an older server are
+also hidden from listings and can be cleaned up the same way.
+.SS Abandoned uploads
+.PP
+A client which starts a multipart upload and vanishes without either
+completing or aborting it would otherwise hold on to its resources
+forever.
+.PP
+An incomplete multipart upload which has had no activity for
+\f[V]--multipart-expiry\f[R] (default \f[V]24h\f[R]) is therefore
+aborted and cleaned up, exactly as if the client had called
+\f[V]AbortMultipartUpload\f[R], and a \f[V]NOTICE\f[R] is logged.
+.PP
+An upload with a part still being received is never expired, however
+slowly the part is arriving, and each completed part restarts the clock,
+so the expiry only needs to outlast the client\[aq]s pauses
+\f[I]between\f[R] parts, not the whole upload.
+.PP
+Late operations on an expired upload fail with \f[V]NoSuchUpload\f[R],
+as they do on real S3 when a lifecycle rule has aborted the upload.
+Set \f[V]--multipart-expiry 0\f[R] to keep incomplete uploads forever.
.SS Disabling streaming
.PP
-If you pass \f[V]--disable-multipart-streaming\f[R], or the remote
-doesn\[aq]t support \f[V]PutStream\f[R] (or doesn\[aq]t upload
-atomically and can\[aq]t move or copy server-side), multipart uploads
+If you pass \f[V]--disable-multipart-streaming\f[R], multipart uploads
are instead \f[B]buffered in memory\f[R] by the underlying S3 library:
every part is held in memory and the whole object is written out in one
-go when the upload completes (the previous behaviour).
+go when the upload completes.
This removes the in-order/contiguous-part restriction above, so parts
can be uploaded in any order, but \f[B]memory use grows with the size of
the upload\f[R], so it is only suitable for small objects.
A one-off \f[V]NOTICE\f[R] is logged the first time this happens.
-.PP
-Alternatively, if the client is an rclone \f[V]s3\f[R] remote (like the
-\f[V][serves3]\f[R] example above), you can set
-\f[V]use_multipart_uploads = false\f[R] on it so it uploads each object
-as a single stream and skips multipart uploads altogether.
+This flag is the only thing that makes multipart uploads buffer in
+memory - it is never done because of missing remote capabilities.
+Consider \f[V]--vfs-cache-mode writes\f[R] instead, which buffers the
+upload in the VFS cache on disk and takes precedence over
+\f[V]--disable-multipart-streaming\f[R].
.SS Bugs
.PP
Multipart server side copies do not work (see
@@ -17029,8 +17302,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -17092,762 +17365,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
-The default value of 1 hour will start evicting files from cache that
-haven\[aq]t been accessed for 1 hour.
-When a cached file is accessed the 1 hour timer is reset to 0 and will
-wait for 1 more hour before evicting.
-Specify the time with standard notation, s, m, h, d, w .
-.PP
-You \f[B]should not\f[R] run two copies of rclone using the same VFS
-cache with the same or overlapping remotes if using
-\f[V]--vfs-cache-mode > off\f[R].
-This can potentially cause data corruption if you do.
-You can work around this by giving each rclone its own cache hierarchy
-with \f[V]--cache-dir\f[R].
-You don\[aq]t need to worry about this if the remotes in use don\[aq]t
-overlap.
-.SS --vfs-cache-mode off
-.PP
-In this mode (the default) the cache will read directly from the remote
-and write directly to the remote without caching anything on disk.
-.PP
-This will mean some operations are not possible
-.IP \[bu] 2
-Files can\[aq]t be opened for both read AND write
-.IP \[bu] 2
-Files opened for write can\[aq]t be seeked
-.IP \[bu] 2
-Existing files opened for write must have O_TRUNC set
-.IP \[bu] 2
-Files open for read with O_TRUNC will be opened write only
-.IP \[bu] 2
-Files open for write only will behave as if O_TRUNC was supplied
-.IP \[bu] 2
-Open modes O_APPEND, O_TRUNC are ignored
-.IP \[bu] 2
-If an upload fails it can\[aq]t be retried
-.SS --vfs-cache-mode minimal
-.PP
-This is very similar to \[dq]off\[dq] except that files opened for read
-AND write will be buffered to disk.
-This means that files opened for write will be a lot more compatible,
-but uses the minimal disk space.
-.PP
-These operations are not possible
-.IP \[bu] 2
-Files opened for write only can\[aq]t be seeked
-.IP \[bu] 2
-Existing files opened for write must have O_TRUNC set
-.IP \[bu] 2
-Files opened for write only will ignore O_APPEND, O_TRUNC
-.IP \[bu] 2
-If an upload fails it can\[aq]t be retried
-.SS --vfs-cache-mode writes
-.PP
-In this mode files opened for read only are still read directly from the
-remote, write only and read/write files are buffered to disk first.
-.PP
-This mode should support all normal file system operations.
-.PP
-If an upload fails it will be retried at exponentially increasing
-intervals up to 1 minute.
-.SS --vfs-cache-mode full
-.PP
-In this mode all reads and writes are buffered to and from disk.
-When data is read from the remote this is buffered to disk as well.
-.PP
-In this mode the files in the cache will be sparse files and rclone will
-keep track of which bits of the files it has downloaded.
-.PP
-So if an application only reads the starts of each file, then rclone
-will only buffer the start of the file.
-These files will appear to be their full size in the cache, but they
-will be sparse files with only the data that has been downloaded present
-in them.
-.PP
-This mode should support all normal file system operations and is
-otherwise identical to \f[V]--vfs-cache-mode\f[R] writes.
-.PP
-When reading a file rclone will read \f[V]--buffer-size\f[R] plus
-\f[V]--vfs-read-ahead\f[R] bytes ahead.
-The \f[V]--buffer-size\f[R] is buffered in memory whereas the
-\f[V]--vfs-read-ahead\f[R] is buffered on disk.
-.PP
-When using this mode it is recommended that \f[V]--buffer-size\f[R] is
-not set too large and \f[V]--vfs-read-ahead\f[R] is set large if
-required.
-.PP
-\f[B]IMPORTANT\f[R] not all file systems support sparse files.
-In particular FAT/exFAT do not.
-Rclone will perform very badly if the cache directory is on a filesystem
-which doesn\[aq]t support sparse files and it will log an ERROR message
-if one is detected.
-.SS Fingerprinting
-.PP
-Various parts of the VFS use fingerprinting to see if a local file copy
-has changed relative to a remote file.
-Fingerprints are made from:
-.IP \[bu] 2
-size
-.IP \[bu] 2
-modification time
-.IP \[bu] 2
-hash
-.PP
-where available on an object.
-.PP
-On some backends some of these attributes are slow to read (they take an
-extra API call per object, or extra work per object).
-.PP
-For example \f[V]hash\f[R] is slow with the \f[V]local\f[R] and
-\f[V]sftp\f[R] backends as they have to read the entire file and hash
-it, and \f[V]modtime\f[R] is slow with the \f[V]s3\f[R],
-\f[V]swift\f[R], \f[V]ftp\f[R] and \f[V]qinqstor\f[R] backends because
-they need to do an extra API call to fetch it.
-.PP
-If you use the \f[V]--vfs-fast-fingerprint\f[R] flag then rclone will
-not include the slow operations in the fingerprint.
-This makes the fingerprinting less accurate but much faster and will
-improve the opening time of cached files.
-.PP
-If you are running a vfs cache over \f[V]local\f[R], \f[V]s3\f[R] or
-\f[V]swift\f[R] backends then using this flag is recommended.
-.PP
-Note that if you change the value of this flag, the fingerprints of the
-files in the cache may be invalidated and the files will need to be
-downloaded again.
-.SS VFS Chunked Reading
-.PP
-When rclone reads files from a remote it reads them in chunks.
-This means that rather than requesting the whole file rclone reads the
-chunk specified.
-This can reduce the used download quota for some remotes by requesting
-only chunks from the remote that are actually read, at the cost of an
-increased number of requests.
-.PP
-These flags control the chunking:
-.IP
-.nf
-\f[C]
- --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
- --vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
- --vfs-read-chunk-streams int The number of parallel streams to read at once
-\f[R]
-.fi
-.PP
-The chunking behaves differently depending on the
-\f[V]--vfs-read-chunk-streams\f[R] parameter.
-.SS \f[V]--vfs-read-chunk-streams\f[R] == 0
-.PP
-Rclone will start reading a chunk of size
-\f[V]--vfs-read-chunk-size\f[R], and then double the size for each read.
-When \f[V]--vfs-read-chunk-size-limit\f[R] is specified, and greater
-than \f[V]--vfs-read-chunk-size\f[R], the chunk size for each open file
-will get doubled only until the specified value is reached.
-If the value is \[dq]off\[dq], which is the default, the limit is
-disabled and the chunk size will grow indefinitely.
-.PP
-With \f[V]--vfs-read-chunk-size 100M\f[R] and
-\f[V]--vfs-read-chunk-size-limit 0\f[R] the following parts will be
-downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on.
-When \f[V]--vfs-read-chunk-size-limit 500M\f[R] is specified, the result
-would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so
-on.
-.PP
-Setting \f[V]--vfs-read-chunk-size\f[R] to \f[V]0\f[R] or \[dq]off\[dq]
-disables chunked reading.
-.PP
-The chunks will not be buffered in memory.
-.SS \f[V]--vfs-read-chunk-streams\f[R] > 0
-.PP
-Rclone reads \f[V]--vfs-read-chunk-streams\f[R] chunks of size
-\f[V]--vfs-read-chunk-size\f[R] concurrently.
-The size for each read will stay constant.
-.PP
-This improves performance performance massively on high latency links or
-very high bandwidth links to high performance object stores.
-.PP
-Some experimentation will be needed to find the optimum values of
-\f[V]--vfs-read-chunk-size\f[R] and \f[V]--vfs-read-chunk-streams\f[R]
-as these will depend on the backend in use and the latency to the
-backend.
-.PP
-For high performance object stores (eg AWS S3) a reasonable place to
-start might be \f[V]--vfs-read-chunk-streams 16\f[R] and
-\f[V]--vfs-read-chunk-size 4M\f[R].
-In testing with AWS S3 the performance scaled roughly as the
-\f[V]--vfs-read-chunk-streams\f[R] setting.
-.PP
-Similar settings should work for high latency links, but depending on
-the latency they may need more \f[V]--vfs-read-chunk-streams\f[R] in
-order to get the throughput.
-.SS VFS Performance
-.PP
-These flags may be used to enable/disable features of the VFS for
-performance or other reasons.
-See also the chunked reading feature.
-.PP
-In particular S3 and Swift benefit hugely from the
-\f[V]--no-modtime\f[R] flag (or use \f[V]--use-server-modtime\f[R] for a
-slightly different effect) as each read of the modification time takes a
-transaction.
-.IP
-.nf
-\f[C]
- --no-checksum Don\[aq]t compare checksums on up/download.
- --no-modtime Don\[aq]t read/write the modification time (can speed things up).
- --no-seek Don\[aq]t allow seeking in files.
- --read-only Only allow read-only access.
-\f[R]
-.fi
-.PP
-Sometimes rclone is delivered reads or writes out of order.
-Rather than seeking rclone will wait a short time for the in sequence
-read or write to come in.
-These flags only come into effect when not using an on disk cache file.
-.IP
-.nf
-\f[C]
- --vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
- --vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
-\f[R]
-.fi
-.PP
-When using VFS write caching (\f[V]--vfs-cache-mode\f[R] with value
-writes or full), the global flag \f[V]--transfers\f[R] can be set to
-adjust the number of parallel uploads of modified files from the cache
-(the related global flag \f[V]--checkers\f[R] has no effect on the VFS).
-.IP
-.nf
-\f[C]
- --transfers int Number of file transfers to run in parallel (default 4)
-\f[R]
-.fi
-.SS Symlinks
-.PP
-By default the VFS does not support symlinks.
-However this may be enabled with either of the following flags:
-.IP
-.nf
-\f[C]
- --links Translate symlinks to/from regular files with a \[aq].rclonelink\[aq] extension.
- --vfs-links Translate symlinks to/from regular files with a \[aq].rclonelink\[aq] extension for the VFS
-\f[R]
-.fi
-.PP
-As most cloud storage systems do not support symlinks directly, rclone
-stores the symlink as a normal file with a special extension.
-So a file which appears as a symlink \f[V]link-to-file.txt\f[R] would be
-stored on cloud storage as \f[V]link-to-file.txt.rclonelink\f[R] and the
-contents would be the path to the symlink destination.
-.PP
-Note that \f[V]--links\f[R] enables symlink translation globally in
-rclone - this includes any backend which supports the concept (for
-example the local backend).
-\f[V]--vfs-links\f[R] just enables it for the VFS layer.
-.PP
-This scheme is compatible with that used by the local backend with the
---local-links flag (https://rclone.org/local/#symlinks-junction-points).
-.PP
-The \f[V]--vfs-links\f[R] flag has been designed for
-\f[V]rclone mount\f[R], \f[V]rclone nfsmount\f[R] and
-\f[V]rclone serve nfs\f[R].
-.PP
-It hasn\[aq]t been tested with the other \f[V]rclone serve\f[R] commands
-yet.
-.PP
-A limitation of the current implementation is that it expects the caller
-to resolve sub-symlinks.
-For example given this directory tree
-.IP
-.nf
-\f[C]
-\&.
-├── dir
-│\ \ └── file.txt
-└── linked-dir -> dir
-\f[R]
-.fi
-.PP
-The VFS will correctly resolve \f[V]linked-dir\f[R] but not
-\f[V]linked-dir/file.txt\f[R].
-This is not a problem for the tested commands but may be for other
-commands.
-.PP
-\f[B]Note\f[R] that there is an outstanding issue with symlink support
-issue #8245 (https://github.com/rclone/rclone/issues/8245) with
-duplicate files being created when symlinks are moved into directories
-where there is a file of the same name (or vice versa).
-.SS VFS Case Sensitivity
-.PP
-Linux file systems are case-sensitive: two files can differ only by
-case, and the exact case must be used when opening a file.
-.PP
-File systems in modern Windows are case-insensitive but case-preserving:
-although existing files can be opened using any case, the exact case
-used to create the file is preserved and available for programs to
-query.
-It is not allowed for two files in the same directory to differ only by
-case.
-.PP
-Usually file systems on macOS are case-insensitive.
-It is possible to make macOS file systems case-sensitive but that is not
-the default.
-.PP
-The \f[V]--vfs-case-insensitive\f[R] VFS flag controls how rclone
-handles these two cases.
-If its value is \[dq]false\[dq], rclone passes file names to the remote
-as-is.
-If the flag is \[dq]true\[dq] (or appears without a value on the command
-line), rclone may perform a \[dq]fixup\[dq] as explained below.
-.PP
-The user may specify a file name to open/delete/rename/etc with a case
-different than what is stored on the remote.
-If an argument refers to an existing file with exactly the same name,
-then the case of the existing file on the disk will be used.
-However, if a file name with exactly the same name is not found but a
-name differing only by case exists, rclone will transparently fixup the
-name.
-This fixup happens only when an existing file is requested.
-Case sensitivity of file names created anew by rclone is controlled by
-the underlying remote.
-.PP
-Note that case sensitivity of the operating system running rclone (the
-target) may differ from case sensitivity of a file system presented by
-rclone (the source).
-The flag controls whether \[dq]fixup\[dq] is performed to satisfy the
-target.
-.PP
-If the flag is not provided on the command line, then its default value
-depends on the operating system where rclone runs: \[dq]true\[dq] on
-Windows and macOS, \[dq]false\[dq] otherwise.
-If the flag is provided without a value, then it is \[dq]true\[dq].
-.PP
-The \f[V]--no-unicode-normalization\f[R] flag controls whether a similar
-\[dq]fixup\[dq] is performed for filenames that differ but are
-canonically
-equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with
-respect to unicode.
-Unicode normalization can be particularly helpful for users of macOS,
-which prefers form NFD instead of the NFC used by most other platforms.
-It is therefore highly recommended to keep the default of
-\f[V]false\f[R] on macOS, to avoid encoding compatibility issues.
-.PP
-In the (probably unlikely) event that a directory has multiple duplicate
-filenames after applying case and unicode normalization, the
-\f[V]--vfs-block-norm-dupes\f[R] flag allows hiding these duplicates.
-This comes with a performance tradeoff, as rclone will have to scan the
-entire directory for duplicates when listing a directory.
-For this reason, it is recommended to leave this disabled if not needed.
-However, macOS users may wish to consider using it, as otherwise, if a
-remote directory contains both NFC and NFD versions of the same
-filename, an odd situation will occur: both versions of the file will be
-visible in the mount, and both will appear to be editable, however,
-editing either version will actually result in only the NFD version
-getting edited under the hood.
-\f[V]--vfs-block- norm-dupes\f[R] prevents this confusion by detecting
-this scenario, hiding the duplicates, and logging an error, similar to
-how this is handled in \f[V]rclone sync\f[R].
-.SS VFS Disk Options
-.PP
-This flag allows you to manually set the statistics about the filing
-system.
-It can be useful when those statistics cannot be read correctly
-automatically.
-.IP
-.nf
-\f[C]
- --vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
-\f[R]
-.fi
-.SS Alternate report of used bytes
-.PP
-Some backends, most notably S3, do not report the amount of bytes used.
-If you need this information to be available when running \f[V]df\f[R]
-on the filesystem, then pass the flag \f[V]--vfs-used-is-size\f[R] to
-rclone.
-With this flag set, instead of relying on the backend to report this
-information, rclone will scan the whole remote similar to
-\f[V]rclone size\f[R] and compute the total used space itself.
-.PP
-\f[B]WARNING\f[R]: Contrary to \f[V]rclone size\f[R], this flag ignores
-filters so that the result is accurate.
-However, this is very inefficient and may cost lots of API calls
-resulting in extra charges.
-Use it as a last resort and only with caching.
-.SS VFS Metadata
-.PP
-If you use the \f[V]--vfs-metadata-extension\f[R] flag you can get the
-VFS to expose files which contain the
-metadata (https://rclone.org/docs/#metadata) as a JSON blob.
-These files will not appear in the directory listing, but can be
-\f[V]stat\f[R]-ed and opened and once they have been they \f[B]will\f[R]
-appear in directory listings until the directory cache expires.
-.PP
-Note that some backends won\[aq]t create metadata unless you pass in the
-\f[V]--metadata\f[R] flag.
-.PP
-For example, using \f[V]rclone mount\f[R] with
-\f[V]--metadata --vfs-metadata-extension .metadata\f[R] we get
-.IP
-.nf
-\f[C]
-$ ls -l /mnt/
-total 1048577
--rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
-
-$ cat /mnt/1G.metadata
-{
- \[dq]atime\[dq]: \[dq]2025-03-04T17:34:22.317069787Z\[dq],
- \[dq]btime\[dq]: \[dq]2025-03-03T16:03:37.708253808Z\[dq],
- \[dq]gid\[dq]: \[dq]1000\[dq],
- \[dq]mode\[dq]: \[dq]100664\[dq],
- \[dq]mtime\[dq]: \[dq]2025-03-03T16:03:39.640238323Z\[dq],
- \[dq]uid\[dq]: \[dq]1000\[dq]
-}
-
-$ ls -l /mnt/
-total 1048578
--rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
--rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
-\f[R]
-.fi
-.PP
-If the file has no metadata it will be returned as \f[V]{}\f[R] and if
-there is an error reading the metadata the error will be returned as
-\f[V]{\[dq]error\[dq]:\[dq]error string\[dq]}\f[R].
-.IP
-.nf
-\f[C]
-rclone serve s3 remote:path [flags]
-\f[R]
-.fi
-.SS Options
-.IP
-.nf
-\f[C]
- --addr stringArray IPaddress:Port or :Port to bind server to (default 127.0.0.1:8080)
- --allow-origin string Origin which cross-domain request (CORS) can be executed from
- --auth-key stringArray Set key pair for v4 authorization: access_key_id,secret_access_key
- --auth-proxy string A program to use to create the backend from the auth
- --baseurl string Prefix for URLs - leave blank for root
- --cert string TLS PEM key (concatenation of certificate and CA certificate)
- --client-ca string Client certificate authority to verify clients with
- --dir-cache-time Duration Time to cache directory entries for (default 5m0s)
- --dir-perms FileMode Directory permissions (default 777)
- --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend (see the Multipart uploads docs section)
- --etag-hash string Which hash to use for the ETag, or auto or blank for off (default \[dq]MD5\[dq])
- --file-perms FileMode File permissions (default 666)
- --force-path-style If true use path style access if false use virtual hosted style (default true)
- --gid uint32 Override the gid field set by the filesystem (not supported on Windows) (default 1000)
- -h, --help help for s3
- --htpasswd string A htpasswd file - if not provided no authentication is done
- --key string TLS PEM Private key
- --link-perms FileMode Link permissions (default 666)
- --max-header-bytes int Maximum size of request header (default 4096)
- --min-tls-version string Minimum TLS version that is acceptable (default \[dq]tls1.0\[dq])
- --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (see the Multipart uploads docs section) (default 256Mi)
- --no-checksum Don\[aq]t compare checksums on up/download
- --no-cleanup Not to cleanup empty folder after object is deleted
- --no-modtime Don\[aq]t read/write the modification time (can speed things up)
- --no-seek Don\[aq]t allow seeking in files
- --pass string Password for authentication
- --poll-interval Duration Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)
- --read-only Only allow read-only access
- --realm string Realm for authentication
- --response-header stringArray Set HTTP header for all responses, overriding existing values
- --salt string Password hashing salt (default \[dq]dlPL2MqE\[dq])
- --server-read-timeout Duration Timeout for server reading data (default 1h0m0s)
- --server-write-timeout Duration Timeout for server writing data (default 1h0m0s)
- --uid uint32 Override the uid field set by the filesystem (not supported on Windows) (default 1000)
- --umask FileMode Override the permission bits set by the filesystem (not supported on Windows) (default 002)
- --user string User name for authentication
- --user-from-header string User name from a defined HTTP header
- --vfs-block-norm-dupes If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)
- --vfs-cache-max-age Duration Max time since last access of objects in the cache (default 1h0m0s)
- --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
- --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
- --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
- --vfs-cache-poll-interval Duration Interval to poll the cache for stale objects (default 1m0s)
- --vfs-case-insensitive If a file name not found, find a case insensitive match
- --vfs-disk-space-total-size SizeSuffix Specify the total space of disk (default off)
- --vfs-fast-fingerprint Use fast (less accurate) fingerprints for change detection
- --vfs-handle-caching Duration Time to keep file handle and downloaders alive after last close (default 5s)
- --vfs-links Translate symlinks to/from regular files with a \[aq].rclonelink\[aq] extension for the VFS
- --vfs-metadata-extension string Set the extension to read metadata from
- --vfs-read-ahead SizeSuffix Extra read ahead over --buffer-size when using cache-mode full
- --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128Mi)
- --vfs-read-chunk-size-limit SizeSuffix If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached (\[aq]off\[aq] is unlimited) (default off)
- --vfs-read-chunk-streams int The number of parallel streams to read at once
- --vfs-read-wait Duration Time to wait for in-sequence read before seeking (default 20ms)
- --vfs-refresh Refreshes the directory cache recursively in the background on start
- --vfs-used-is-size rclone size Use the rclone size algorithm for Used size
- --vfs-write-back Duration Time to writeback files after last use when using cache (default 5s)
- --vfs-write-wait Duration Time to wait for in-sequence write before giving error (default 1s)
-\f[R]
-.fi
-.PP
-Options shared with other commands are described next.
-See the global flags page (https://rclone.org/flags/) for global options
-not listed here.
-.SS Filter Options
-.PP
-Flags for filtering directory listings
-.IP
-.nf
-\f[C]
- --delete-excluded Delete files on dest excluded from sync
- --exclude stringArray Exclude files matching pattern
- --exclude-from stringArray Read file exclude patterns from file (use - to read from stdin)
- --exclude-if-present stringArray Exclude directories if filename is present
- --files-from stringArray Read list of source-file names from file (use - to read from stdin)
- --files-from-raw stringArray Read list of source-file names from file without any processing of lines (use - to read from stdin)
- --files-from0 stringArray Read list of source-file names from file using NUL as separator (use - to read from stdin)
- -f, --filter stringArray Add a file filtering rule
- --filter-from stringArray Read file filtering patterns from a file (use - to read from stdin)
- --hash-filter string Partition filenames by hash k/n or randomly \[at]/n
- --ignore-case Ignore case in filters (case insensitive)
- --include stringArray Include files matching pattern
- --include-from stringArray Read file include patterns from file (use - to read from stdin)
- --max-age Duration Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)
- --max-depth int If set limits the recursion depth to this (default -1)
- --max-size SizeSuffix Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)
- --metadata-exclude stringArray Exclude metadatas matching pattern
- --metadata-exclude-from stringArray Read metadata exclude patterns from file (use - to read from stdin)
- --metadata-filter stringArray Add a metadata filtering rule
- --metadata-filter-from stringArray Read metadata filtering patterns from a file (use - to read from stdin)
- --metadata-include stringArray Include metadatas matching pattern
- --metadata-include-from stringArray Read metadata include patterns from file (use - to read from stdin)
- --min-age Duration Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)
- --min-size SizeSuffix Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
-\f[R]
-.fi
-.SS See Also
-.IP \[bu] 2
-rclone serve (https://rclone.org/commands/rclone_serve/) - Serve a
-remote over a protocol.
-.SH rclone serve sftp
-.PP
-Serve the remote over SFTP.
-.SS Synopsis
-.PP
-Run an SFTP server to serve a remote over SFTP.
-This can be used with an SFTP client or you can make a remote of type
-sftp to use with it.
-.PP
-You can use the filter flags (e.g.
-\f[V]--include\f[R], \f[V]--exclude\f[R]) to control what is served.
-.PP
-The server will respond to a small number of shell commands, mainly
-md5sum, sha1sum and df, which enable it to provide support for checksums
-and the about feature when accessed from an sftp remote.
-.PP
-Note that this server uses standard 32 KiB packet payload size, which
-means you must not configure the client to expect anything else, e.g.
-with the chunk_size (https://rclone.org/sftp/#sftp-chunk-size) option on
-an sftp remote.
-.PP
-The server will log errors.
-Use \f[V]-v\f[R] to see access logs.
-.PP
-\f[V]--bwlimit\f[R] will be respected for file transfers.
-Use \f[V]--stats\f[R] to control the stats printing.
-.PP
-You must provide some means of authentication, either with
-\f[V]--user\f[R]/\f[V]--pass\f[R], an authorized keys file (specify
-location with \f[V]--authorized-keys\f[R] - the default is the same as
-ssh), an \f[V]--auth-proxy\f[R], or set the \f[V]--no-auth\f[R] flag for
-no authentication when logging in.
-.PP
-If you don\[aq]t supply a host \f[V]--key\f[R] then rclone will generate
-rsa, ecdsa and ed25519 variants, and cache them for later use in
-rclone\[aq]s cache directory (see \f[V]rclone help flags cache-dir\f[R])
-in the \[dq]serve-sftp\[dq] directory.
-.PP
-By default the server binds to localhost:2022 - if you want it to be
-reachable externally then supply \f[V]--addr :2022\f[R] for example.
-.PP
-This also supports being run with socket activation, in which case it
-will listen on the first passed FD.
-It can be configured with .socket and .service unit files as described
-in
-.
-.PP
-Socket activation can be tested ad-hoc with the
-\f[V]systemd-socket-activate\f[R]command:
-.IP
-.nf
-\f[C]
-systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
-\f[R]
-.fi
-.PP
-This will socket-activate rclone on the first connection to port 2222
-over TCP.
-.PP
-Note that the default of \f[V]--vfs-cache-mode off\f[R] is fine for the
-rclone sftp backend, but it may not be with other SFTP clients.
-.PP
-If \f[V]--stdio\f[R] is specified, rclone will serve SFTP over stdio,
-which can be used with sshd via \[ti]/.ssh/authorized_keys, for example:
-.IP
-.nf
-\f[C]
-restrict,command=\[dq]rclone serve sftp --stdio ./photos\[dq] ssh-rsa ...
-\f[R]
-.fi
-.PP
-On the client you need to set \f[V]--transfers 1\f[R] when using
-\f[V]--stdio\f[R].
-Otherwise multiple instances of the rclone server are started by OpenSSH
-which can lead to \[dq]corrupted on transfer\[dq] errors.
-This is the case because the client chooses indiscriminately which
-server to send commands to while the servers all have different views of
-the state of the filing system.
-.PP
-The \[dq]restrict\[dq] in authorized_keys prevents SHA1SUMs and MD5SUMs
-from being used.
-Omitting \[dq]restrict\[dq] and using \f[V]--sftp-path-override\f[R] to
-enable checksumming is possible but less secure and you could use the
-SFTP server provided by OpenSSH in this case.
-.SS VFS - Virtual File System
-.PP
-This command uses the VFS layer.
-This adapts the cloud storage objects that rclone uses into something
-which looks much more like a disk filing system.
-.PP
-Cloud storage objects have lots of properties which aren\[aq]t like disk
-files - you can\[aq]t extend them or write to the middle of them, so the
-VFS layer has to deal with that.
-Because there is no one right way of doing this there are various
-options explained below.
-.PP
-The VFS layer also implements a directory cache - this caches info about
-files and directories (but not the data) in memory.
-.SS VFS Directory Cache
-.PP
-Using the \f[V]--dir-cache-time\f[R] flag, you can control how long a
-directory should be considered up to date and not refreshed from the
-backend.
-Changes made through the VFS will appear immediately or invalidate the
-cache.
-.IP
-.nf
-\f[C]
- --dir-cache-time duration Time to cache directory entries for (default 5m0s)
- --poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
-\f[R]
-.fi
-.PP
-However, changes made directly on the cloud storage by the web interface
-or a different copy of rclone will only be picked up once the directory
-cache expires if the backend configured does not support polling for
-changes.
-If the backend supports polling, changes will be picked up within the
-polling interval.
-.PP
-You can send a \f[V]SIGHUP\f[R] signal to rclone for it to flush all
-directory caches, regardless of how old they are.
-Assuming only one rclone instance is running, you can reset the cache
-like this:
-.IP
-.nf
-\f[C]
-kill -SIGHUP $(pidof rclone)
-\f[R]
-.fi
-.PP
-If you configure rclone with a remote control then you can use rclone rc
-to flush the whole directory cache:
-.IP
-.nf
-\f[C]
-rclone rc vfs/forget
-\f[R]
-.fi
-.PP
-Or individual files or directories:
-.IP
-.nf
-\f[C]
-rclone rc vfs/forget file=path/to/file dir=path/to/dir
-\f[R]
-.fi
-.SS VFS File Buffering
-.PP
-The \f[V]--buffer-size\f[R] flag determines the amount of memory, that
-will be used to buffer data in advance.
-.PP
-Each open file will try to keep the specified amount of data in memory
-at all times.
-The buffered data is bound to one open file and won\[aq]t be shared.
-.PP
-This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
-If the buffer is empty, only a small amount of memory will be used.
-.PP
-The maximum memory used by rclone for buffering can be up to
-\f[V]--buffer-size * open files\f[R].
-.SS VFS File Caching
-.PP
-These flags control the VFS file caching options.
-File caching is necessary to make the VFS layer appear compatible with a
-normal file system.
-It can be disabled at the cost of some compatibility.
-.PP
-For example you\[aq]ll need to enable VFS caching if you want to read
-and write simultaneously to a file.
-See below for more details.
-.PP
-Note that the VFS cache is separate from the cache backend and you may
-find that you need one or the other or both.
-.IP
-.nf
-\f[C]
- --cache-dir string Directory rclone will use for caching.
- --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
- --vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
- --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
- --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
- --vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
- --vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
-\f[R]
-.fi
-.PP
-If run with \f[V]-vv\f[R] rclone will print the location of the file
-cache.
-The files are stored in the user cache file area which is OS dependent
-but can be controlled with \f[V]--cache-dir\f[R] or setting the
-appropriate environment variable.
-.PP
-The cache has 4 different modes selected by \f[V]--vfs-cache-mode\f[R].
-The higher the cache mode the more compatible rclone becomes at the cost
-of using disk space.
-.PP
-Note that files are written back to the remote only when they are closed
-and if they haven\[aq]t been accessed for \f[V]--vfs-write-back\f[R]
-seconds.
-If rclone is quit or dies with files that haven\[aq]t been uploaded,
-these will be uploaded next time rclone is run with the same flags.
-.PP
-If using \f[V]--vfs-cache-max-size\f[R] or
-\f[V]--vfs-cache-min-free-space\f[R] note that the cache may exceed
-these quotas for two reasons.
-Firstly because it is only checked every
-\f[V]--vfs-cache-poll-interval\f[R].
-Secondly because open files cannot be evicted from the cache.
-When \f[V]--vfs-cache-max-size\f[R] or
-\f[V]--vfs-cache-min-free-space\f[R] is exceeded, rclone will attempt to
-evict the least accessed files from the cache first.
-rclone will start with files that haven\[aq]t been accessed for the
-longest.
-This cache flushing strategy is efficient and more relevant files are
-likely to remain cached.
-.PP
-The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -18301,9 +17820,12 @@ This config generated must have this extra parameter
.IP \[bu] 2
\f[V]_root\f[R] - root to use for the backend
.PP
-And it may have this parameter
+And it may have these parameters
.IP \[bu] 2
\f[V]_obscure\f[R] - comma separated strings for parameters to obscure
+.IP \[bu] 2
+\f[V]_secret_access_key\f[R] - the secret for S3 access key auth (see
+below)
.PP
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -18312,7 +17834,8 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]pass\[dq]: \[dq]mypassword\[dq]
+ \[dq]pass\[dq]: \[dq]mypassword\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
@@ -18324,11 +17847,51 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq]
+ \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
.PP
+If the client authenticated with an S3 access key
+(\f[V]rclone serve s3\f[R]), the client never sends its secret, only a
+signature made with it, so the input contains just the access key ID as
+the \f[V]user\f[R] with no \f[V]pass\f[R] or \f[V]public_key\f[R]:
+.IP
+.nf
+\f[C]
+{
+ \[dq]user\[dq]: \[dq]AKIAIOSFODNN7EXAMPLE\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
+}
+\f[R]
+.fi
+.PP
+In this case the program must look up the secret access key for that
+access key ID and return it in the \f[V]_secret_access_key\f[R] field of
+the output.
+Rclone then uses that secret to verify the signature on the request,
+refusing the request if it does not match.
+This means the proxy program is the source of truth for both the
+credentials and the backend they map to.
+If the program does not return \f[V]_secret_access_key\f[R] or returns
+it empty the request is refused.
+.PP
+The program\[aq]s answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes.
+A rotated secret takes effect on the first request signed with it.
+.PP
+The \f[V]client_ip\f[R] key holds the IP address the client connected
+from, without a port number.
+It can be used to restrict logins to certain networks, or to log
+authentication attempts centrally.
+It is omitted if the client has no IP address, for example when
+connecting over a unix socket.
+Note that if rclone is behind a reverse proxy this will be the address
+of the reverse proxy and not the original client.
+.PP
And as an example return this on STDOUT
.IP
.nf
@@ -18359,12 +17922,909 @@ the \f[V]user\f[R] be \f[V]user\[at]example.com\f[R] and then set the
For security you\[aq]d probably want to restrict the \f[V]host\f[R] to a
limited list.
.PP
-An internal cache of backends is keyed on the \f[V]user\f[R] and a hash
-of the \f[V]pass\f[R] or \f[V]public_key\f[R].
-This means that if a user\[aq]s password or public-key changes, or the
-proxy returns different config parameters (eg a rotated
-\f[V]api_key\f[R]), a fresh backend will be created on the next request
-rather than the cached one being reused.
+An internal cache of backends is keyed on the \f[V]user\f[R], a hash of
+the \f[V]pass\f[R] or \f[V]public_key\f[R], and the \f[V]client_ip\f[R].
+This means that if a user\[aq]s password or public-key changes, the
+client connects from a new IP address, or the proxy returns different
+config parameters (eg a rotated \f[V]api_key\f[R]), a fresh backend will
+be created on the next request rather than the cached one being reused.
+.PP
+This can be used to build general purpose proxies to any kind of backend
+that rclone supports.
+.IP
+.nf
+\f[C]
+rclone serve s3 remote:path [flags]
+\f[R]
+.fi
+.SS Options
+.IP
+.nf
+\f[C]
+ --addr stringArray IPaddress:Port or :Port to bind server to (default 127.0.0.1:8080)
+ --allow-origin string Origin which cross-domain request (CORS) can be executed from
+ --auth-key stringArray Set key pair for v4 authorization: access_key_id,secret_access_key
+ --auth-proxy string A program to use to create the backend from the auth
+ --baseurl string Prefix for URLs - leave blank for root
+ --cert string TLS PEM key (concatenation of certificate and CA certificate)
+ --client-ca string Client certificate authority to verify clients with
+ --dir-cache-time Duration Time to cache directory entries for (default 5m0s)
+ --dir-perms FileMode Directory permissions (default 777)
+ --disable-multipart-streaming Buffer multipart uploads in memory instead of streaming them to the backend
+ --etag-hash string Which hash to use for the ETag, or auto or blank for off (default \[dq]MD5\[dq])
+ --file-perms FileMode File permissions (default 666)
+ --force-path-style If true use path style access if false use virtual hosted style (default true)
+ --gid uint32 Override the gid field set by the filesystem (not supported on Windows) (default 1000)
+ -h, --help help for s3
+ --htpasswd string A htpasswd file - if not provided no authentication is done
+ --key string TLS PEM Private key
+ --link-perms FileMode Link permissions (default 666)
+ --max-header-bytes int Maximum size of request header (default 4096)
+ --min-tls-version string Minimum TLS version that is acceptable (default \[dq]tls1.0\[dq])
+ --multipart-expiry Duration Abort incomplete multipart uploads idle for longer than this, 0 to keep forever (default 1d)
+ --multipart-streaming-buffer-limit SizeSuffix Maximum memory buffered per streamed multipart upload for parts arriving out of order, 0 for unlimited (default 256Mi)
+ --no-checksum Don\[aq]t compare checksums on up/download
+ --no-cleanup Not to cleanup empty folder after object is deleted
+ --no-modtime Don\[aq]t read/write the modification time (can speed things up)
+ --no-seek Don\[aq]t allow seeking in files
+ --pass string Password for authentication
+ --poll-interval Duration Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable) (default 1m0s)
+ --read-only Only allow read-only access
+ --realm string Realm for authentication
+ --response-header stringArray Set HTTP header for all responses, overriding existing values
+ --salt string Password hashing salt (default \[dq]dlPL2MqE\[dq])
+ --server-read-timeout Duration Timeout for server reading data (default 1h0m0s)
+ --server-write-timeout Duration Timeout for server writing data (default 1h0m0s)
+ --uid uint32 Override the uid field set by the filesystem (not supported on Windows) (default 1000)
+ --umask FileMode Override the permission bits set by the filesystem (not supported on Windows) (default 002)
+ --user string User name for authentication
+ --user-from-header string User name from a defined HTTP header
+ --vfs-block-norm-dupes If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)
+ --vfs-cache-max-age Duration Max time since last access of objects in the cache (default 1h0m0s)
+ --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
+ --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
+ --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
+ --vfs-cache-poll-interval Duration Interval to poll the cache for stale objects (default 1m0s)
+ --vfs-case-insensitive If a file name not found, find a case insensitive match
+ --vfs-disk-space-total-size SizeSuffix Specify the total space of disk (default off)
+ --vfs-fast-fingerprint Use fast (less accurate) fingerprints for change detection
+ --vfs-handle-caching Duration Time to keep file handle and downloaders alive after last close (default 5s)
+ --vfs-links Translate symlinks to/from regular files with a \[aq].rclonelink\[aq] extension for the VFS
+ --vfs-metadata-extension string Set the extension to read metadata from
+ --vfs-read-ahead SizeSuffix Extra read ahead over --buffer-size when using cache-mode full
+ --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128Mi)
+ --vfs-read-chunk-size-limit SizeSuffix If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached (\[aq]off\[aq] is unlimited) (default off)
+ --vfs-read-chunk-streams int The number of parallel streams to read at once
+ --vfs-read-wait Duration Time to wait for in-sequence read before seeking (default 20ms)
+ --vfs-refresh Refreshes the directory cache recursively in the background on start
+ --vfs-used-is-size rclone size Use the rclone size algorithm for Used size
+ --vfs-write-back Duration Time to writeback files after last use when using cache (default 5s)
+ --vfs-write-wait Duration Time to wait for in-sequence write before giving error (default 1s)
+\f[R]
+.fi
+.PP
+Options shared with other commands are described next.
+See the global flags page (https://rclone.org/flags/) for global options
+not listed here.
+.SS Filter Options
+.PP
+Flags for filtering directory listings
+.IP
+.nf
+\f[C]
+ --delete-excluded Delete files on dest excluded from sync
+ --exclude stringArray Exclude files matching pattern
+ --exclude-from stringArray Read file exclude patterns from file (use - to read from stdin)
+ --exclude-if-present stringArray Exclude directories if filename is present
+ --files-from stringArray Read list of source-file names from file (use - to read from stdin)
+ --files-from-raw stringArray Read list of source-file names from file without any processing of lines (use - to read from stdin)
+ --files-from0 stringArray Read list of source-file names from file using NUL as separator (use - to read from stdin)
+ -f, --filter stringArray Add a file filtering rule
+ --filter-from stringArray Read file filtering patterns from a file (use - to read from stdin)
+ --hash-filter string Partition filenames by hash k/n or randomly \[at]/n
+ --ignore-case Ignore case in filters (case insensitive)
+ --include stringArray Include files matching pattern
+ --include-from stringArray Read file include patterns from file (use - to read from stdin)
+ --max-age Duration Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y (default off)
+ --max-depth int If set limits the recursion depth to this (default -1)
+ --max-size SizeSuffix Only transfer files smaller than this in KiB or suffix B|K|M|G|T|P (default off)
+ --metadata-exclude stringArray Exclude metadatas matching pattern
+ --metadata-exclude-from stringArray Read metadata exclude patterns from file (use - to read from stdin)
+ --metadata-filter stringArray Add a metadata filtering rule
+ --metadata-filter-from stringArray Read metadata filtering patterns from a file (use - to read from stdin)
+ --metadata-include stringArray Include metadatas matching pattern
+ --metadata-include-from stringArray Read metadata include patterns from file (use - to read from stdin)
+ --min-age Duration Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y (default off)
+ --min-size SizeSuffix Only transfer files bigger than this in KiB or suffix B|K|M|G|T|P (default off)
+\f[R]
+.fi
+.SS See Also
+.IP \[bu] 2
+rclone serve (https://rclone.org/commands/rclone_serve/) - Serve a
+remote over a protocol.
+.SH rclone serve sftp
+.PP
+Serve the remote over SFTP.
+.SS Synopsis
+.PP
+Run an SFTP server to serve a remote over SFTP.
+This can be used with an SFTP client or you can make a remote of type
+sftp to use with it.
+.PP
+You can use the filter flags (e.g.
+\f[V]--include\f[R], \f[V]--exclude\f[R]) to control what is served.
+.PP
+The server will respond to a small number of shell commands, mainly
+md5sum, sha1sum and df, which enable it to provide support for checksums
+and the about feature when accessed from an sftp remote.
+.PP
+Note that this server uses standard 32 KiB packet payload size, which
+means you must not configure the client to expect anything else, e.g.
+with the chunk_size (https://rclone.org/sftp/#sftp-chunk-size) option on
+an sftp remote.
+.PP
+The server will log errors.
+Use \f[V]-v\f[R] to see access logs.
+.PP
+\f[V]--bwlimit\f[R] will be respected for file transfers.
+Use \f[V]--stats\f[R] to control the stats printing.
+.PP
+You must provide some means of authentication, either with
+\f[V]--user\f[R]/\f[V]--pass\f[R], an authorized keys file (specify
+location with \f[V]--authorized-keys\f[R] - the default is the same as
+ssh), an \f[V]--auth-proxy\f[R], or set the \f[V]--no-auth\f[R] flag for
+no authentication when logging in.
+.PP
+If you don\[aq]t supply a host \f[V]--key\f[R] then rclone will generate
+rsa, ecdsa and ed25519 variants, and cache them for later use in
+rclone\[aq]s cache directory (see \f[V]rclone help flags cache-dir\f[R])
+in the \[dq]serve-sftp\[dq] directory.
+.PP
+By default the server binds to localhost:2022 - if you want it to be
+reachable externally then supply \f[V]--addr :2022\f[R] for example.
+.PP
+This also supports being run with socket activation, in which case it
+will listen on the first passed FD.
+It can be configured with .socket and .service unit files as described
+in
+.
+.PP
+Socket activation can be tested ad-hoc with the
+\f[V]systemd-socket-activate\f[R]command:
+.IP
+.nf
+\f[C]
+systemd-socket-activate -l 2222 -- rclone serve sftp :local:vfs/
+\f[R]
+.fi
+.PP
+This will socket-activate rclone on the first connection to port 2222
+over TCP.
+.PP
+Note that the default of \f[V]--vfs-cache-mode off\f[R] is fine for the
+rclone sftp backend, but it may not be with other SFTP clients.
+.PP
+If \f[V]--stdio\f[R] is specified, rclone will serve SFTP over stdio,
+which can be used with sshd via \[ti]/.ssh/authorized_keys, for example:
+.IP
+.nf
+\f[C]
+restrict,command=\[dq]rclone serve sftp --stdio ./photos\[dq] ssh-rsa ...
+\f[R]
+.fi
+.PP
+On the client you need to set \f[V]--transfers 1\f[R] when using
+\f[V]--stdio\f[R].
+Otherwise multiple instances of the rclone server are started by OpenSSH
+which can lead to \[dq]corrupted on transfer\[dq] errors.
+This is the case because the client chooses indiscriminately which
+server to send commands to while the servers all have different views of
+the state of the filing system.
+.PP
+The \[dq]restrict\[dq] in authorized_keys prevents SHA1SUMs and MD5SUMs
+from being used.
+Omitting \[dq]restrict\[dq] and using \f[V]--sftp-path-override\f[R] to
+enable checksumming is possible but less secure and you could use the
+SFTP server provided by OpenSSH in this case.
+.SS VFS - Virtual File System
+.PP
+This command uses the VFS layer.
+This adapts the cloud storage objects that rclone uses into something
+which looks much more like a disk filing system.
+.PP
+Cloud storage objects have lots of properties which aren\[aq]t like disk
+files - you can\[aq]t extend them or write to the middle of them, so the
+VFS layer has to deal with that.
+Because there is no one right way of doing this there are various
+options explained below.
+.PP
+The VFS layer also implements a directory cache - this caches info about
+files and directories (but not the data) in memory.
+.SS VFS Directory Cache
+.PP
+Using the \f[V]--dir-cache-time\f[R] flag, you can control how long a
+directory should be considered up to date and not refreshed from the
+backend.
+Changes made through the VFS will appear immediately or invalidate the
+cache.
+.IP
+.nf
+\f[C]
+ --dir-cache-time duration Time to cache directory entries for (default 5m0s)
+ --poll-interval duration Time to wait between polling for changes. Must be smaller than dir-cache-time. Only on supported remotes. Set to 0 to disable (default 1m0s)
+\f[R]
+.fi
+.PP
+However, changes made directly on the cloud storage by the web interface
+or a different copy of rclone will only be picked up once the directory
+cache expires if the backend configured does not support polling for
+changes.
+If the backend supports polling, changes will be picked up within the
+polling interval.
+.PP
+You can send a \f[V]SIGHUP\f[R] signal to rclone for it to flush all
+directory caches, regardless of how old they are.
+Assuming only one rclone instance is running, you can reset the cache
+like this:
+.IP
+.nf
+\f[C]
+kill -SIGHUP $(pidof rclone)
+\f[R]
+.fi
+.PP
+If you configure rclone with a remote control then you can use rclone rc
+to flush the whole directory cache:
+.IP
+.nf
+\f[C]
+rclone rc vfs/forget
+\f[R]
+.fi
+.PP
+Or individual files or directories:
+.IP
+.nf
+\f[C]
+rclone rc vfs/forget file=path/to/file dir=path/to/dir
+\f[R]
+.fi
+.SS VFS File Buffering
+.PP
+The \f[V]--buffer-size\f[R] flag determines the amount of memory, that
+will be used to buffer data in advance.
+.PP
+Each open file will try to keep the specified amount of data in memory
+at all times.
+The buffered data is bound to one open file and won\[aq]t be shared.
+.PP
+This flag is a upper limit for the used memory per open file.
+The buffer will only use memory for data that is downloaded but not yet
+read.
+If the buffer is empty, only a small amount of memory will be used.
+.PP
+The maximum memory used by rclone for buffering can be up to
+\f[V]--buffer-size * open files\f[R].
+.SS VFS File Caching
+.PP
+These flags control the VFS file caching options.
+File caching is necessary to make the VFS layer appear compatible with a
+normal file system.
+It can be disabled at the cost of some compatibility.
+.PP
+For example you\[aq]ll need to enable VFS caching if you want to read
+and write simultaneously to a file.
+See below for more details.
+.PP
+Note that the VFS cache is separate from the cache backend and you may
+find that you need one or the other or both.
+.IP
+.nf
+\f[C]
+ --cache-dir string Directory rclone will use for caching.
+ --vfs-cache-mode CacheMode Cache mode off|minimal|writes|full (default off)
+ --vfs-cache-max-age duration Max time since last access of objects in the cache (default 1h0m0s)
+ --vfs-cache-max-size SizeSuffix Max total size of objects in the cache (default off)
+ --vfs-cache-min-free-space SizeSuffix Target minimum free space on the disk containing the cache (default off)
+ --vfs-cache-poll-interval duration Interval to poll the cache for stale objects (default 1m0s)
+ --vfs-write-back duration Time to writeback files after last use when using cache (default 5s)
+\f[R]
+.fi
+.PP
+If run with \f[V]-vv\f[R] rclone will print the location of the file
+cache.
+The files are stored in the user cache file area which is OS dependent
+but can be controlled with \f[V]--cache-dir\f[R] or setting the
+appropriate environment variable.
+.PP
+The cache has 4 different modes selected by \f[V]--vfs-cache-mode\f[R].
+The higher the cache mode the more compatible rclone becomes at the cost
+of using disk space.
+.PP
+Note that files are written back to the remote only when they are closed
+and if they haven\[aq]t been accessed for \f[V]--vfs-write-back\f[R]
+seconds.
+If rclone is quit or dies with files that haven\[aq]t been uploaded,
+these will be uploaded next time rclone is run with the same flags.
+.PP
+If using \f[V]--vfs-cache-max-size\f[R] or
+\f[V]--vfs-cache-min-free-space\f[R] note that the cache may exceed
+these quotas for two reasons.
+Firstly because it is only checked every
+\f[V]--vfs-cache-poll-interval\f[R].
+Secondly because open files cannot be evicted from the cache.
+When \f[V]--vfs-cache-max-size\f[R] or
+\f[V]--vfs-cache-min-free-space\f[R] is exceeded, rclone will attempt to
+evict the least accessed files from the cache first.
+rclone will start with files that haven\[aq]t been accessed for the
+longest.
+This cache flushing strategy is efficient and more relevant files are
+likely to remain cached.
+.PP
+The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
+The default value of 1 hour will start evicting files from cache that
+haven\[aq]t been accessed for 1 hour.
+When a cached file is accessed the 1 hour timer is reset to 0 and will
+wait for 1 more hour before evicting.
+Specify the time with standard notation, s, m, h, d, w .
+.PP
+You \f[B]should not\f[R] run two copies of rclone using the same VFS
+cache with the same or overlapping remotes if using
+\f[V]--vfs-cache-mode > off\f[R].
+This can potentially cause data corruption if you do.
+You can work around this by giving each rclone its own cache hierarchy
+with \f[V]--cache-dir\f[R].
+You don\[aq]t need to worry about this if the remotes in use don\[aq]t
+overlap.
+.SS --vfs-cache-mode off
+.PP
+In this mode (the default) the cache will read directly from the remote
+and write directly to the remote without caching anything on disk.
+.PP
+This will mean some operations are not possible
+.IP \[bu] 2
+Files can\[aq]t be opened for both read AND write
+.IP \[bu] 2
+Files opened for write can\[aq]t be seeked
+.IP \[bu] 2
+Existing files opened for write must have O_TRUNC set
+.IP \[bu] 2
+Files open for read with O_TRUNC will be opened write only
+.IP \[bu] 2
+Files open for write only will behave as if O_TRUNC was supplied
+.IP \[bu] 2
+Open modes O_APPEND, O_TRUNC are ignored
+.IP \[bu] 2
+If an upload fails it can\[aq]t be retried
+.SS --vfs-cache-mode minimal
+.PP
+This is very similar to \[dq]off\[dq] except that files opened for read
+AND write will be buffered to disk.
+This means that files opened for write will be a lot more compatible,
+but uses the minimal disk space.
+.PP
+These operations are not possible
+.IP \[bu] 2
+Files opened for write only can\[aq]t be seeked
+.IP \[bu] 2
+Existing files opened for write must have O_TRUNC set
+.IP \[bu] 2
+Files opened for write only will ignore O_APPEND, O_TRUNC
+.IP \[bu] 2
+If an upload fails it can\[aq]t be retried
+.SS --vfs-cache-mode writes
+.PP
+In this mode files opened for read only are still read directly from the
+remote, write only and read/write files are buffered to disk first.
+.PP
+This mode should support all normal file system operations.
+.PP
+If an upload fails it will be retried at exponentially increasing
+intervals up to 1 minute.
+.SS --vfs-cache-mode full
+.PP
+In this mode all reads and writes are buffered to and from disk.
+When data is read from the remote this is buffered to disk as well.
+.PP
+In this mode the files in the cache will be sparse files and rclone will
+keep track of which bits of the files it has downloaded.
+.PP
+So if an application only reads the starts of each file, then rclone
+will only buffer the start of the file.
+These files will appear to be their full size in the cache, but they
+will be sparse files with only the data that has been downloaded present
+in them.
+.PP
+This mode should support all normal file system operations and is
+otherwise identical to \f[V]--vfs-cache-mode\f[R] writes.
+.PP
+When reading a file rclone will read \f[V]--buffer-size\f[R] plus
+\f[V]--vfs-read-ahead\f[R] bytes ahead.
+The \f[V]--buffer-size\f[R] is buffered in memory whereas the
+\f[V]--vfs-read-ahead\f[R] is buffered on disk.
+.PP
+When using this mode it is recommended that \f[V]--buffer-size\f[R] is
+not set too large and \f[V]--vfs-read-ahead\f[R] is set large if
+required.
+.PP
+\f[B]IMPORTANT\f[R] not all file systems support sparse files.
+In particular FAT/exFAT do not.
+Rclone will perform very badly if the cache directory is on a filesystem
+which doesn\[aq]t support sparse files and it will log an ERROR message
+if one is detected.
+.SS Fingerprinting
+.PP
+Various parts of the VFS use fingerprinting to see if a local file copy
+has changed relative to a remote file.
+Fingerprints are made from:
+.IP \[bu] 2
+size
+.IP \[bu] 2
+modification time
+.IP \[bu] 2
+hash
+.PP
+where available on an object.
+.PP
+On some backends some of these attributes are slow to read (they take an
+extra API call per object, or extra work per object).
+.PP
+For example \f[V]hash\f[R] is slow with the \f[V]local\f[R] and
+\f[V]sftp\f[R] backends as they have to read the entire file and hash
+it, and \f[V]modtime\f[R] is slow with the \f[V]s3\f[R],
+\f[V]swift\f[R], \f[V]ftp\f[R] and \f[V]qinqstor\f[R] backends because
+they need to do an extra API call to fetch it.
+.PP
+If you use the \f[V]--vfs-fast-fingerprint\f[R] flag then rclone will
+not include the slow operations in the fingerprint.
+This makes the fingerprinting less accurate but much faster and will
+improve the opening time of cached files.
+.PP
+If you are running a vfs cache over \f[V]local\f[R], \f[V]s3\f[R] or
+\f[V]swift\f[R] backends then using this flag is recommended.
+.PP
+Note that if you change the value of this flag, the fingerprints of the
+files in the cache may be invalidated and the files will need to be
+downloaded again.
+.SS VFS Chunked Reading
+.PP
+When rclone reads files from a remote it reads them in chunks.
+This means that rather than requesting the whole file rclone reads the
+chunk specified.
+This can reduce the used download quota for some remotes by requesting
+only chunks from the remote that are actually read, at the cost of an
+increased number of requests.
+.PP
+These flags control the chunking:
+.IP
+.nf
+\f[C]
+ --vfs-read-chunk-size SizeSuffix Read the source objects in chunks (default 128M)
+ --vfs-read-chunk-size-limit SizeSuffix Max chunk doubling size (default off)
+ --vfs-read-chunk-streams int The number of parallel streams to read at once
+\f[R]
+.fi
+.PP
+The chunking behaves differently depending on the
+\f[V]--vfs-read-chunk-streams\f[R] parameter.
+.SS \f[V]--vfs-read-chunk-streams\f[R] == 0
+.PP
+Rclone will start reading a chunk of size
+\f[V]--vfs-read-chunk-size\f[R], and then double the size for each read.
+When \f[V]--vfs-read-chunk-size-limit\f[R] is specified, and greater
+than \f[V]--vfs-read-chunk-size\f[R], the chunk size for each open file
+will get doubled only until the specified value is reached.
+If the value is \[dq]off\[dq], which is the default, the limit is
+disabled and the chunk size will grow indefinitely.
+.PP
+With \f[V]--vfs-read-chunk-size 100M\f[R] and
+\f[V]--vfs-read-chunk-size-limit 0\f[R] the following parts will be
+downloaded: 0-100M, 100M-200M, 200M-300M, 300M-400M and so on.
+When \f[V]--vfs-read-chunk-size-limit 500M\f[R] is specified, the result
+would be 0-100M, 100M-300M, 300M-700M, 700M-1200M, 1200M-1700M and so
+on.
+.PP
+Setting \f[V]--vfs-read-chunk-size\f[R] to \f[V]0\f[R] or \[dq]off\[dq]
+disables chunked reading.
+.PP
+The chunks will not be buffered in memory.
+.SS \f[V]--vfs-read-chunk-streams\f[R] > 0
+.PP
+Rclone reads \f[V]--vfs-read-chunk-streams\f[R] chunks of size
+\f[V]--vfs-read-chunk-size\f[R] concurrently.
+The size for each read will stay constant.
+.PP
+This improves performance performance massively on high latency links or
+very high bandwidth links to high performance object stores.
+.PP
+Some experimentation will be needed to find the optimum values of
+\f[V]--vfs-read-chunk-size\f[R] and \f[V]--vfs-read-chunk-streams\f[R]
+as these will depend on the backend in use and the latency to the
+backend.
+.PP
+For high performance object stores (eg AWS S3) a reasonable place to
+start might be \f[V]--vfs-read-chunk-streams 16\f[R] and
+\f[V]--vfs-read-chunk-size 4M\f[R].
+In testing with AWS S3 the performance scaled roughly as the
+\f[V]--vfs-read-chunk-streams\f[R] setting.
+.PP
+Similar settings should work for high latency links, but depending on
+the latency they may need more \f[V]--vfs-read-chunk-streams\f[R] in
+order to get the throughput.
+.SS VFS Performance
+.PP
+These flags may be used to enable/disable features of the VFS for
+performance or other reasons.
+See also the chunked reading feature.
+.PP
+In particular S3 and Swift benefit hugely from the
+\f[V]--no-modtime\f[R] flag (or use \f[V]--use-server-modtime\f[R] for a
+slightly different effect) as each read of the modification time takes a
+transaction.
+.IP
+.nf
+\f[C]
+ --no-checksum Don\[aq]t compare checksums on up/download.
+ --no-modtime Don\[aq]t read/write the modification time (can speed things up).
+ --no-seek Don\[aq]t allow seeking in files.
+ --read-only Only allow read-only access.
+\f[R]
+.fi
+.PP
+Sometimes rclone is delivered reads or writes out of order.
+Rather than seeking rclone will wait a short time for the in sequence
+read or write to come in.
+These flags only come into effect when not using an on disk cache file.
+.IP
+.nf
+\f[C]
+ --vfs-read-wait duration Time to wait for in-sequence read before seeking (default 20ms)
+ --vfs-write-wait duration Time to wait for in-sequence write before giving error (default 1s)
+\f[R]
+.fi
+.PP
+When using VFS write caching (\f[V]--vfs-cache-mode\f[R] with value
+writes or full), the global flag \f[V]--transfers\f[R] can be set to
+adjust the number of parallel uploads of modified files from the cache
+(the related global flag \f[V]--checkers\f[R] has no effect on the VFS).
+.IP
+.nf
+\f[C]
+ --transfers int Number of file transfers to run in parallel (default 4)
+\f[R]
+.fi
+.SS Symlinks
+.PP
+By default the VFS does not support symlinks.
+However this may be enabled with either of the following flags:
+.IP
+.nf
+\f[C]
+ --links Translate symlinks to/from regular files with a \[aq].rclonelink\[aq] extension.
+ --vfs-links Translate symlinks to/from regular files with a \[aq].rclonelink\[aq] extension for the VFS
+\f[R]
+.fi
+.PP
+As most cloud storage systems do not support symlinks directly, rclone
+stores the symlink as a normal file with a special extension.
+So a file which appears as a symlink \f[V]link-to-file.txt\f[R] would be
+stored on cloud storage as \f[V]link-to-file.txt.rclonelink\f[R] and the
+contents would be the path to the symlink destination.
+.PP
+Note that \f[V]--links\f[R] enables symlink translation globally in
+rclone - this includes any backend which supports the concept (for
+example the local backend).
+\f[V]--vfs-links\f[R] just enables it for the VFS layer.
+.PP
+This scheme is compatible with that used by the local backend with the
+--local-links flag (https://rclone.org/local/#symlinks-junction-points).
+.PP
+The \f[V]--vfs-links\f[R] flag has been designed for
+\f[V]rclone mount\f[R], \f[V]rclone nfsmount\f[R] and
+\f[V]rclone serve nfs\f[R].
+.PP
+It hasn\[aq]t been tested with the other \f[V]rclone serve\f[R] commands
+yet.
+.PP
+A limitation of the current implementation is that it expects the caller
+to resolve sub-symlinks.
+For example given this directory tree
+.IP
+.nf
+\f[C]
+\&.
+├── dir
+│\ \ └── file.txt
+└── linked-dir -> dir
+\f[R]
+.fi
+.PP
+The VFS will correctly resolve \f[V]linked-dir\f[R] but not
+\f[V]linked-dir/file.txt\f[R].
+This is not a problem for the tested commands but may be for other
+commands.
+.PP
+\f[B]Note\f[R] that there is an outstanding issue with symlink support
+issue #8245 (https://github.com/rclone/rclone/issues/8245) with
+duplicate files being created when symlinks are moved into directories
+where there is a file of the same name (or vice versa).
+.SS VFS Case Sensitivity
+.PP
+Linux file systems are case-sensitive: two files can differ only by
+case, and the exact case must be used when opening a file.
+.PP
+File systems in modern Windows are case-insensitive but case-preserving:
+although existing files can be opened using any case, the exact case
+used to create the file is preserved and available for programs to
+query.
+It is not allowed for two files in the same directory to differ only by
+case.
+.PP
+Usually file systems on macOS are case-insensitive.
+It is possible to make macOS file systems case-sensitive but that is not
+the default.
+.PP
+The \f[V]--vfs-case-insensitive\f[R] VFS flag controls how rclone
+handles these two cases.
+If its value is \[dq]false\[dq], rclone passes file names to the remote
+as-is.
+If the flag is \[dq]true\[dq] (or appears without a value on the command
+line), rclone may perform a \[dq]fixup\[dq] as explained below.
+.PP
+The user may specify a file name to open/delete/rename/etc with a case
+different than what is stored on the remote.
+If an argument refers to an existing file with exactly the same name,
+then the case of the existing file on the disk will be used.
+However, if a file name with exactly the same name is not found but a
+name differing only by case exists, rclone will transparently fixup the
+name.
+This fixup happens only when an existing file is requested.
+Case sensitivity of file names created anew by rclone is controlled by
+the underlying remote.
+.PP
+Note that case sensitivity of the operating system running rclone (the
+target) may differ from case sensitivity of a file system presented by
+rclone (the source).
+The flag controls whether \[dq]fixup\[dq] is performed to satisfy the
+target.
+.PP
+If the flag is not provided on the command line, then its default value
+depends on the operating system where rclone runs: \[dq]true\[dq] on
+Windows and macOS, \[dq]false\[dq] otherwise.
+If the flag is provided without a value, then it is \[dq]true\[dq].
+.PP
+The \f[V]--no-unicode-normalization\f[R] flag controls whether a similar
+\[dq]fixup\[dq] is performed for filenames that differ but are
+canonically
+equivalent (https://en.wikipedia.org/wiki/Unicode_equivalence) with
+respect to unicode.
+Unicode normalization can be particularly helpful for users of macOS,
+which prefers form NFD instead of the NFC used by most other platforms.
+It is therefore highly recommended to keep the default of
+\f[V]false\f[R] on macOS, to avoid encoding compatibility issues.
+.PP
+In the (probably unlikely) event that a directory has multiple duplicate
+filenames after applying case and unicode normalization, the
+\f[V]--vfs-block-norm-dupes\f[R] flag allows hiding these duplicates.
+This comes with a performance tradeoff, as rclone will have to scan the
+entire directory for duplicates when listing a directory.
+For this reason, it is recommended to leave this disabled if not needed.
+However, macOS users may wish to consider using it, as otherwise, if a
+remote directory contains both NFC and NFD versions of the same
+filename, an odd situation will occur: both versions of the file will be
+visible in the mount, and both will appear to be editable, however,
+editing either version will actually result in only the NFD version
+getting edited under the hood.
+\f[V]--vfs-block- norm-dupes\f[R] prevents this confusion by detecting
+this scenario, hiding the duplicates, and logging an error, similar to
+how this is handled in \f[V]rclone sync\f[R].
+.SS VFS Disk Options
+.PP
+This flag allows you to manually set the statistics about the filing
+system.
+It can be useful when those statistics cannot be read correctly
+automatically.
+.IP
+.nf
+\f[C]
+ --vfs-disk-space-total-size Manually set the total disk space size (example: 256G, default: -1)
+\f[R]
+.fi
+.SS Alternate report of used bytes
+.PP
+Some backends, most notably S3, do not report the amount of bytes used.
+If you need this information to be available when running \f[V]df\f[R]
+on the filesystem, then pass the flag \f[V]--vfs-used-is-size\f[R] to
+rclone.
+With this flag set, instead of relying on the backend to report this
+information, rclone will scan the whole remote similar to
+\f[V]rclone size\f[R] and compute the total used space itself.
+.PP
+\f[B]WARNING\f[R]: Contrary to \f[V]rclone size\f[R], this flag ignores
+filters so that the result is accurate.
+However, this is very inefficient and may cost lots of API calls
+resulting in extra charges.
+Use it as a last resort and only with caching.
+.SS VFS Metadata
+.PP
+If you use the \f[V]--vfs-metadata-extension\f[R] flag you can get the
+VFS to expose files which contain the
+metadata (https://rclone.org/docs/#metadata) as a JSON blob.
+These files will not appear in the directory listing, but can be
+\f[V]stat\f[R]-ed and opened and once they have been they \f[B]will\f[R]
+appear in directory listings until the directory cache expires.
+.PP
+Note that some backends won\[aq]t create metadata unless you pass in the
+\f[V]--metadata\f[R] flag.
+.PP
+For example, using \f[V]rclone mount\f[R] with
+\f[V]--metadata --vfs-metadata-extension .metadata\f[R] we get
+.IP
+.nf
+\f[C]
+$ ls -l /mnt/
+total 1048577
+-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
+
+$ cat /mnt/1G.metadata
+{
+ \[dq]atime\[dq]: \[dq]2025-03-04T17:34:22.317069787Z\[dq],
+ \[dq]btime\[dq]: \[dq]2025-03-03T16:03:37.708253808Z\[dq],
+ \[dq]gid\[dq]: \[dq]1000\[dq],
+ \[dq]mode\[dq]: \[dq]100664\[dq],
+ \[dq]mtime\[dq]: \[dq]2025-03-03T16:03:39.640238323Z\[dq],
+ \[dq]uid\[dq]: \[dq]1000\[dq]
+}
+
+$ ls -l /mnt/
+total 1048578
+-rw-rw-r-- 1 user user 1073741824 Mar 3 16:03 1G
+-rw-rw-r-- 1 user user 185 Mar 3 16:03 1G.metadata
+\f[R]
+.fi
+.PP
+If the file has no metadata it will be returned as \f[V]{}\f[R] and if
+there is an error reading the metadata the error will be returned as
+\f[V]{\[dq]error\[dq]:\[dq]error string\[dq]}\f[R].
+.SS Auth Proxy
+.PP
+If you supply the parameter \f[V]--auth-proxy /path/to/program\f[R] then
+rclone will use that program to generate backends on the fly which then
+are used to authenticate incoming requests.
+This uses a simple JSON based protocol with input on STDIN and output on
+STDOUT.
+.PP
+\f[B]PLEASE NOTE:\f[R] \f[V]--auth-proxy\f[R] and
+\f[V]--authorized-keys\f[R] cannot be used together, if
+\f[V]--auth-proxy\f[R] is set the authorized keys option will be
+ignored.
+.PP
+There is an example program
+bin/test_proxy.py (https://github.com/rclone/rclone/blob/master/bin/test_proxy.py)
+in the rclone source code.
+.PP
+The program\[aq]s job is to take a \f[V]user\f[R] and \f[V]pass\f[R] on
+the input and turn those into the config for a backend on STDOUT in JSON
+format.
+This config will have any default parameters for the backend added, but
+it won\[aq]t use configuration from environment variables or command
+line options - it is the job of the proxy program to make a complete
+config.
+.PP
+This config generated must have this extra parameter
+.IP \[bu] 2
+\f[V]_root\f[R] - root to use for the backend
+.PP
+And it may have these parameters
+.IP \[bu] 2
+\f[V]_obscure\f[R] - comma separated strings for parameters to obscure
+.IP \[bu] 2
+\f[V]_secret_access_key\f[R] - the secret for S3 access key auth (see
+below)
+.PP
+If password authentication was used by the client, input to the proxy
+process (on STDIN) would look similar to this:
+.IP
+.nf
+\f[C]
+{
+ \[dq]user\[dq]: \[dq]me\[dq],
+ \[dq]pass\[dq]: \[dq]mypassword\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
+}
+\f[R]
+.fi
+.PP
+If public-key authentication was used by the client, input to the proxy
+process (on STDIN) would look similar to this:
+.IP
+.nf
+\f[C]
+{
+ \[dq]user\[dq]: \[dq]me\[dq],
+ \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
+}
+\f[R]
+.fi
+.PP
+If the client authenticated with an S3 access key
+(\f[V]rclone serve s3\f[R]), the client never sends its secret, only a
+signature made with it, so the input contains just the access key ID as
+the \f[V]user\f[R] with no \f[V]pass\f[R] or \f[V]public_key\f[R]:
+.IP
+.nf
+\f[C]
+{
+ \[dq]user\[dq]: \[dq]AKIAIOSFODNN7EXAMPLE\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
+}
+\f[R]
+.fi
+.PP
+In this case the program must look up the secret access key for that
+access key ID and return it in the \f[V]_secret_access_key\f[R] field of
+the output.
+Rclone then uses that secret to verify the signature on the request,
+refusing the request if it does not match.
+This means the proxy program is the source of truth for both the
+credentials and the backend they map to.
+If the program does not return \f[V]_secret_access_key\f[R] or returns
+it empty the request is refused.
+.PP
+The program\[aq]s answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes.
+A rotated secret takes effect on the first request signed with it.
+.PP
+The \f[V]client_ip\f[R] key holds the IP address the client connected
+from, without a port number.
+It can be used to restrict logins to certain networks, or to log
+authentication attempts centrally.
+It is omitted if the client has no IP address, for example when
+connecting over a unix socket.
+Note that if rclone is behind a reverse proxy this will be the address
+of the reverse proxy and not the original client.
+.PP
+And as an example return this on STDOUT
+.IP
+.nf
+\f[C]
+{
+ \[dq]type\[dq]: \[dq]sftp\[dq],
+ \[dq]_root\[dq]: \[dq]\[dq],
+ \[dq]_obscure\[dq]: \[dq]pass\[dq],
+ \[dq]user\[dq]: \[dq]me\[dq],
+ \[dq]pass\[dq]: \[dq]mypassword\[dq],
+ \[dq]host\[dq]: \[dq]sftp.example.com\[dq]
+}
+\f[R]
+.fi
+.PP
+This would mean that an SFTP backend would be created on the fly for the
+\f[V]user\f[R] and \f[V]pass\f[R]/\f[V]public_key\f[R] returned in the
+output to the host given.
+Note that since \f[V]_obscure\f[R] is set to \f[V]pass\f[R], rclone will
+obscure the \f[V]pass\f[R] parameter before creating the backend (which
+is required for sftp backends).
+.PP
+The program can manipulate the supplied \f[V]user\f[R] in any way, for
+example to make proxy to many different sftp backends, you could make
+the \f[V]user\f[R] be \f[V]user\[at]example.com\f[R] and then set the
+\f[V]host\f[R] to \f[V]example.com\f[R] in the output and the user to
+\f[V]user\f[R].
+For security you\[aq]d probably want to restrict the \f[V]host\f[R] to a
+limited list.
+.PP
+An internal cache of backends is keyed on the \f[V]user\f[R], a hash of
+the \f[V]pass\f[R] or \f[V]public_key\f[R], and the \f[V]client_ip\f[R].
+This means that if a user\[aq]s password or public-key changes, the
+client connects from a new IP address, or the proxy returns different
+config parameters (eg a rotated \f[V]api_key\f[R]), a fresh backend will
+be created on the next request rather than the cached one being reused.
.PP
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -18921,8 +19381,8 @@ at all times.
The buffered data is bound to one open file and won\[aq]t be shared.
.PP
This flag is a upper limit for the used memory per open file.
-The buffer will only use memory for data that is downloaded but not not
-yet read.
+The buffer will only use memory for data that is downloaded but not yet
+read.
If the buffer is empty, only a small amount of memory will be used.
.PP
The maximum memory used by rclone for buffering can be up to
@@ -18984,7 +19444,8 @@ This cache flushing strategy is efficient and more relevant files are
likely to remain cached.
.PP
The \f[V]--vfs-cache-max-age\f[R] will evict files from the cache after
-the set time since last access has passed.
+the set time since last access has passed; it is based on access time,
+not on when the file was first added to the cache.
The default value of 1 hour will start evicting files from cache that
haven\[aq]t been accessed for 1 hour.
When a cached file is accessed the 1 hour timer is reset to 0 and will
@@ -19438,9 +19899,12 @@ This config generated must have this extra parameter
.IP \[bu] 2
\f[V]_root\f[R] - root to use for the backend
.PP
-And it may have this parameter
+And it may have these parameters
.IP \[bu] 2
\f[V]_obscure\f[R] - comma separated strings for parameters to obscure
+.IP \[bu] 2
+\f[V]_secret_access_key\f[R] - the secret for S3 access key auth (see
+below)
.PP
If password authentication was used by the client, input to the proxy
process (on STDIN) would look similar to this:
@@ -19449,7 +19913,8 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]pass\[dq]: \[dq]mypassword\[dq]
+ \[dq]pass\[dq]: \[dq]mypassword\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
@@ -19461,11 +19926,51 @@ process (on STDIN) would look similar to this:
\f[C]
{
\[dq]user\[dq]: \[dq]me\[dq],
- \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq]
+ \[dq]public_key\[dq]: \[dq]AAAAB3NzaC1yc2EAAAADAQABAAABAQDuwESFdAe14hVS6omeyX7edc...JQdf\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
}
\f[R]
.fi
.PP
+If the client authenticated with an S3 access key
+(\f[V]rclone serve s3\f[R]), the client never sends its secret, only a
+signature made with it, so the input contains just the access key ID as
+the \f[V]user\f[R] with no \f[V]pass\f[R] or \f[V]public_key\f[R]:
+.IP
+.nf
+\f[C]
+{
+ \[dq]user\[dq]: \[dq]AKIAIOSFODNN7EXAMPLE\[dq],
+ \[dq]client_ip\[dq]: \[dq]192.168.1.1\[dq]
+}
+\f[R]
+.fi
+.PP
+In this case the program must look up the secret access key for that
+access key ID and return it in the \f[V]_secret_access_key\f[R] field of
+the output.
+Rclone then uses that secret to verify the signature on the request,
+refusing the request if it does not match.
+This means the proxy program is the source of truth for both the
+credentials and the backend they map to.
+If the program does not return \f[V]_secret_access_key\f[R] or returns
+it empty the request is refused.
+.PP
+The program\[aq]s answer for an access key ID is cached (see below) but
+is checked with the program again after 5 minutes even if the access key
+ID is in constant use, so revoking an access key ID in the program takes
+effect within 5 minutes.
+A rotated secret takes effect on the first request signed with it.
+.PP
+The \f[V]client_ip\f[R] key holds the IP address the client connected
+from, without a port number.
+It can be used to restrict logins to certain networks, or to log
+authentication attempts centrally.
+It is omitted if the client has no IP address, for example when
+connecting over a unix socket.
+Note that if rclone is behind a reverse proxy this will be the address
+of the reverse proxy and not the original client.
+.PP
And as an example return this on STDOUT
.IP
.nf
@@ -19496,12 +20001,12 @@ the \f[V]user\f[R] be \f[V]user\[at]example.com\f[R] and then set the
For security you\[aq]d probably want to restrict the \f[V]host\f[R] to a
limited list.
.PP
-An internal cache of backends is keyed on the \f[V]user\f[R] and a hash
-of the \f[V]pass\f[R] or \f[V]public_key\f[R].
-This means that if a user\[aq]s password or public-key changes, or the
-proxy returns different config parameters (eg a rotated
-\f[V]api_key\f[R]), a fresh backend will be created on the next request
-rather than the cached one being reused.
+An internal cache of backends is keyed on the \f[V]user\f[R], a hash of
+the \f[V]pass\f[R] or \f[V]public_key\f[R], and the \f[V]client_ip\f[R].
+This means that if a user\[aq]s password or public-key changes, the
+client connects from a new IP address, or the proxy returns different
+config parameters (eg a rotated \f[V]api_key\f[R]), a fresh backend will
+be created on the next request rather than the cached one being reused.
.PP
This can be used to build general purpose proxies to any kind of backend
that rclone supports.
@@ -21333,7 +21838,8 @@ Each \f[V]--transfer\f[R] will use this much memory for buffering.
.PP
When using \f[V]mount\f[R] or \f[V]cmount\f[R] each open file descriptor
will use this much memory for buffering.
-See the mount (https://rclone.org/commands/rclone_mount/#file-buffering)
+See the
+mount (https://rclone.org/commands/rclone_mount/#vfs-file-buffering)
documentation for more details.
.PP
Set to \f[V]0\f[R] to disable the buffering for the minimum memory
@@ -22736,7 +23242,7 @@ In the worst case memory usage can be at maximum \f[V]--transfers\f[R] *
\f[V]--multi-thread-chunk-size\f[R] * \f[V]--multi-thread-streams\f[R]
or specifically for the s3 backend \f[V]--transfers\f[R] *
\f[V]--s3-chunk-size\f[R] * \f[V]--s3-concurrency\f[R].
-However you can use the the
+However you can use the
--max-buffer-memory (https://rclone.org/docs/#max-buffer-memory) flag to
control the maximum memory used here.
.PP
@@ -30945,7 +31451,7 @@ Flags for general networking and HTTP stuff.
--tpslimit float Limit HTTP transactions per second to this
--tpslimit-burst int Max burst of transactions for --tpslimit (default 1)
--use-cookies Enable session cookiejar
- --user-agent string Set the user-agent to a specified string (default \[dq]rclone/v1.75.0\[dq])
+ --user-agent string Set the user-agent to a specified string (default \[dq]rclone/v1.75.1\[dq])
\f[R]
.fi
.SS Performance
@@ -34276,18 +34782,20 @@ The following backends have known issues that need more investigation:
.IP \[bu] 2
\f[V]TestBisyncLocalRemote/extended_filenames\f[R] (https://pub.rclone.org/integration-tests/current/huaweidrive-cmd.bisync-TestHuaweiDrive-1.txt)
.IP \[bu] 2
-4 more (https://pub.rclone.org/integration-tests/current/)
+3 more (https://pub.rclone.org/integration-tests/current/)
.RE
.IP \[bu] 2
\f[V]TestPcloud\f[R] (\f[V]pcloud\f[R])
.RS 2
.IP \[bu] 2
-\f[V]TestBisyncRemoteRemote/check_access\f[R] (https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+\f[V]TestBisyncRemoteLocal/createemptysrcdirs\f[R] (https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
.IP \[bu] 2
-\f[V]TestBisyncRemoteRemote/rmdirs\f[R] (https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+\f[V]TestBisyncLocalRemote/resolve\f[R] (https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
+.IP \[bu] 2
+\f[V]TestBisyncRemoteRemote/createemptysrcdirs\f[R] (https://pub.rclone.org/integration-tests/current/pcloud-cmd.bisync-TestPcloud-1.txt)
.RE
.IP \[bu] 2
-Updated: 2026-07-31-010017
+Updated: 2026-09-04-010006
.PP
The following backends either have not been tested recently or have
known issues that are deemed unfixable for the time being:
@@ -35474,7 +35982,7 @@ uncertainty, essentially marking the file as needing to be rechecked
next time.
.IP \[bu] 2
A few basic terminal colors are now supported, controllable with
-\f[V]--color\f[R] (https://rclone.org/docs/#color)
+\f[V]--color\f[R] (https://rclone.org/docs/#color-autoneveralways)
(\f[V]AUTO\f[R]|\f[V]NEVER\f[R]|\f[V]ALWAYS\f[R])
.IP \[bu] 2
Initial listing snapshots of Path1 and Path2 are now generated
@@ -40862,90 +41370,114 @@ Fortaleza, CE (BR), br-ne1
Provider: Magalu
.RE
.IP \[bu] 2
-\[dq]s3.eu-amsterdam.megas4.com\[dq]
+\[dq]s3.eu-luxembourg-1.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 Amsterdam
+Mega S4 Luxembourg 1
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.eu-luxembourg.megas4.com\[dq]
+\[dq]s3.eu-luxembourg-2.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 Luxembourg
+Mega S4 Luxembourg 2
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.eu-paris.megas4.com\[dq]
+\[dq]s3.eu-amsterdam-1.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 Paris
+Mega S4 Amsterdam 1
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.eu-barcelona.megas4.com\[dq]
+\[dq]s3.eu-amsterdam-2.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 Barcelona
+Mega S4 Amsterdam 2
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.ca-montreal.megas4.com\[dq]
+\[dq]s3.eu-paris-1.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 Montreal
+Mega S4 Paris 1
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.ca-vancouver.megas4.com\[dq]
+\[dq]s3.eu-paris-2.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 Vancouver
+Mega S4 Paris 2
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.ap-tokyo.megas4.com\[dq]
+\[dq]s3.eu-barcelona-1.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 Tokyo
+Mega S4 Barcelona 1
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.eu-central-1.s4.mega.io\[dq]
+\[dq]s3.eu-barcelona-2.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 eu-central-1 (Amsterdam, legacy)
+Mega S4 Barcelona 2
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.eu-central-2.s4.mega.io\[dq]
+\[dq]s3.ca-montreal-1.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 eu-central-2 (Bettembourg, legacy)
+Mega S4 Montreal 1
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.ca-central-1.s4.mega.io\[dq]
+\[dq]s3.ca-montreal-2.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 ca-central-1 (Montreal, legacy)
+Mega S4 Montreal 2
.IP \[bu] 2
Provider: Mega
.RE
.IP \[bu] 2
-\[dq]s3.ca-west-1.s4.mega.io\[dq]
+\[dq]s3.ca-vancouver-1.megas4.com\[dq]
.RS 2
.IP \[bu] 2
-Mega S4 ca-west-1 (Vancouver, legacy)
+Mega S4 Vancouver 1
+.IP \[bu] 2
+Provider: Mega
+.RE
+.IP \[bu] 2
+\[dq]s3.ca-vancouver-2.megas4.com\[dq]
+.RS 2
+.IP \[bu] 2
+Mega S4 Vancouver 2
+.IP \[bu] 2
+Provider: Mega
+.RE
+.IP \[bu] 2
+\[dq]s3.ap-tokyo-1.megas4.com\[dq]
+.RS 2
+.IP \[bu] 2
+Mega S4 Tokyo 1
+.IP \[bu] 2
+Provider: Mega
+.RE
+.IP \[bu] 2
+\[dq]s3.ap-tokyo-2.megas4.com\[dq]
+.RS 2
+.IP \[bu] 2
+Mega S4 Tokyo 2
.IP \[bu] 2
Provider: Mega
.RE
@@ -45474,8 +46006,8 @@ From rclone v1.69 Directory
Buckets (https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html)
are supported.
.PP
-You will need to set the \f[V]directory_buckets = true\f[R] config
-parameter or use \f[V]--s3-directory-buckets\f[R].
+You will need to set the \f[V]directory_bucket = true\f[R] config
+parameter or use \f[V]--s3-directory-bucket\f[R].
.PP
Note that rclone cannot yet:
.IP \[bu] 2
@@ -45483,7 +46015,7 @@ Create directory buckets
.IP \[bu] 2
List directory buckets
.PP
-See the --s3-directory-buckets flag for more info
+See the --s3-directory-bucket flag for more info
.SS AWS Snowball Edge
.PP
AWS Snowball (https://aws.amazon.com/snowball/) is a hardware appliance
@@ -57109,6 +57641,16 @@ filenames with the same name will encrypt the same
.IP \[bu] 2
filenames which start the same won\[aq]t have a common prefix
.PP
+A version string of the form \f[V]-vYYYY-MM-DD-HHMMSS-NNN\f[R] on the
+end of a file name (as added by \f[V]--b2-versions\f[R] /
+\f[V]--s3-versions\f[R]) is left in plain text so that versioned files
+can be found.
+Directory names are encrypted in full.
+Rclone before v1.76 left such a suffix in plain text on directory names
+too, so a directory named like this created by an older rclone will
+appear in listings with a warning but can\[aq]t be opened or removed
+until renamed on the underlying remote to the name given in the warning.
+.PP
This uses a 32 byte key (256 bits) and a 16 byte (128 bits) IV both of
which are derived from the user password.
.PP
@@ -65385,8 +65927,8 @@ You should now see the three scopes on your Data access page.
Now press save at the bottom!
.RE
.IP " 6." 4
-After adding scopes, click Audience Scroll down and click \[dq]+ Add
-users\[dq].
+After adding scopes, click Audience.
+Scroll down and click \[dq]+ Add users\[dq].
Add yourself as a test user and press save.
.IP " 7." 4
Go to Overview on the left panel, click \[dq]Create OAuth client\[dq].
@@ -68339,7 +68881,7 @@ from the root of the domain.
If the path following the \f[V]remote:\f[R] ends with \f[V]/\f[R] it
will be assumed to point to a directory.
If the path does not end with \f[V]/\f[R], then a HEAD request is sent
-and the response used to decide if it it is treated as a file or a
+and the response used to decide if it is treated as a file or a
directory (run with \f[V]-vv\f[R] to see details).
When --http-no-head is specified, a path without ending \f[V]/\f[R] is
always assumed to be a file.
@@ -68547,6 +69089,13 @@ For example, to set a Cookie use \[aq]Cookie,name=value\[aq], or
You can set multiple headers, e.g.
\[aq]\[dq]Cookie\[dq],\[dq]name=value\[dq],\[dq]Authorization\[dq],\[dq]xxx\[dq]\[aq].
.PP
+The headers are only sent to the host in the configured URL.
+If the server redirects to another host (including a subdomain or a
+different port) the headers are not sent to it, or to any further hop in
+that redirect chain.
+When headers are set, a redirect from https to http is refused as it
+would send them in cleartext.
+.PP
Properties:
.IP \[bu] 2
Config: headers
@@ -80351,7 +80900,7 @@ Please follow the Get started (https://sia.tech/get-started) guide and
install one.
.PP
rclone interacts with Sia network by talking to the Sia daemon via HTTP
-API (https://sia.tech/docs/) which is usually available on port
+API (https://docs.sia.tech/) which is usually available on port
\f[I]9980\f[R].
By default you will run the daemon locally on the same computer so
it\[aq]s safe to leave the API password blank (the API URL will be
@@ -81480,7 +82029,7 @@ Request\[dq] error rather than a more sensible error when the
authentication fails for Swift.
.PP
So this most likely means your username / password is wrong.
-You can investigate further with the \f[V]--dump-bodies\f[R] flag.
+You can investigate further with the \f[V]--dump bodies\f[R] flag.
.PP
This may also be caused by specifying the region when you shouldn\[aq]t
have (e.g.
@@ -84977,7 +85526,7 @@ The shell type auto-detection logic, described above, means that by
default rclone will try to run a shell command the first time a new sftp
remote is accessed.
If you configure a sftp remote without a config file, e.g.
-an on the fly (https://rclone.org/docs/#backend-path-to-dir%5D) remote,
+an on the fly (https://rclone.org/docs/#backend-path-to-dir) remote,
rclone will have nowhere to store the result, and it will re-run the
command on every access.
To avoid this you should explicitly set the \f[V]shell_type\f[R] option
@@ -86231,8 +86780,8 @@ SFTP isn\[aq]t supported under plan9 until this
issue (https://github.com/pkg/sftp/issues/156) is fixed.
.PP
Note that since SFTP isn\[aq]t HTTP based the following flags don\[aq]t
-work with it: \f[V]--dump-headers\f[R], \f[V]--dump-bodies\f[R],
-\f[V]--dump-auth\f[R].
+work with it: \f[V]--dump headers\f[R], \f[V]--dump bodies\f[R],
+\f[V]--dump auth\f[R].
.PP
Note that \f[V]--timeout\f[R] and \f[V]--contimeout\f[R] are both
supported.
@@ -87045,8 +87594,7 @@ To make a new Storj configuration you need one of the following:
.IP \[bu] 2
Access Grant that someone else shared with you.
.IP \[bu] 2
-API
-Key (https://documentation.storj.io/getting-started/uploading-your-first-object/create-an-api-key)
+API Key (https://storj.dev/learn/concepts/access/access-grants/api-key)
of a Storj project you are a member of.
.PP
Here is an example of how to make a remote called \f[V]remote\f[R].
@@ -88818,6 +89366,9 @@ hashes.
Depending on the exact version of ownCloud or Nextcloud hashes may
appear on all objects, or only on objects which had a hash uploaded with
them.
+With Nextcloud, rclone asks the server to calculate the SHA1 of uploads
+which had no hash to send, such as streamed uploads, and after setting
+the modification time, which discards the stored hash.
.SS Standard options
.PP
Here are the Standard options specific to webdav (WebDAV).
@@ -91554,6 +92105,435 @@ Options:
.IP \[bu] 2
\[dq]error\[dq]: Return an error based on option value.
.SH Changelog
+.SS v1.75.1 - 2026-09-04
+.PP
+See commits (https://github.com/rclone/rclone/compare/v1.75.0...v1.75.1)
+.IP \[bu] 2
+Security
+.RS 2
+.IP \[bu] 2
+archive
+.RS 2
+.IP \[bu] 2
+Fix zip slip path traversal in untrusted zip files GHSA-66hp-wgxq-6f5q
+CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+Hide any archive entry which escapes the directory being listed
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+.IP \[bu] 2
+Reject unsafe entry names when mounting squashfs images
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+.IP \[bu] 2
+Fix zip subdirectory root matching sibling directories
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+.IP \[bu] 2
+Fix zip entry named \[dq].\[dq] hiding every other file
+GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+.IP \[bu] 2
+Fix \[dq]directory not found\[dq] for archive paths containing
+\[dq]./\[dq] or \[dq]//\[dq] GHSA-66hp-wgxq-6f5q (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+build
+.RS 2
+.IP \[bu] 2
+Fix multiple CVEs by upgrading to go1.26.6 (Nick Craig-Wood)
+.RS 2
+.IP \[bu] 2
+CVE-2026-56860: net/url: quadratic complexity in resolvePath
+.IP \[bu] 2
+CVE-2026-56858: html/template: JavaScript regexp context tracking
+.IP \[bu] 2
+CVE-2026-56862: crypto/tls: limit handshake messages accepted
+post-handshake
+.IP \[bu] 2
+CVE-2026-56853: net/http: apply ReadHeaderTimeout to unencrypted HTTP/2
+check
+.IP \[bu] 2
+CVE-2026-56859: encoding/xml: recursion depth guard during decode
+.IP \[bu] 2
+CVE-2026-33818: encoding/asn1: enforce maximum recursion depth
+.IP \[bu] 2
+CVE-2026-46600: net: panic parsing an invalid SVCB or HTTPS RR in
+dnsmessage
+.IP \[bu] 2
+CVE-2026-39821: net/http: reject ASCII-only Punycode-encoded labels in
+idna
+.RE
+.IP \[bu] 2
+Update golang.org/x/crypto to v0.56.0 to fix multiple CVEs (Nick
+Craig-Wood)
+.RS 2
+.IP \[bu] 2
+CVE-2026-56854: ssh: source-address critical option not enforced for
+non-public-key auth callbacks
+.IP \[bu] 2
+CVE-2026-78662: ssh: a malicious peer could flood an undecided
+channel\[aq]s incoming requests, deadlocking the connection
+.IP \[bu] 2
+CVE-2026-56855: ssh: a malicious peer could send crafted messages on an
+established channel, deadlocking the connection
+.RE
+.IP \[bu] 2
+Update golang.org/x/image to v0.45.0 to fix CVE-2026-46603 (Nick
+Craig-Wood)
+.RS 2
+.IP \[bu] 2
+CVE-2026-46603: excessive memory allocation during VP8L decoding
+.RE
+.RE
+.IP \[bu] 2
+fs: Confine directory listing entries that escape the root
+GHSA-3vxh-3pcx-9m8q GHSA-38xv-hf3p-h7mq CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+fshttp: Don\[aq]t send \f[V]--header\f[R] values to other hosts on
+redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+http: Don\[aq]t leak configured headers to other hosts or over plaintext
+on redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+lib/rest: Check HTTPS downgrades against the original request on
+redirect GHSA-486v-q2wf-fp2r CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+local
+.RS 2
+.IP \[bu] 2
+Fix dir metadata escaping the root through a planted symlink
+GHSA-f8g7-2xjc-7mfh CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+Fix btime escaping the root via a planted symlink GHSA-f8g7-2xjc-7mfh
+CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+Fix panic on Range request past the end of a symlink GHSA-p6m2-r3w9-mpxw
+CVE-PENDING (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+serve docker
+.RS 2
+.IP \[bu] 2
+Reject volume names that escape the base directory GHSA-p6vx-hf7p-98j6
+(Nick Craig-Wood)
+.IP \[bu] 2
+Reject volume names resolving to the base directory itself
+GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+.IP \[bu] 2
+Re-derive volume mountpoint from name when restoring state
+GHSA-p6vx-hf7p-98j6 (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+serve ftp: Fix auth-proxy sessions sharing credentials by username
+GHSA-c476-6w5q-jw77 CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+serve s3
+.RS 2
+.IP \[bu] 2
+Fix memory exhaustion from client-declared multipart part size
+GHSA-2p48-j3qc-rx9f CVE-PENDING (Nick Craig-Wood)
+.IP \[bu] 2
+Reject bogus multipart part sizes in the reorder buffer
+GHSA-2p48-j3qc-rx9f (Nick Craig-Wood)
+.IP \[bu] 2
+Fix auth proxy accepting any request signed with an empty secret
+GHSA-xwwr-4h3p-r22c CVE-PENDING (Nick Craig-Wood)
+.RS 2
+.IP \[bu] 2
+\f[B]NB\f[R] the auth proxy protocol for \f[V]serve s3\f[R] has changed
+- the proxy program is now given the access key ID as \f[V]user\f[R] and
+must return the secret as \f[V]_secret_access_key\f[R]
+.RE
+.IP \[bu] 2
+Fix each server accepting the \f[V]--auth-key\f[R] credentials of all
+the others (Nick Craig-Wood)
+.IP \[bu] 2
+Fix misleading anonymous access log when using an auth proxy via rc
+GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+serve sftp: Fix auth proxy configured via rc being silently ignored
+GHSA-p569-5gjg-9cmj CVE-PENDING (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+Bug Fixes
+.RS 2
+.IP \[bu] 2
+accounting
+.RS 2
+.IP \[bu] 2
+Fix memory leak on long-running rcd (nielash)
+.IP \[bu] 2
+Fix memory leak from stats groups on long-running rcd (nielash)
+.IP \[bu] 2
+Fix bwlimit burst overflow (Rayan Salhab)
+.RE
+.IP \[bu] 2
+bisync
+.RS 2
+.IP \[bu] 2
+Fix memory leak when running via the rc (nielash)
+.IP \[bu] 2
+Fix failed transfers of empty files being recorded as synced (Nick
+Craig-Wood)
+.RE
+.IP \[bu] 2
+build: Make go1.26 the minimum required version as needed by
+golang.org/x/crypto v0.56.0 (Nick Craig-Wood)
+.IP \[bu] 2
+config: Redact env var config values in logs (Pastalikek65)
+.IP \[bu] 2
+doc fixes (Anton Karpov, CAOShurong, Dean Chen, Nick Craig-Wood,
+Recoordinate, Rodrigo Rodrigues, Shantanav Mukherjee, shaurya)
+.IP \[bu] 2
+lib/batcher: Prevent commits racing shutdown (Loi Nguyen)
+.IP \[bu] 2
+lib/transform: Fix panic in \f[V]truncate_keep_extension\f[R] (VXNCXNX)
+.IP \[bu] 2
+multipart: Fix chunked uploads storing truncated objects when the source
+ends early (Nick Craig-Wood)
+.IP \[bu] 2
+operations: Fix silent truncation of streaming uploads whose source ends
+early (Nick Craig-Wood)
+.IP \[bu] 2
+serve
+.RS 2
+.IP \[bu] 2
+Fix VFS instance leaks on server startup failures and shutdown (Hakan
+İSMAİL)
+.IP \[bu] 2
+Pass the client IP address to the auth proxy (am-at-enrollvb)
+.RE
+.IP \[bu] 2
+serve http: Prevent scrolling to the top on page reload (Sune Mølgaard)
+.IP \[bu] 2
+serve nfs: Fix EIO when creating symlinks with \f[V]--vfs-links\f[R]
+(SillyZir)
+.IP \[bu] 2
+serve s3
+.RS 2
+.IP \[bu] 2
+Fix failed uploads deleting or corrupting the object at the key (Nick
+Craig-Wood)
+.IP \[bu] 2
+Fix crash when a multipart upload is aborted while a part is uploading
+(Nick Craig-Wood)
+.IP \[bu] 2
+Fix modtime not being set when only mtime metadata is supplied on PUT
+(Nick Craig-Wood)
+.IP \[bu] 2
+Upload all multipart uploads via the VFS so they obey
+\f[V]--bwlimit\f[R] and show in stats (Nick Craig-Wood)
+.IP \[bu] 2
+Reserve the \f[V].rclone_temp_\f[R] prefix for temporary objects (Nick
+Craig-Wood)
+.IP \[bu] 2
+Clean up abandoned multipart uploads after \f[V]--multipart-expiry\f[R]
+(Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+vfscache
+.RS 2
+.IP \[bu] 2
+Fix reader deadlock when the item size drops below the read offset
+(Dave)
+.IP \[bu] 2
+Fix log message growing without bound on repeated write errors (Vijay
+Misal)
+.RE
+.IP \[bu] 2
+walk: Stop directory traversal when the context is cancelled (Rahman
+Yilmaz)
+.RE
+.IP \[bu] 2
+VFS
+.RS 2
+.IP \[bu] 2
+Synchronize poll updates with shutdown (Loi Nguyen)
+.IP \[bu] 2
+Make poll shutdown lifecycle deterministic (Loi Nguyen)
+.RE
+.IP \[bu] 2
+Crypt
+.RS 2
+.IP \[bu] 2
+Fix hash mismatches with \f[V]no_data_encryption\f[R] on backends which
+check upload hashes (Nick Craig-Wood)
+.IP \[bu] 2
+Fix directory names which look like versioned file names (TowyTowy)
+.IP \[bu] 2
+Warn about directories with legacy version-like encrypted names (Nick
+Craig-Wood)
+.RE
+.IP \[bu] 2
+Azure Blob
+.RS 2
+.IP \[bu] 2
+Fix Entra ID server-side copy source authentication (Edward Klesel)
+.IP \[bu] 2
+Fix spurious vfs cache corruption errors during chunked reads (Nick
+Craig-Wood)
+.RE
+.IP \[bu] 2
+Azurefiles
+.RS 2
+.IP \[bu] 2
+Fix zero padded files being created when the source ends early (Nick
+Craig-Wood)
+.RE
+.IP \[bu] 2
+Box
+.RS 2
+.IP \[bu] 2
+Fix truncated files being uploaded successfully when the source ends
+early (Rohit Behera)
+.RE
+.IP \[bu] 2
+Compress
+.RS 2
+.IP \[bu] 2
+Fix corrupted objects being created when the source ends early (Nick
+Craig-Wood)
+.RE
+.IP \[bu] 2
+Drive
+.RS 2
+.IP \[bu] 2
+Don\[aq]t list trashed files when removing a directory into the trash
+(alliasgher)
+.RE
+.IP \[bu] 2
+Dropbox
+.RS 2
+.IP \[bu] 2
+Preserve Paper export paths on lookup (Loi Nguyen)
+.IP \[bu] 2
+Fix context cancellation (e.g.
+\f[V]--max-duration\f[R] limit) not stopping in-flight requests
+(debaditya)
+.IP \[bu] 2
+Fix chunked uploads of truncated files never finishing (Nick Craig-Wood)
+.IP \[bu] 2
+Don\[aq]t retry chunked upload requests when the upload has been
+cancelled (Nick Craig-Wood)
+.IP \[bu] 2
+Decode received shared-file names (Sanjay Kanth A)
+.IP \[bu] 2
+Fix ChangeNotify when the root\[aq]s case differs from Dropbox\[aq]s
+(Loi Nguyen)
+.RE
+.IP \[bu] 2
+Filelu
+.RS 2
+.IP \[bu] 2
+Fix truncated files being uploaded successfully when the source ends
+early (Nick Craig-Wood)
+.IP \[bu] 2
+Fix duplicate root path during multipart folder creation (kingston125)
+.RE
+.IP \[bu] 2
+Huaweidrive
+.RS 2
+.IP \[bu] 2
+Fix truncated files being uploaded successfully when the source ends
+early (Rohit Behera)
+.RE
+.IP \[bu] 2
+Iclouddrive
+.RS 2
+.IP \[bu] 2
+Fix uploads into an app container failing with 412 (Christian De Santis)
+.RE
+.IP \[bu] 2
+Internetarchive
+.RS 2
+.IP \[bu] 2
+Fix corrupted files being created when the source ends early (Nick
+Craig-Wood)
+.RE
+.IP \[bu] 2
+Internxt
+.RS 2
+.IP \[bu] 2
+Persist rotated token returned by the user info call (0rangeSeaW0lf)
+.RE
+.IP \[bu] 2
+Onedrive
+.RS 2
+.IP \[bu] 2
+Fix 403 Forbidden for configuration personal onedrive (machsix)
+.IP \[bu] 2
+Fall back to manual drive ID entry when drive listing fails (SillyZir)
+.IP \[bu] 2
+Don\[aq]t retry multipart upload chunk on 404 (upload session not found)
+(water)
+.RE
+.IP \[bu] 2
+Overview
+.RS 2
+.IP \[bu] 2
+Fix \[dq]internal error: no overview data found\[dq] on 32 bit
+architectures (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+Pikpak
+.RS 2
+.IP \[bu] 2
+Fix truncated files being created when the source ends early (Nick
+Craig-Wood)
+.IP \[bu] 2
+Fix truncated single part uploads reported as ok when source ends early
+(Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+Protondrive
+.RS 2
+.IP \[bu] 2
+Fix files uploaded with v1.75.0 not being readable in the Proton apps
+(Nick Craig-Wood)
+.IP \[bu] 2
+Fix corrupted uploads after a retried upload error (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+Quatrix
+.RS 2
+.IP \[bu] 2
+Fix chunk upload retries and fix memory leak (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+S3
+.RS 2
+.IP \[bu] 2
+Update Mega endpoints (Nick Craig-Wood)
+.IP \[bu] 2
+Treat UploadPart success without ETag as retryable error (CAOShurong)
+.IP \[bu] 2
+Fix server side copy failing with \f[V]--s3-no-head-object\f[R] (Anatoly
+Tarnavsky)
+.RE
+.IP \[bu] 2
+Sia
+.RS 2
+.IP \[bu] 2
+Fix corrupted files being created when the source ends early (Nick
+Craig-Wood)
+.RE
+.IP \[bu] 2
+Smb
+.RS 2
+.IP \[bu] 2
+Reuse the upload connection for SetModTime (alliasgher)
+.RE
+.IP \[bu] 2
+WebDAV
+.RS 2
+.IP \[bu] 2
+Fix SetModTime failing and hashes missing on Nextcloud (Nick Craig-Wood)
+.RE
+.IP \[bu] 2
+Yandex
+.RS 2
+.IP \[bu] 2
+Fix truncated files being uploaded successfully when the source ends
+early (Rohit Behera)
+.RE
.SS v1.75.0 - 2026-07-31
.PP
See commits (https://github.com/rclone/rclone/compare/v1.74.0...v1.75.0)
@@ -91570,20 +92550,20 @@ Security
.RS 2
.IP \[bu] 2
archive: Don\[aq]t crash on malformed squashfs images
-GHSA-6jcg-q3wp-x2f4 CVE-PENDING (Nick Craig-Wood)
+GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
.IP \[bu] 2
ftp: Fix ftp command injection when encoding doesn\[aq]t include CRLF
-GHSA-8c48-q9wj-3w37 CVE-PENDING (Nick Craig-Wood)
+GHSA-8c48-q9wj-3w37 CVE-2026-71311 (Nick Craig-Wood)
.IP \[bu] 2
lib/http: Use TLS on all \f[V]--addr\f[R] listeners when
\f[V]--cert\f[R] and \f[V]--key\f[R] are set GHSA-mfvx-7rcj-9m5g (Nick
Craig-Wood)
.IP \[bu] 2
lib/proxy: Fix unbounded HTTP CONNECT headers causing OOM
-GHSA-xhf4-832v-7xcr CVE-PENDING (Nick Craig-Wood)
+GHSA-xhf4-832v-7xcr CVE-2026-71310 (Nick Craig-Wood)
.IP \[bu] 2
local: Stop source file names escaping the destination directory
-GHSA-7p4m-qxvv-g567 CVE-PENDING (Nick Craig-Wood)
+GHSA-7p4m-qxvv-g567 CVE-2026-71313 (Nick Craig-Wood)
.IP \[bu] 2
rc
.RS 2
@@ -91611,13 +92591,13 @@ serve ftp: Use constant time comparison for password check
GHSA-mfvx-7rcj-9m5g (Nick Craig-Wood)
.IP \[bu] 2
serve restic: Fix path traversal above the served directory
-GHSA-45pq-889g-fcgh CVE-PENDING (Nick Craig-Wood)
+GHSA-45pq-889g-fcgh CVE-2026-71309 (Nick Craig-Wood)
.IP \[bu] 2
serve sftp: Don\[aq]t crash the whole server on a bad request
GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)
.IP \[bu] 2
sftp: Fix command injection via crafted filenames on PowerShell remotes
-GHSA-2m8m-jhrm-w6j2 CVE-PENDING (Nick Craig-Wood)
+GHSA-2m8m-jhrm-w6j2 CVE-2026-71312 (Nick Craig-Wood)
.IP \[bu] 2
vfs: Don\[aq]t crash the process if a backend panics on a background
goroutine GHSA-6jcg-q3wp-x2f4 (Nick Craig-Wood)