使用SCP的语法是否已更改?在较新的服务器上获取意外的文件名错误



我有两个服务器,我们称它们为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命令时,我都会收到以下错误:

错误:意外的文件名: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

我认为问题是服务器端认为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/

要在一个命令中复制3个文件,应该使用以下语法:

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

(服务器将正确展开。(

最新更新