我们有一些同步脚本,用于客户端使用 scp 将文件发送到由其提供商之一管理的远程服务器。最近他们关闭了它,他们提供的新版本不允许 scp,只允许 sftp(无法在远程服务器上获取 shell,因此 scp / rsync 无法工作)。
有没有一种比较简单的方法可以用 sftp 替换脚本中的 scp ?我想我所知道的最简单的方法是使用 sshfs 并使用 cp 代替 scp,但这很丑陋。
看起来可以使用 -b 向 sftp 传递一个包含命令的文件,但这意味着要重新编码部分脚本。我想知道是否有任何方法可以使用 sftp 作为 scp 的替代品,或者其他可以提供类似功能的软件包?(即 sftp /source user@remote:/dest 或类似的东西,如果我可以只用 sed 脚本来替换命令,那就太完美了)
谢谢
答案1
通过 sftp 或 chroot sftp 进行 Rsync
编辑:需要明确的是,低速FTP客户端支持多种协议,包括 FTP、HTTP、FISH、SFTP、HTTPS、FTPS 和 BitTorrent。在本例中,我们使用安全FTP。客户名称给阅读此帖子的人们带来了一些困惑。
您可以使用lftp
它的镜像子系统来复制 SFTP 上的 rsync 行为。这在 chroot 环境中也有效。
lftp -u username, \
-e "set net:timeout 4;set net:max-retries 6;mirror -R --parallel=8 --no-perms --newer-than=now-2days --only-newer /source/ /source/;bye" sftp://hostname.domain
在这个例子中,我省略了密码,因为我们有一个对目标主机的 SSH 密钥信任。
笔记:不-R
表示递归。-R
标志表示推送到远程。
--parallel=
是将作业拆分成的线程数。这可当然受到/etc/ssh/sshd_config
目标服务器上的 MaxStartups 和 nofile pam 限制以及其他限制的限制或影响。
net:max-retries 6
我喜欢重试,以防网络维护。
net:timeout 4
放弃,然后4秒后重试。
--no-perms
如果您不想更改远程端的权限。
--newer-than
只是一个根据需要使用的示例。
--loop
可用于重复同步,直到没有检测到变化。
bye
我们不想忘记注销,而不是依赖空闲超时。
有还有很多其他选择在 LFTP 中。
我使用 LFTP 的镜像子系统和 SFTP 获得了很好的体验。它的速度明显更快,因为它可以将作业分解为多个流。它甚至可以将单个文件分解为多个流。
A重大安全优势使用 LFTP 允许在您不希望自动化脚本访问远程端 shell 的环境中进行文件传输。
我创建了一个工作演示,欢迎您进行测试。文件保留率很低,但欢迎您使用它来了解使用以下方法自动推送目录/文件有多么容易:lftp加sftp chroot. 只需安装lftp然后创建一些临时目录或文件,然后:
mkdir -p ~/sftp_test/`date '+%Y%m%d%H%M'`/{1,2,3}/{a,b,c}
lftp -u anon, -e "set net:timeout 4;set net:max-retries 4;mirror -R --parallel=4 --no-perms ~/sftp_test/ /private/;bye" sftp://ohftp.org
答案2
您可以使用批处理文件近似值:
sftp -b batchfile [user@]host
批处理文件包含一系列命令,这些命令必须使用等效的 ftp 命令重现“scp”操作:
cd remote_dir
lcd local_dir
put file