这个问题已经在这里有了答案: > Loop only iterates once with `ssh` in the body 1个
我需要在多个客户的linux服务器上管理特定软件的更新.通过将.tar.gz文件发送到每个服务器并夸大其覆盖旧软件文件来提供更新.
我已将客户的服务器列表放入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
字符“:”用作字段分隔符;字段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中的第一个客户有效.第一行上方的行被跳过了,我不知道为什么.有什么提示吗?谢谢.
编辑:作为对重复异议的答案,由于脚本相当大,我没有想到while和ssh对象之间的任何链接.我宁愿更多地考虑语法错误.但是,如果被要求删除,我仍然可以删除该问题.
解决方法:
这是因为您的while读取循环和ssh都从stdin中读取.
您可以使用/ dev / null作为ssh的stdin来修复它:
ssh host cmd < /dev/null
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。