FTP: SetModTime is not supported

EDIT: checked against beta from 2.2.2022 since this was the solution in Rclone "touch" command fails since 1.57.0 But it didn't work for me.

What is the problem you are having with rclone?

I want to try out the beta feature bisync. As far as i understand, the SetModTime Feature is necessary to work for this.
This looks like this bug: https://github.com/rclone/rclone/issues/5283 But a patch has been applied and the bug was closed for rclone version 1.57. So everything should work fine.

Run the command 'rclone version' and share the full output of the command.

I tried with this Version

rclone v1.58.0-beta.5985.c26dc69e1
- os/version: ubuntu 20.04 (64 bit)
- os/kernel: 5.13.0-27-generic (x86_64)
- os/type: linux
- os/arch: amd64
- go/version: go1.17.6
- go/linking: static
- go/tags: none

and also:

rclone v1.57.0
- os/version: linuxmint 20.3 (64 bit)
- os/kernel: 5.4.0-92-generic (x86_64)
- os/type: linux
- os/arch: amd64
- go/version: go1.17.2
- go/linking: static
- go/tags: none

Both with the same result.

Which cloud storage system are you using? (eg Google Drive)

FTP against a proftpd. I assume setModTime is enabled on proftpd, because when i run rclone with
--dump requests,responses rclone sends a FEAT command. proftpd replys with

2022/02/03 10:02:37 DEBUG : FTP Rx: "211-MFMT"

To further confirm that my proftpd installation support setModTime via MFMT i tried this command with filezilla:
MFMT 20220101000000.000 /home/ham/Files/test.txt and the server responded with
213 Modify=20220101000000; /home/ham/Files/test.txt. Afterwards i confirmed on the shell, that the modification time has actually been written to the filesystem:

-rw-rw-r-- 1 ham ham 0 Jan  1 01:00 test.txt

The command you were trying to run (eg rclone copy /tmp remote:tmp)

rclone touch myserver:Files/test.txt

The rclone config contents with secrets and host name removed.

[myserver]
type = ftp
host = myserver.de
user = ham
port = 21
pass = ---removed---
tls = false
concurrency = 10
explicit_tls = true

A log from the command with the -vv flag

rclone touch myserver:Files/test.txt  -vv
2022/02/03 10:26:59 DEBUG : rclone: Version "v1.58.0-beta.5948.c504d9701" starting with parameters ["rclone" "touch" "myserver:Files/test.txt" "-vv"]
2022/02/03 10:26:59 DEBUG : Creating backend with remote "myserver:Files/test.txt"
2022/02/03 10:26:59 DEBUG : ftp://myserver.de:21/Files/test.txt: Connecting to FTP server
2022/02/03 10:26:59 DEBUG : fs cache: adding new entry for parent of "myserver:Files/test.txt", "myserver:Files"
2022/02/03 10:26:59 DEBUG : Touch time 2022-02-03 10:26:59.484981407 +0100 CET m=+0.491097802
2022/02/03 10:26:59 DEBUG : ftp://myserver.de:21/Files/test.txt: Touching "test.txt"
2022/02/03 10:26:59 ERROR : ftp://myserver.de:21/Files/test.txt: SetModTime is not supported
2022/02/03 10:26:59 DEBUG : 2 go routines active

What does

rclone backend features myserver:

Print?

According to the code

// Precision shows whether modified time is supported or not depending on the
// FTP server capabilities, namely whether FTP server:
// - accepts the MDTM command to get file time (fGetTime)
//   or supports MLSD returning precise file time in the list (fLstTime)
// - accepts the MFMT command to set file time (fSetTime)
//   or non-standard form of the MDTM command (fSetTime, too)
//   used by VsFtpd for the same purpose (WritingMDTM)

So the server has to support precise modtime listing as well as setting.

Can you run

rclone touch myserver:Files/test.txt  -vv --dump bodies

and post the output from that?

