Shell脚本循环遍历文件,ssh进入远程服务器并且复制文件继续失败

时间:2014-02-20 00:06:27

标签: linux bash shell ssh

鉴于以下文件,我无法弄清楚如何在内部最远程ssh命令的第一次失败时继续逐行遍历这些行。

基本前提是将此脚本ssh发送到定义为INPUT_FILE的远程服务器USER,并将一堆文件复制到远程位置进行备份..实际备份脚本位于{{ 1}}。其中backup.sh执行。

我的问题是,如果backup.sh抛出错误,那么controller.sh整个cp循环的权限被拒绝,并且它将无法连接到我的任何转发服务器while。我知道这是因为我故意在各种服务器上设置权限来测试这种情况。

如何遍历文件,等待第一个ssh命令完成并强制它转到下一行而不退出。

controller.sh

INPUT_FILE

backup.sh

INPUT_FILE=$1
USER=$2
SCRIPT_DIR=/opt/sapdownloads/MikesUtilities/backups
BACKUP_DIR=$SCRIPT_DIR/data
DATE=`date +%m%d%y`
LOG_FILE=$SCRIPT_DIR/logs/backup.controller.log


##
# Create The Log dir and log files
##
function log(){
   echo -e ${*}
   echo -e "[${USER}][`date`] - ${*}" >> ${LOG_FILE}
}


#Iterate through the input file line by line

cat $INPUT_FILE | while read l;do {
   #Split the line by spaces into an array
   line=($l)
   #make sure server is lower case
   SERVER=`echo ${line[1]} | tr [:lower:] [:upper:]`
   #make sure tier is uppercase
   TIER=`echo ${line[0]} | tr [:upper:] [:lower:]`
   log "###################################"
   log "#  Tier: $TIER | SERVER: $SERVER  #"
   log "###################################"
   log "Making Sure we can login to the Server"
   CHK=`ssh -t -q -o "BatchMode yes" -o "ConnectTimeout 5" -l $USER $SERVER "echo success"`;
   if [ "success" = $CHK ] >/dev/null 2>&1
   then
      CPDIR=$BACKUP_DIR/$TIER/$SERVER/$DATE
      log "Creating new backup directories in $CPDIR"
      #make the new backup directory in $BACKUP_DIR
      mkdir -p $BACKUP_DIR/$TIER/$SERVER/$DATE/etc
      mkdir -p $BACKUP_DIR/$TIER/$SERVER/$DATE/home


      log "Executing Remote Backup Script"
      ret=`ssh -n -t -q -o "BatchMode yes" -o "ConnectTimeout 5" -l $USER $SERVER "/bin/bash $SCRIPT_DIR/backup.sh $CPDIR; echo $?"`
      echo "return: [$ret]"
      if [ $ret -eq 0 ]; then
         echo "Success. Aborting"
         break
      fi
   else
      printf "${i}\tUnable to connect to host\n" >> $ERRORS;
   fi
} </dev/null; done

1 个答案:

答案 0 :(得分:2)

正如您可能已经猜到的那样,ssh正在从while循环中获取您的输入,这就是它失败的原因。实际上我并不是100%确定-n在这种情况下不起作用的原因,但我们可以解决它。

由于我没有备份脚本(也没有常规设置),所以我对脚本进行了相当简化,但我认为总体思路是一样的。通过输入文件获取服务器信息,并尝试找到我们可以登录的服务器,然后看看我们是否可以成功执行那里的脚本

我在等待几秒钟的远程计算机上调用一个简单的脚本,并返回exit code。您应该向Backup.sh添加一些退出代码,以便您可以检查远程命令返回的内容,然后对其进行操作。

因此,通过向while(和</dev/null)添加大括号,并从远程脚本中检索退出代码,我能够通过列表,直到成功完成远程脚本执行:

cat $INPUT_FILE | while read l;do {

SERVER=($l)
CHK=`ssh -t -q -o "BatchMode yes" -o "ConnectTimeout 5" -l $USER $SERVER "echo success"`;

if [ "success" = $CHK ] >/dev/null 2>&1
then
  ret=`ssh -n -t -q -o "BatchMode yes" -o "ConnectTimeout 5" -l $USER $SERVER '/home/username/timer.sh testvar;echo $?'`
  echo "return: [$ret]"
  if [ $ret -eq 0 ]; then
       echo "Success. Aborting"
       break
  fi
else
  printf "${i}\tUnable to connect to host\n";
fi
} < /dev/null; done

希望有所帮助