使用FTP递归地将文件PUT到远程服务器

时间:2009-09-10 02:21:27

标签: recursion ftp data-transfer put ftp-client

我目前的情况是我对服务器的访问权限非常有限,但需要上传和下载单个目录结构中包含的大量文件。我没有SSH访问权限,所以我不能使用SCP - 不幸的是,rsync不是一个选项。

我目前正在使用ncftpput,这很棒,但似乎很慢(尽管连接速度很快)。

我可以研究一种替代/更好的方法吗?

(请接受我的道歉,如果已经涵盖,我在发布前做了快速搜索,但没有找到任何具体回答我问题的内容)

5 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

如果连接良好,我建议通过GNOME或KDE文件管理器安装ftp服务器,或者使用CurlFtpFS。然后你可以像对待另一个文件夹一样对待它。

答案 2 :(得分:1)

我不熟悉ncftpput。对于非交互式FTP,我一直使用Perl Net :: FTP模块 - http://perldoc.perl.org/Net/FTP.html

这会更快,因为你可以登录,然后一次完成所有的转移(粗略地看一下你为每个文件获取/放置执行ncftpput一次)。

请记住永远不要使用ASCII修改!这是默认值,因此请使用:

$ftp->binary

使用MySQL自动时区解释,ASCII修改需要在同一个火灾中死亡。

答案 3 :(得分:0)

由于我总是遇到问题,我会在这里发表我的笔记:

我总是迷惑的一句是语法;所以下面有一个bash测试器脚本,它创建一些临时目录,然后启动一个临时的ftp服务器,并将rsync(在普通本地文件模式下,因为它不支持ftp)与{{ 1}}和lftp

问题是 - 您可以使用ftpsync,rsync会自动判断您希望在rsync /path/to/local /path/to/remote/下创建local子目录;但是,对于remotelftp,您手动指定目标目录,如ftpsync中所示(如果它不存在则会创建)。

您可以在How do I temporarily run an FTP server? - Ask Ubuntu中找到... /path/to/local /path/to/remote/local; ftpserver-cli.py就在这里:FTPsync(但是,请注意它是错误的;另请参阅Search/grep ftp remote filenames - Unix & Linux Stack Exchange);

以下是ftpsync脚本的缩短输出,显示了不同情况下的递归放置行为:

puttest.sh

而且,这是$ bash puttest.sh Recreate directories; populate loctest, keep srvtest empty: show dirs: + tree --noreport -a /tmp/srvtest /tmp/loctest /tmp/srvtest /tmp/loctest ├── .git │   └── tempa2.txt └── tempa1.txt *NOTE, rsync can automatically figure out parent dir: + rsync -a --exclude '*.git*' /tmp/loctest /tmp/srvtest/ show dirs: + tree --noreport -a /tmp/srvtest /tmp/loctest /tmp/srvtest └── loctest └── tempa1.txt /tmp/loctest ├── .git │   └── tempa2.txt └── tempa1.txt cleanup: + rm -rf /tmp/srvtest/loctest Start a temporary ftp server: + sudo bash -c 'python /path/to/pyftpdlib/ftpserver-cli.py --username=user --password=12345 --directory=/tmp/srvtest &' + sleep 1 Using: user: user pass: 12345 port: 21 dir: /tmp/srvtest [I 14-03-02 23:24:01] >>> starting FTP server on 127.0.0.1:21, pid=21549 <<< [I 14-03-02 23:24:01] poller: <class 'pyftpdlib.ioloop.Epoll'> [I 14-03-02 23:24:01] masquerade (NAT) address: None [I 14-03-02 23:24:01] passive ports: None [I 14-03-02 23:24:01] use sendfile(2): False test with lftp: *NOTE, lftp syncs *contents* of local dir (rsync-like syntax doesn't create target dir): + lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest / ; exit' -u user,12345 127.0.0.1 show dirs: + tree --noreport -a /tmp/srvtest /tmp/loctest /tmp/srvtest └── tempa1.txt /tmp/loctest ├── .git │   └── tempa2.txt └── tempa1.txt cleanup: + rm -rf /tmp/srvtest/tempa1.txt *NOTE, specify lftp target dir explicitly (will be autocreated): + lftp -e 'mirror -R -x ".*\.git.*" /tmp/loctest /loctest ; exit' -u user,12345 127.0.0.1 show dirs: + tree --noreport -a /tmp/srvtest /tmp/loctest /tmp/srvtest └── loctest └── tempa1.txt /tmp/loctest ├── .git │   └── tempa2.txt └── tempa1.txt cleanup: + sudo rm -rf /tmp/srvtest/loctest *NOTE, ftpsync syncs *contents* of local dir (rsync-like syntax doesn't create target dir); also info mode -i is buggy (it puts, although it shouldn't): *NOTE, ftpsync --ignoremask is for older unused code; use --exclude instead (but it is buggy; need to change in source) + /path/to/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:12345@127.0.0.1/ show dirs: + tree --noreport -a /tmp/srvtest /tmp/loctest /tmp/srvtest └── tempa1.txt /tmp/loctest ├── .git │   └── tempa2.txt └── tempa1.txt cleanup: + sudo rm -rf /tmp/srvtest/tempa1.txt *NOTE, specify ftpsync target dir explicitly (will be autocreated): + /path/to/ftpsync/ftpsync -i -d '--exclude=.*\.git.*' /tmp/loctest ftp://user:12345@127.0.0.1/loctest show dirs: + tree --noreport -a /tmp/srvtest /tmp/loctest /tmp/srvtest └── loctest └── tempa1.txt /tmp/loctest ├── .git │   └── tempa2.txt └── tempa1.txt cleanup: + sudo rm -rf /tmp/srvtest/loctest + sudo pkill -f ftpserver-cli.py 脚本:

puttest.sh

答案 4 :(得分:0)

没有提及ncftp

在Ubuntu中,io.on('connection', (socket) => { console.log('sending message'); socket.emit('foo', 'Hello world.'); });