I’m glad you found a way out. FTP seems to do things a lot of different ways.
To finish my writeup (maybe dev will be interested) an option tries to support
absolute and relative paths in different ways. What worries me is that it isn’t
changing the request that I think is asking for the directory listing. Should it?
A more compact view is available by picking out the listing request.
Now it’s easier to test variations, such as an extra slash or this one:
--ftp-absolute-path = false Use this option to interpret the url path as an absolute path. This option only has an effect if the initial starting folder in the FTP server is not the (virtual) root folder. If not set, the path in the url is treated as relative to the initial login folder.
C:\Duplicati\duplicati-2.1.0.5_stable_2025-03-04-win-x64-gui>Duplicati.CommandLine.BackendTool list "ftp://localhost/test 2?auth-username=duplicati&auth-password=password" --ftp-log-to-console --ftp-absolute-path=false | findstr MLSD
Response: MLSD
# OpenDataStreamAsync("MLSD /test 2", 0)
# OpenPassiveDataStreamAsync(AutoPassive, "MLSD /test 2", 0)
Command: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
C:\Duplicati\duplicati-2.1.0.5_stable_2025-03-04-win-x64-gui>Duplicati.CommandLine.BackendTool list "ftp://localhost/test 2?auth-username=duplicati&auth-password=password" --ftp-log-to-console --ftp-absolute-path=true | findstr MLSD
Response: MLSD
# OpenDataStreamAsync("MLSD /test 2", 0)
# OpenPassiveDataStreamAsync(AutoPassive, "MLSD /test 2", 0)
Command: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
C:\Duplicati\duplicati-2.1.0.5_stable_2025-03-04-win-x64-gui>Duplicati.CommandLine.BackendTool list "ftp://localhost//test 2?auth-username=duplicati&auth-password=password" --ftp-log-to-console --ftp-absolute-
path=false | findstr MLSD
Response: MLSD
# OpenDataStreamAsync("MLSD /test 2", 0)
# OpenPassiveDataStreamAsync(AutoPassive, "MLSD /test 2", 0)
Command: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
C:\Duplicati\duplicati-2.1.0.5_stable_2025-03-04-win-x64-gui>Duplicati.CommandLine.BackendTool list "ftp://localhost//test 2?auth-username=duplicati&auth-password=password" --ftp-log-to-console --ftp-absolute-path=true | findstr MLSD
Response: MLSD
# OpenDataStreamAsync("MLSD /test 2", 0)
# OpenPassiveDataStreamAsync(AutoPassive, "MLSD /test 2", 0)
Command: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
Status: Waiting for response to: MLSD /test 2
C:\Duplicati\duplicati-2.1.0.5_stable_2025-03-04-win-x64-gui>
EDIT 1:
2.0.8.1 seems to do the same four combinations without a leading slash,
although it did do a PWD to find itself at /. Then a CWD test2, then a list.
EDIT 2:
Regarding the initial starting folder in the FTP server
, the lack of effect from the option might be because mine is in fact FTP virtual root, as evidenced by:
PWD
257 "/" is current directory.
and I’m not sure what to conclude about behavior where user Path has initial slash.
EDIT 3:
FileZilla Server screen of the path config has it as follows. Other servers may vary: