mirror of
https://github.com/restic/restic.git
synced 2025-08-23 04:27:24 +00:00
Merge pull request #4519 from adamantike/backend/sftp/add-args-option
backend/sftp: Add sftp.args option
This commit is contained in:
@@ -13,8 +13,9 @@ import (
|
||||
type Config struct {
|
||||
User, Host, Port, Path string
|
||||
|
||||
Layout string `option:"layout" help:"use this backend directory layout (default: auto-detect)"`
|
||||
Layout string `option:"layout" help:"use this backend directory layout (default: auto-detect)"`
|
||||
Command string `option:"command" help:"specify command to create sftp connection"`
|
||||
Args string `option:"args" help:"specify arguments for ssh"`
|
||||
|
||||
Connections uint `option:"connections" help:"set a limit for the number of concurrent connections (default: 5)"`
|
||||
}
|
||||
|
@@ -213,6 +213,9 @@ func buildSSHCommand(cfg Config) (cmd string, args []string, err error) {
|
||||
if err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
if cfg.Args != "" {
|
||||
return "", nil, errors.New("cannot specify both sftp.command and sftp.args options")
|
||||
}
|
||||
|
||||
return args[0], args[1:], nil
|
||||
}
|
||||
@@ -226,11 +229,19 @@ func buildSSHCommand(cfg Config) (cmd string, args []string, err error) {
|
||||
args = append(args, "-p", port)
|
||||
}
|
||||
if cfg.User != "" {
|
||||
args = append(args, "-l")
|
||||
args = append(args, cfg.User)
|
||||
args = append(args, "-l", cfg.User)
|
||||
}
|
||||
args = append(args, "-s")
|
||||
args = append(args, "sftp")
|
||||
|
||||
if cfg.Args != "" {
|
||||
a, err := backend.SplitShellStrings(cfg.Args)
|
||||
if err != nil {
|
||||
return "", nil, err
|
||||
}
|
||||
|
||||
args = append(args, a...)
|
||||
}
|
||||
|
||||
args = append(args, "-s", "sftp")
|
||||
return cmd, args, nil
|
||||
}
|
||||
|
||||
|
@@ -9,38 +9,57 @@ var sshcmdTests = []struct {
|
||||
cfg Config
|
||||
cmd string
|
||||
args []string
|
||||
err string
|
||||
}{
|
||||
{
|
||||
Config{User: "user", Host: "host", Path: "dir/subdir"},
|
||||
"ssh",
|
||||
[]string{"host", "-l", "user", "-s", "sftp"},
|
||||
"",
|
||||
},
|
||||
{
|
||||
Config{Host: "host", Path: "dir/subdir"},
|
||||
"ssh",
|
||||
[]string{"host", "-s", "sftp"},
|
||||
"",
|
||||
},
|
||||
{
|
||||
Config{Host: "host", Port: "10022", Path: "/dir/subdir"},
|
||||
"ssh",
|
||||
[]string{"host", "-p", "10022", "-s", "sftp"},
|
||||
"",
|
||||
},
|
||||
{
|
||||
Config{User: "user", Host: "host", Port: "10022", Path: "/dir/subdir"},
|
||||
"ssh",
|
||||
[]string{"host", "-p", "10022", "-l", "user", "-s", "sftp"},
|
||||
"",
|
||||
},
|
||||
{
|
||||
Config{User: "user", Host: "host", Port: "10022", Path: "/dir/subdir", Args: "-i /path/to/id_rsa"},
|
||||
"ssh",
|
||||
[]string{"host", "-p", "10022", "-l", "user", "-i", "/path/to/id_rsa", "-s", "sftp"},
|
||||
"",
|
||||
},
|
||||
{
|
||||
Config{Command: "ssh something", Args: "-i /path/to/id_rsa"},
|
||||
"",
|
||||
nil,
|
||||
"cannot specify both sftp.command and sftp.args options",
|
||||
},
|
||||
{
|
||||
// IPv6 address.
|
||||
Config{User: "user", Host: "::1", Path: "dir"},
|
||||
"ssh",
|
||||
[]string{"::1", "-l", "user", "-s", "sftp"},
|
||||
"",
|
||||
},
|
||||
{
|
||||
// IPv6 address with zone and port.
|
||||
Config{User: "user", Host: "::1%lo0", Port: "22", Path: "dir"},
|
||||
"ssh",
|
||||
[]string{"::1%lo0", "-p", "22", "-l", "user", "-s", "sftp"},
|
||||
"",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -48,8 +67,14 @@ func TestBuildSSHCommand(t *testing.T) {
|
||||
for i, test := range sshcmdTests {
|
||||
t.Run("", func(t *testing.T) {
|
||||
cmd, args, err := buildSSHCommand(test.cfg)
|
||||
if err != nil {
|
||||
t.Fatalf("%v in test %d", err, i)
|
||||
if test.err != "" {
|
||||
if err.Error() != test.err {
|
||||
t.Fatalf("expected error %v got %v", test.err, err.Error())
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
t.Fatalf("%v in test %d", err, i)
|
||||
}
|
||||
}
|
||||
|
||||
if cmd != test.cmd {
|
||||
|
Reference in New Issue
Block a user