rclone backend features myserver:
{
	"Name": "myserver",
	"Root": "",
	"String": "ftp://myserver.de:21",
	"Precision": 3153600000000000000,
	"Hashes": [],
	"Features": {
		"About": false,
		"BucketBased": false,
		"BucketBasedRootOK": false,
		"CanHaveEmptyDirectories": true,
		"CaseInsensitive": false,
		"ChangeNotify": false,
		"CleanUp": false,
		"Command": false,
		"Copy": false,
		"DirCacheFlush": false,
		"DirMove": true,
		"Disconnect": false,
		"DuplicateFiles": false,
		"GetTier": false,
		"IsLocal": false,
		"ListR": false,
		"MergeDirs": false,
		"Move": true,
		"OpenWriterAt": false,
		"PublicLink": false,
		"Purge": false,
		"PutStream": true,
		"PutUnchecked": false,
		"ReadMimeType": false,
		"ServerSideAcrossConfigs": false,
		"SetTier": false,
		"SetWrapper": false,
		"Shutdown": true,
		"SlowHash": false,
		"SlowModTime": false,
		"UnWrap": false,
		"UserInfo": false,
		"WrapFs": false,
		"WriteMimeType": false
	}
}

rclone touch myserver_de:Files/test.txt  -vv --dump bodies
2022/02/03 13:47:25 DEBUG : rclone: Version "v1.58.0-beta.5985.c26dc69e1" starting with parameters ["rclone" "touch" "myserver_de:Files/test.txt" "-vv" "--dump" "bodies" ]
2022/02/03 13:47:25 DEBUG : Creating backend with remote "myserver_de:Files/"
2022/02/03 13:47:25 DEBUG : Using config file from "/home/frithjof/myserver.cfg"
2022/02/03 13:47:25 DEBUG : ftp://myserver.de:21/Files: Connecting to FTP server
2022/02/03 13:47:25 DEBUG : FTP Rx: "220 ProFTPD Server (IServ) [::ffff:192.168.168.14]"
2022/02/03 13:47:25 DEBUG : FTP Tx: "AUTH TLS"
2022/02/03 13:47:25 DEBUG : FTP Rx: "234 AUTH TLS successful"
2022/02/03 13:47:25 DEBUG : FTP Tx: "USER ham"
2022/02/03 13:47:25 DEBUG : FTP Rx: "331 Password required for ham"
2022/02/03 13:47:25 DEBUG : FTP Tx: PASS *****
2022/02/03 13:47:25 DEBUG : FTP Rx: "230 User ham logged in"
2022/02/03 13:47:25 DEBUG : FTP Tx: "FEAT"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-Features:"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-AUTH TLS"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-CCC"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-CLNT"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-EPRT"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-EPSV"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-HOST"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-LANG it-IT;en-US;bg-BG;zh-CN;es-ES;fr-FR;ru-RU;zh-TW;ko-KR;ja-JP"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-MDTM"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-MFF modify;UNIX.group;UNIX.mode;"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-MFMT"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.groupname*;UNIX.mode*;UNIX.owner*;UNIX.ownername*;"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-PBSZ"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-PROT"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-REST STREAM"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-SIZE"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-SSCN"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-TVFS"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211-UTF8"
2022/02/03 13:47:25 DEBUG : FTP Rx: "211 End"
2022/02/03 13:47:25 DEBUG : FTP Tx: "TYPE I"
2022/02/03 13:47:25 DEBUG : FTP Rx: "200 Type set to I"
2022/02/03 13:47:25 DEBUG : FTP Tx: "PBSZ 0"
2022/02/03 13:47:25 DEBUG : FTP Rx: "200 PBSZ 0 successful"
2022/02/03 13:47:25 DEBUG : FTP Tx: "PROT P"
2022/02/03 13:47:25 DEBUG : FTP Rx: "200 Protection set to Private"
2022/02/03 13:47:25 DEBUG : FTP Tx: "EPSV"
2022/02/03 13:47:25 DEBUG : FTP Rx: "229 Entering Extended Passive Mode (|||63082|)"
2022/02/03 13:47:25 DEBUG : FTP Tx: "LIST Files"
2022/02/03 13:47:25 DEBUG : FTP Rx: "150 Opening BINARY mode data connection for file list"
2022/02/03 13:47:25 DEBUG : FTP Rx: "drwxrws---  31 ham      ham         12288 Feb  3 10:16 ."
2022/02/03 13:47:25 DEBUG : FTP Rx: "drwxr-s--x  11 ham      ham          4096 Jan 28 04:10 .."
2022/02/03 13:47:25 DEBUG : FTP Rx: "drwxrwsr-x   2 ham      ham          4096 Jan 27 11:41 $RECYCLE.BIN"
:< snipp --------------------------------------------------------------------------------------------------------------------:<
2022/02/03 13:47:25 DEBUG : FTP Rx: "-rw-rw-r--   1 ham      ham             0 Jan  1 01:00 test.txt"
:< snipp --------------------------------------------------------------------------------------------------------------------:<
2022/02/03 13:47:25 DEBUG : FTP Rx: "226 Transfer complete"
2022/02/03 13:47:25 DEBUG : Touch time 2022-02-03 13:47:25.942312967 +0100 CET m=+0.458211241
2022/02/03 13:47:25 DEBUG : FTP Tx: "EPSV"
2022/02/03 13:47:25 DEBUG : FTP Rx: "229 Entering Extended Passive Mode (|||63090|)"
2022/02/03 13:47:25 DEBUG : FTP Tx: "LIST Files"
2022/02/03 13:47:25 DEBUG : FTP Rx: "150 Opening BINARY mode data connection for file list"
2022/02/03 13:47:26 DEBUG : FTP Rx: "drwxrws---  31 ham      ham         12288 Feb  3 10:16 ."
2022/02/03 13:47:26 DEBUG : FTP Rx: "drwxr-s--x  11 ham      ham          4096 Jan 28 04:10 .."
2022/02/03 13:47:26 DEBUG : FTP Rx: "drwxrwsr-x   2 ham      ham          4096 Jan 27 11:41 $RECYCLE.BIN"
:< snipp --------------------------------------------------------------------------------------------------------------------:<
2022/02/03 13:47:26 DEBUG : FTP Rx: "-rw-rw-r--   1 ham      ham             0 Jan  1 01:00 test.txt"
:< snipp --------------------------------------------------------------------------------------------------------------------:<
2022/02/03 13:47:26 DEBUG : FTP Rx: "226 Transfer complete"
2022/02/03 13:47:26 DEBUG : ftp://myserver.de:21/Files: Touching "test.txt"
2022/02/03 13:47:26 ERROR : ftp://myserver.de:21/Files: SetModTime is not supported
2022/02/03 13:47:26 DEBUG : 2 go routines active

