我尝试创建一个脚本,该脚本将使用lftp将某些文件上传到ftp服务器,但到目前为止没有任何运气。如果我在debian中使用了build in ftp命令,那么我将成功连接并放置文件。 这是lftp命令的调试输出:
lftp xxx.xxx.xxx.xxxx -e "put -O /out/ some_file_name" -d
---- using user `user01' and password from ~/.netrc
---- Resolving host address...
---- 1 address found:xxx.xxx.xxx.xxxx
---- Connecting to xxx.xxx.xxx.xxxx (xxx.xxx.xxx.xxxx) port 21
<--- 220 (vsFTPd 2.0.7)
---> FEAT
<--- 211-Features:
<--- EPRT
<--- EPSV
<--- MDTM
<--- PASV
<--- REST STREAM
<--- SIZE
<--- TVFS
<--- UTF8
<--- 211 End
---> OPTS UTF8 ON
<--- 200 Always in UTF8 mode.
---> USER user01
<--- 331 Please specify the password.
---> PASS XXXX
<--- 230 Login successful.
---> PWD
<--- 257 "/"
---> TYPE I
<--- 200 Switching to Binary mode.
---> EPSV
<--- 550 Permission denied.
---- Switching passive mode off
---- Closing data socket
---- Closing control socket
您可以看到我正在使用.netrc文件中存储的用户名和密码。我有另一个连接到同一服务器的脚本,但是该脚本上载文件并再次使用lftp在远程ftp文件夹中重命名它们。有人可以帮忙解释一下为什么我不能使用lfpt但可以使用ftp做到这一点。
答案 0 :(得分:1)
虽然550 Permission denied.
是对EPSV
命令的奇怪响应,但这意味着服务器或介于两者之间的某个中间盒无法理解EPSV
命令(很可能是中间盒,因为对{ {1}}显示FEAT
受支持)。如果您使用内置的EPSV
命令而不是ftp
,则可能会使用较旧的lftp
命令(仅IPv4)而不是较新的PASV
命令(支持IPv4 + IPv6)
根据the man page,有一个设置EPSV
应该默认为ftp:prefer-epsv
。也许某些配置将此值设置为true,以便false
将使用lftp
而不是EPSV
。检查您的设置(在lftp中的PASV
),如果它是正确的(预期),请将其设置为set -a
,然后重试,希望它随后将使用false
而不是{{1 }}。
答案 1 :(得分:0)
将set ftp:passive-mode true
和set ftp:prefer-epsv false
添加到/etc/lftp.conf后,错误已更改
<--- 230 Login successful.
---> PWD
<--- 257 "/"
---> TYPE I
<--- 200 Switching to Binary mode.
---> PASV
<--- 227 Entering Passive Mode (xxx.xxx.xxx.xxx,76,92)
---- Connecting data socket to (xxx.xxx.xxx.xxx) port 19548
---- Data connection established
---> ALLO 710
<--- 550 Permission denied.
---> STOR out/my_file_name
---> ABOR
put: Access failed: 550 Permission denied. (/out/my_file_name)
---- Closing aborted data socket
---- Closing control socket
好的,我了解ALLO的含义
ALLO命令可能会发送到服务器,该服务器需要在传输发生之前为上传的文件保留必要的空间
因此,在ftp手册页中快速搜索之后,我找到了将其关闭的命令。添加set ftp:use-allo false
并使用epsv false
之后,现在一切正常。非常感谢:)
答案 2 :(得分:0)
lftp -e "set ftp:use-allo false; set ftp:passive-mode true; set ftp:prefer-epsv false; mirror -R {local dir} {remote dir}" -u {username},{password} {host}
使用此单个命令即可将文件从本地同步到服务器,而不会出现550个权限错误。