我有两个服务器,我们称它们为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的旧版本?)< / p>
每当我在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
答案 0 :(得分:1)
要在单个命令中复制3个文件,此语法应起作用:
scp server2:"{$BLOG_ZIP_FILE,$BLOG2_ZIP_FILE,$BLOG3_ZIP_FILE}" /Volume1/Backups/
(服务器会正确扩展它。)
答案 1 :(得分:1)
我认为问题在于服务器端认为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/