If i look at the last three lines it appears that rclone does not try to send an MFMT command.

all commands had been run with:

 rclone --version
rclone v1.58.0-beta.5985.c26dc69e1
- os/version: ubuntu 20.04 (64 bit)
- os/kernel: 5.13.0-27-generic (x86_64)
- os/type: linux
- os/arch: amd64
- go/version: go1.17.6
- go/linking: static
- go/tags: none

I tried this locally with ProFTPD 1.3.5 Server and it worked fine.

The FEAT listing looked quite different though - yours has prefixed 211- to each line.

2022/02/03 13:04:34 DEBUG : FTP Tx: "FEAT"
2022/02/03 13:04:34 DEBUG : FTP Rx: "211-Features:"
2022/02/03 13:04:34 DEBUG : FTP Rx: " EPRT"
2022/02/03 13:04:34 DEBUG : FTP Rx: " SITE SYMLINK"
2022/02/03 13:04:34 DEBUG : FTP Rx: " EPSV"
2022/02/03 13:04:34 DEBUG : FTP Rx: " SITE UTIME"
2022/02/03 13:04:34 DEBUG : FTP Rx: " MDTM"
2022/02/03 13:04:34 DEBUG : FTP Rx: " SITE RMDIR"
2022/02/03 13:04:34 DEBUG : FTP Rx: " TVFS"
2022/02/03 13:04:34 DEBUG : FTP Rx: " SITE COPY"
2022/02/03 13:04:34 DEBUG : FTP Rx: " MFMT"
2022/02/03 13:04:34 DEBUG : FTP Rx: " SIZE"
2022/02/03 13:04:34 DEBUG : FTP Rx: " SITE MKDIR"
2022/02/03 13:04:34 DEBUG : FTP Rx: " MFF modify;UNIX.group;UNIX.mode;"
2022/02/03 13:04:34 DEBUG : FTP Rx: " REST STREAM"
2022/02/03 13:04:34 DEBUG : FTP Rx: " MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.mode*;UNIX.owner*;"
2022/02/03 13:04:34 DEBUG : FTP Rx: " UTF8"
2022/02/03 13:04:34 DEBUG : FTP Rx: " LANG en-US*"
2022/02/03 13:04:34 DEBUG : FTP Rx: "211 End"

