使用 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/
我有两台服务器,我们称它们为 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/