用 sftp 替换 scp

用 sftp 替换 scp

我们有一些同步脚本,用于客户端使用 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 的环境中进行文件传输。

我创建了一个工作演示,欢迎您进行测试。文件保留率很低,但欢迎您使用它来了解使用以下方法自动推送目录/文件有多么容易:lftpsftp 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

相关内容