Maybe that is something to do with it.

@ivandeex do you have any ideas?

1 Like

@ncw
Obviously our FTP parser does not recognize prefixed features lines:

If we want to converge rclone with such ProFTPd installation, we need to reproduce the behavior of user's ProFTP daemon. I have pretty large backlog in rclone and beyond now, hopefully can start on it this March :frowning:

@malcreatuire
Could you do me a favor and paste below the contents of /etc/proftpd/proftpd.conf and /etc/proftpd/conf.d/*.conf with visible secrets replaced by XXX ?

Thank you

1 Like

/etc/proftpd/proftpd.conf

ServerName		"IServ"
ServerType		standalone

DeferWelcome		off
MultilineRFC2228	on
DefaultServer		on
#ListOptions		"-l"
UseSendFile		off
RequireValidShell	off

# Symlink behaviour
# We need to disable ShowSymlinks because the Windows FTP client (which uses
# the old mod_ls LIST command) can't handle them; it just won't show any
# symlinked folders like the Groups symlinks.
# Unfortunately, "ShowSymlinks off" also breaks the modern mod_facts MLSD
# command (for example used by FileZilla) because of Bug#3859 in proftpd (fixed
# upstream and in Debian jessie): http://bugs.proftpd.org/show_bug.cgi?id=3859
# This bug causes proftpd always to report type=file even for symlinked
# directories, which now breaks FileZilla in turn. Disabling mod_facts
# unfortunately seems to be the only possible workaround for the time being.
#ShowSymlinks		off
#FactsAdvertise		off

#20220127: by fh show hidden files and break windows ftp client. 
ListOptions             "-la"
ShowSymlinks            on
FactsAdvertise          on


TimeoutNoTransfer	600
TimeoutStalled		600
TimeoutIdle		1200

DenyFilter		\*.*/

UseIPv6			on
Port			21
# PassivePorts have to be kept in sync with our firewall
PassivePorts		63000 63099
MaxInstances		30
User			proftpd
Group			nogroup
Umask			002  002
TimesGMT		off

AllowOverwrite		on
AllowRetrieveRestart	on
AllowStoreRestart	on

LogFormat		writelog "%a %l %u %t \"%r\" (%f) %s %b"
SystemLog		/var/log/proftpd/proftpd.log
ExtendedLog		/var/log/proftpd/write.log write writelog
TransferLog		/var/log/proftpd/xferlog

# TLS
TLSEngine			on
TLSRequired			on
TLSOptions			NoSessionReuseRequired
TLSLog				/var/log/proftpd/tls.log
TLSRSACertificateFile		/etc/ssl/certs/iserv.crt
TLSRSACertificateKeyFile	/etc/ssl/private/iserv.key
TLSCertificateChainFile	/etc/ssl/certs/iserv.chain
TLSCipherSuite			ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
TLSProtocol TLSv1.2

QuotaEngine		on
DelayEngine		on

ControlsEngine		on
ControlsMaxClients	2
ControlsLog		/var/log/proftpd/controls.log
ControlsInterval	5
ControlsSocket		/run/proftpd.sock

AdminControlsEngine	on

