用 sftp 替换 scp

Ulr*_*rar 3 ssh sftp scp

我们有一些同步脚本,用于客户端使用 scp 将文件发送到由其提供商之一管理的远程服务器。最近他们关闭了它,他们提供的新的不允许scp,只允许sftp(无法在远程服务器上获取shell,因此scp / rsync无法运行)。

有没有一种简单的方法可以用 sftp 替换脚本中的 scp ?我想我所知道的最简单的方法是使用 sshfs 并使用 cp 而不是 scp,但这非常难看。

看起来 sftp 可以使用 -b 传递一个包含命令的文件,但这意味着重新编码部分脚本。我想知道是否有任何方法可以使用 sftp 作为 scp 的替代品,或者其他一些可以提供类似功能的软件包?(即 sftp /source user@remote:/dest 或类似的东西,如果我能 sed 脚本只替换命令就完美了)

谢谢

Aar*_*ron 9

通过 sftp 或 chroot sftp 进行 Rsync

编辑:需要明确的是,LFTP客户端支持多种协议,包括 FTP、HTTP、FISH、SFTP、HTTPS、FTPS 和 BitTorrent。在这个例子中,我们使用SFTP。客户名称引起了阅读这篇文章的人们的一些困惑。

您可以使用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
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我省略了密码,因为我们有一个到目标主机的 SSH 密钥信任。

注意:-R并不意味着递归。该-R标志意味着推送到远程。

--parallel=是将作业分解成的线程数。这可以限制或通过在MaxStartups影响当然/etc/ssh/sshd_config和NOFILE PAM限制和目标服务器上的其它限制。

net:max-retries 6 我喜欢重试,以防万一有网络维护。

net:timeout 4 放弃,然后在 4 秒后重试。

--no-perms 如果您不想更改远程端的权限。

--newer-than 只是根据需要使用的东西的一个例子。

--loop 可用于重复同步,直到未检测到更改。

bye 我们不想忘记注销而不是依赖空闲超时。

LFTP 中还有许多其他选项可用

我在使用 LFTP 的镜像子系统和 SFTP 方面拥有丰富的经验。它的速度要快得多,因为它可以将作业分解为多个流。它甚至可以将单个文件分解为多个流。

使用 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
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这似乎工作得很好。非常感谢非常完整的回答! (2认同)

小智 5

您可以使用批处理文件近似:

sftp -b batchfile [user@]host
Run Code Online (Sandbox Code Playgroud)

批处理文件包含一系列命令,这些命令必须使用等效的 ftp 命令重现“scp”操作:

cd remote_dir
lcd local_dir
put file
Run Code Online (Sandbox Code Playgroud)