从文件中读取Bash并解析每一行

时间:2014-05-29 16:05:23

标签: linux bash

我需要管理多个客户的特定软件的更新。 linux服务器。通过将.tar.gz文件发送到每个服务器并对其进行充气来覆盖旧的软件文件来提供更新。

我已经把客户放在了#39;像这样的txt文件中的服务器列表:

user1@customer-server-1-address:22:/path/to/software/server1:NULL:Customer1name

user2@customer-server-2-address:2222:/path/to/software/server2:/etc/vpnc/client1.conf:Customer2name

user3@customer-server-3-address:22:/path/to/software/server3:NULL:Customer3name

Char":"充当现场分隔符;字段1是服务器地址,2是端口,3是软件路径,4用于判断是否首先启用VPN隧道,5是客户名称。

我设法创建了以下脚本:

#!/bin/bash

[...]

while IFS=':' read -ra array; do
    if [ "${array[3]}" != "NULL" ]; then
        echo
        echo "### USING VPN CONF '${array[3]}' FOR SERVER '${array[0]}'... ###"
        sleep 1
        #vpnc ${array[3]}
        TUNNEL1=$(ifconfig | grep -o eth0)
        TUNNEL2='eth0'

        if [ "$TUNNEL1" = "$TUNNEL2" ]; then
          echo "### TUNNEL IS UP ###"

          scp -P${array[1]} $FILENAME.gz ${array[0]}:${array[2]}
          scp -P${array[1]} $FILELIST ${array[0]}:${array[2]}

          ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && cat '${array[2]}'/'$FILELIST' | cpio --quiet -H ustar -o -0 -L -F '${array[2]}'/'$BACKUP_FILENAME
          ssh -p${array[1]} ${array[0]} 'gzip '${array[2]}'/'$BACKUP_FILENAME

          ssh -p${array[1]} ${array[0]} 'tar -C '${array[2]}' -xf '${array[2]}'/'$FILENAME.gz
          ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && mkdir -p '$REMOTE_BACKUP_DIRECTORY' && rm -f '$FILELIST' && mv -f '$BACKUP_FILENAME.gz $REMOTE_BACKUP_DIRECTORY

          echo "### SERVER '${array[0]}' UPDATED ###"
          #vpnc-disconnect
          sleep 1
        else
          echo "### VPN ERROR IN SERVER '${array[4]}' ###"
        fi
    else
        echo

        scp -P${array[1]} $FILENAME.gz ${array[0]}:${array[2]}
        scp -P${array[1]} $FILELIST ${array[0]}:${array[2]}

        ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && cat '${array[2]}'/'$FILELIST' | cpio --quiet -H ustar -o -0 -L -F '${array[2]}'/'$BACKUP_FILENAME-${array[4]}
        ssh -p${array[1]} ${array[0]} 'gzip '${array[2]}'/'$BACKUP_FILENAME-${array[4]}

        ssh -p${array[1]} ${array[0]} 'tar -C '${array[2]}' -xf '${array[2]}'/'$FILENAME.gz

        ssh -p${array[1]} ${array[0]} 'cd '${array[2]}' && mkdir -p '$REMOTE_BACKUP_DIRECTORY' && rm -f '$FILELIST' && mv -f '$BACKUP_FILENAME-${array[4]}.gz $REMOTE_BACKUP_DIRECTORY

        echo "### SERVER '${array[4]}' UPDATED ###"
        echo
    fi;
done < "$CUSTOMER_SERVERS_FILE"

$ CUSTOMER_SERVERS_FILE是前面描述的容器文件,$ FILENAME.gz是更新包, $ FILELIST是要更新的文件列表。其他变量设置用于其他目的。

问题是,对于我的$ CUSTOMER_SERVERS_FILE中的第一个客户,整个过程实际上只运行 。第一个上面的行被跳过了,我无法说明原因。任何提示?谢谢。

编辑:作为重复异议的答案,作为相当大的脚本,我没有想到 ssh之间的任何关联对象。我更倾向于考虑语法错误。但是,如果被要求,我仍然可以删除这个问题。

1 个答案:

答案 0 :(得分:4)

这是因为您的while read循环和ssh都从标准输入读取。

您可以使用/dev/null作为ssh的stdin:

来修复它
ssh host cmd  < /dev/null