ControlsACLs		all allow user root
AdminControlsACLs	all allow user root
DelayControlsACLs	all allow user root
TLSControlsACLs		all allow user root

SQLEngine log
SQLAuthenticate off
SQLBackend postgres
SQLConnectInfo iserv@/run/postgresql/ proftpd
# The list of commands is too long to list in entirety; commands include 
#  CWD, DELE, HELP, LIST, MKD, MODE, NLST, PASS, PASV, PORT 
#  and many more. For the complete list check the FTP RFCs

# session log
SQLLog PASS session_log_login
SQLNamedQuery session_log_login FREEFORM "INSERT INTO session_log (act, service, protocol, encrypted, server_addr, server_port, client_addr, pid) VALUES ('%u', 'proftpd', upper('%{protocol}'), '%{protocol}' = 'ftps', regexp_replace('%L', '^::ffff:', '')::INET, '%p', '%a', '%P')"
SQLLog EXIT session_log_logout
SQLNamedQuery session_log_logout FREEFORM "UPDATE session_log SET logout = now() WHERE id IN (SELECT id FROM session_log WHERE act = '%u' AND service = 'proftpd' AND protocol = upper('%{protocol}') AND server_addr = regexp_replace('%L', '^::ffff:', '')::INET AND server_port = '%p' AND client_addr = '%a' AND pid = '%P' AND logout IS NULL ORDER BY login DESC LIMIT 1)"

# Login Log
SQLLog PASS pass
SQLLog ERR_PASS E_pass
SQLLOG EXIT quit
## Log accountname
#SQLNamedQuery pass FREEFORM "INSERT INTO log (name, \"user\", ip, text) SELECT '%u','%u','%a','FTP-Login erfolgreich'"
#SQLNamedQuery E_pass FREEFORM "INSERT INTO log (name, \"user\", ip, text) SELECT '%U','%U','%a','FTP-Login fehlgeschlagen' WHERE EXISTS (SELECT * from users WHERE act='%U')"
# Have to use %U because otherwise only proftpd would be logged
#SQLNamedQuery quit FREEFORM "INSERT INTO log (name, \"user\", ip, text) SELECT '%u','%u','%a','FTP-Logout' WHERE EXISTS (SELECT * from users WHERE act='%u')"
## Log firstname lastname
SQLNamedQuery pass FREEFORM "INSERT INTO log (name, \"user\", ip, text) SELECT (SELECT firstname || ' ' || lastname from users where act='%u'), '%u', '%a', 'FTP-Login erfolgreich' WHERE EXISTS (SELECT * from users WHERE act='%u')"
SQLNamedQuery E_pass FREEFORM "INSERT INTO log (name, \"user\",  ip, text) SELECT (SELECT firstname || ' ' || lastname from users where act='%U'), '%U', '%a', 'FTP-Login fehlgeschlagen' WHERE EXISTS (SELECT * from users WHERE act='%U')"
# Have to use %U because otherwise only 'proftpd' would be logged as Username
SQLNamedQuery quit FREEFORM "INSERT INTO log (name, \"user\", ip, text) SELECT (SELECT firstname || ' ' || lastname from users where act='%u'), '%u', '%a', 'FTP-Logout' WHERE EXISTS (SELECT * from users WHERE act='%u')"

# File Log
  #-- Possible Actions
  #-- idesk      webdav    samba   proftp     file_log
  #-- upload     upload    open|w  STOR/STOU  upload
  #-- rename     mv?       rename  RNFR/RNTO  mv
  #-- rm         rm        unlink  DELE       rm
  #-- mkdir      mkdir     mkdir   [X]MKD     mkdir
  #-- rm         rmdir     rmdir   [X]RMD     rmdir
  #-- mv         mv        rename  RNFR/RNTO  mv
  #-- -          -         -       APPE       append

SQLLog STOR,STOU upload
SQLLog RNFR      RNFR
SQLLog RNTO      RNTO
SQLLog ERR_RNTO  DEL_RNFR
SQLLog DELE      rm
SQLLog MKD,XMKD  mkdir
SQLLog RMD,XRMD  rmdir
SQLLog APPE      append

