2
2
mirror of https://github.com/octoleo/restic.git synced 2024-11-29 16:23:59 +00:00

Merge pull request #1298 from restic/fix-1288

sftp: Handle/Document tilde character
This commit is contained in:
Alexander Neumann 2017-09-30 12:28:09 +02:00
commit ba23d24dd1
3 changed files with 40 additions and 4 deletions

View File

@ -33,9 +33,9 @@ How can I specify encryption passwords automatically?
When you run ``restic backup``, you need to enter the passphrase on When you run ``restic backup``, you need to enter the passphrase on
the console. This is not very convenient for automated backups, so you the console. This is not very convenient for automated backups, so you
can also provide the password through the ``--password-file`` option, or one of can also provide the password through the ``--password-file`` option, or one of
the environment variables ``RESTIC_PASSWORD`` or ``RESTIC_PASSWORD_FILE`` the environment variables ``RESTIC_PASSWORD`` or ``RESTIC_PASSWORD_FILE``.
environment variables. A discussion is in progress over implementing unattended A discussion is in progress over implementing unattended backups happens in
backups happens in :issue:`533`. :issue:`533`.
.. important:: Be careful how you set the environment; using the env .. important:: Be careful how you set the environment; using the env
command, a `system()` call or using inline shell command, a `system()` call or using inline shell
@ -90,3 +90,28 @@ scheduling algorithm to give it the least favorable niceness (19).
The above example makes sure that the system the backup runs on The above example makes sure that the system the backup runs on
is not slowed down, which is particularly useful for servers. is not slowed down, which is particularly useful for servers.
Creating new repo on a Synology NAS via sftp fails
--------------------------------------------------
Sometimes creating a new restic repository on a Synology NAS via sftp fails
with an error similar to the following:
::
$ restic init -r sftp:user@nas:/volume1/restic-repo init
create backend at sftp:user@nas:/volume1/restic-repo/ failed:
mkdirAll(/volume1/restic-repo/index): unable to create directories: [...]
Although you can log into the NAS via SSH and see that the directory structure
is there.
The reason for this behavior is that apparently Synology NAS expose a different
directory structure via sftp, so the path that needs to be specified is
different than the directory structure on the device and maybe even as exposed
via other protocols.
The following may work:
::
$ restic init -r sftp:user@nas:/restic-repo init

View File

@ -146,6 +146,11 @@ You can also specify a relative (read: no slash (``/``) character at the
beginning) directory, in this case the dir is relative to the remote beginning) directory, in this case the dir is relative to the remote
user's home directory. user's home directory.
.. note:: Please be aware that sftp servers do not expand the tilde characte
(``~``) normally used as an alias for a user's home directory. If you
want to specify a path relative to the user's home directory, pass a
relative path to the sftp backend.
The backend config string does not allow specifying a port. If you need The backend config string does not allow specifying a port. If you need
to contact an sftp server on a different port, you can create an entry to contact an sftp server on a different port, you can create an entry
in the ``ssh`` file, usually located in your user's home directory at in the ``ssh`` file, usually located in your user's home directory at

View File

@ -64,9 +64,15 @@ func ParseConfig(s string) (interface{}, error) {
default: default:
return nil, errors.New(`invalid format, does not start with "sftp:"`) return nil, errors.New(`invalid format, does not start with "sftp:"`)
} }
p := path.Clean(dir)
if strings.HasPrefix(p, "~") {
return nil, errors.Fatal("sftp path starts with the tilde (~) character, that fails for most sftp servers.\nUse a relative directory, most servers interpret this as relative to the user's home directory.")
}
return Config{ return Config{
User: user, User: user,
Host: host, Host: host,
Path: path.Clean(dir), Path: p,
}, nil }, nil
} }