迭代Bash脚本中的IPv6地址列表以进行循环

时间:2013-12-19 08:45:50

标签: linux bash ssh ipv6 scp

在Bash脚本中,我遍历IPv6地址列表。我尝试在每个唯一的IPv6设备上scp一个唯一的文件。每个设备的唯一文件在文件名中都有IPv6地址。

不幸的是,SSH / SCP尝试解析文件名中的内容并抛出此错误:

“ssh:无法解析主机名file_2001:名称或服务未知”

我怎么能抑制这种意想不到的解决方案?还是有可能在这里逃避什么?

#!/bin/bash

DEVICES="\
2001:db8::3e81:d8ff:feef:4982 \
"

do_copy_xml_file()
{
    if [ -e $XML_FILE ]; then
        for X in ${DEVICES} ; do
            echo "copy file_${X}.xml to ${X}:/data/file.sxml"
            sshpass scp -o stricthostkeychecking=yes file_"${X}".xml root@\[${X}\]:/file.xml
        done
    else
        echo $XML_FILE does not exist
    fi
}

do_copy_xml_file

1 个答案:

答案 0 :(得分:1)

尝试使用

file_"${X//:/_}".xml

:替换所有_

如果您的文件已经以这种方式命名,并且不应更改,

file_"${X//:/\\:}".xml

也可以使用。但我不确定scp是否能够恰当地认识到这一点。

除此之外,scp联机帮助页包含

  

文件名可能包含用户和主机规范以指明这一点   该文件将被复制到该主机或从该主机复制。本地文件名可以是   明确使用绝对或相对路径名来避免scp   处理包含':'的文件名作为主机说明符。副本之间   也允许使用两个远程主机。

所以只使用./file_"${X}".xml也可以。