SQLNamedQuery upload    FREEFORM "INSERT INTO file_log      (IP, actor_uuid,            Filename, Filetype, Action, Service) SELECT '%a',       users.uuid, '%f', 'file', 'upload',  'ftp' FROM users WHERE users.act = '%U'"
SQLNamedQuery RNFR      FREEFORM "INSERT INTO file_log_RNFR (IP, ActorAct, actor_uuid,  Filename,                   Service) SELECT '%a', '%U', users.uuid, '%f', 'ftp'                    FROM users WHERE users.act = '%U'"
SQLNamedQuery RNTO      FREEFORM "INSERT INTO file_log      (IP, actor_uuid,            Filename_New,       Action, Service) SELECT '%a',       users.uuid, '%f',         'RNTO',    'ftp' FROM users WHERE users.act = '%U'"
SQLNamedQuery rm        FREEFORM "INSERT INTO file_log      (IP, actor_uuid,            Filename, Filetype, Action, Service) SELECT '%a',       users.uuid, '%f', 'file', 'rm',      'ftp' FROM users WHERE users.act = '%U'"
SQLNamedQuery mkdir     FREEFORM "INSERT INTO file_log      (IP, actor_uuid,            Filename, Filetype, Action, Service) SELECT '%a',       users.uuid, '%f', 'dir',  'mkdir',   'ftp' FROM users WHERE users.act = '%U'"
SQLNamedQuery rmdir     FREEFORM "INSERT INTO file_log      (IP, actor_uuid,            Filename, Filetype, Action, Service) SELECT '%a',       users.uuid, '%f', 'dir',  'rmdir',   'ftp' FROM users WHERE users.act = '%U'"
SQLNamedQuery append    FREEFORM "INSERT INTO file_log      (IP, actor_uuid,            Filename, Filetype, Action, Service) SELECT '%a',       users.uuid, '%f', 'file', 'append',  'ftp' FROM users WHERE users.act = '%U'"
SQLNamedQuery DEL_RNFR  FREEFORM "DELETE FROM file_log_RNFR WHERE ctid IN ( SELECT ctid FROM file_log_RNFR WHERE IP='%a' AND ActorAct='%U' AND Service='ftp' ORDER BY date DESC LIMIT 1)"

<Directory />
  AllowAll
</Directory>
<Directory /*>
  DenyAll
</Directory>
<Directory /group>
  AllowAll
</Directory>
<Directory /home>
  AllowAll
</Directory>
<Directory /home/*>
  DenyAll
</Directory>
<Directory ~>
  AllowAll
</Directory>
<Directory /srv/shares>
  AllowAll
</Directory>
<Directory /var/lib/iserv/vplan/files>
  AllowAll
</Directory>

<Directory /var/lib/iserv/infodisplay/files>
  AllowAll
</Directory>
<Directory /var/lib/iserv/infodisplay/pdf>
  AllowAll
</Directory>
<Directory /var/lib/iserv/infodisplay/pictures>
  AllowAll
</Directory>

My Proftpd version is 1.3.6-4+deb10u6. But this was quite a hint:

Solution:
Disable
MultilineRFC2228 on
in /etc/proftpd/proftpd.conf

For Reference:

http://www.proftpd.org/docs/modules/mod_core.html#MultilineRFC2228

Thanks for your effort!!

The docs for that command are interesting

By default, proftpd sends multiline responses as per RFC 959, i.e.: 200-First line More lines... 200 Last line RFC 2228 specifies that "6xy" response codes will be sent as follows: 600-First line 600-More lines... 600 Last line Note that 2228 ONLY specifies this for response codes starting with '6'. Enabling this directive causes ALL responses to be sent in this format, which may be more compatible with certain web browsers and clients.

So enabling this puts proftpd into RFC compliance for 6xy response codes (which aren't even in the original FTP RFC) but brings it out of compliance for all the other response codes!

It looks like debian have set MultilineRFC2228 on by default which is probably misguided.

Ah ha!

Well we have a workaround now which is great.

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.