使用 SCP 的语法有变化吗?在较新的服务器上出现意外的文件名错误

Has the syntax using SCP changed? Getting unexpected filename error on newer servers

我有两台服务器,我们称它们为 SERVER1b 和 SERVER2。

SERVER1b 每晚都会联系 SERVER2 获取我的数据库转储,它们的标题如下:

- dump1.sql.bz2
- dump2.sql.bz2
- dump3.sql.bz2

我有一个 bash 脚本,它只运行以下命令:

BLOG_ZIP_FILE="dump1.sql.bz2"
BLOG2_ZIP_FILE="dump2.sql.bz2"
BLOG3_ZIP_FILE="dump3.sql.bz2"
scp server2:"$BLOG_ZIP_FILE $BLOG2_ZIP_FILE $BLOG3_ZIP_FILE" /Volume1/Backups/

server2 是用于通过 SSH 连接到服务器的别名。

有趣的是,我在以前的服务器上有这个脚本,我们称它为 SERVER1a,它具有完全相同的路径并且它工作正常,唯一的区别是它早了几年(也许是旧版本的 SCP? )

每当我在 SERVER1b 上执行 SCP 命令时,我都会收到以下错误:

error: unexpected filename: dump1.sql.bz2

当然,我已经仔细检查过文件确实存在,但我认为这甚至不是问题,因为会显示不同的错误。

编辑:添加了详细转储(最相关的位)

Authenticated to host.com ([xx.xx.xx.xx]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: pledge: network
debug1: Sending command: scp -v -f dump1.sql.bz2 dump2.sql.bz2 dump3.sql.bz2
Sending file modes: C0664 54580203 dump1.sql.bz2
Sink: C0664 54580203 dump1.sql.bz2
error: unexpected filename: dump1.sql.bz2

要在单个命令中复制 3 个文件,此语法应该有效:

scp server2:"{$BLOG_ZIP_FILE,$BLOG2_ZIP_FILE,$BLOG3_ZIP_FILE}" /Volume1/Backups/

(服务器会正​​确展开。)

我认为问题是服务器端认为 dump1.sql.bz2 dump2.sql.bz2 dump3.sql.bz2 是三个文件,而客户端认为它只是一个名称中有空格的文件。

在 2018 年对 OpenSSH 进行一些安全改进之前,客户端不会验证服务器端在做什么,所以只要您喜欢服务器端的行为,它就可以工作美好的。但是现在客户端正在进行验证,并抱怨它告诉服务器做什么和服务器实际做什么不匹配。 (有关这方面的更多信息,请参阅 https://sintonen.fi/advisories/scp-client-multiple-vulnerabilities.txt。)

要解决此问题,您可以将三个文件名作为单独的参数传递给 scp,以便双方就应该发送的内容达成一致:

scp "server2:$BLOG_ZIP_FILE" "server2:$BLOG2_ZIP_FILE" "server2:$BLOG3_ZIP_FILE" /Volume1/Backups/