sintaxe da instrução case para verificar a existência de entrada em vários caminhos de arquivo

0

Eu tenho uma lista de entrada com lista de host completa da empresa ( /home/completehostlistcheck.txt ). Dependendo do ambiente (compare a entrada de dev=/home/dev.txt e prod=/home/prod.txt ), execute echo e diga qual é o ambiente. Problema é a sintaxe do caso não está funcionando

#!/bin/bash

dev=/home/dev.txt
prod=/home/prod.txt

for host in $(</home/completehostlistcheck.txt) 
do 
ssh $host

chk=$hostname
  case "$chk" in
dev) echo "this is dev"
;;
prod) echo "this is prod"
;;

esac 
done
    
por user227863 30.04.2018 / 19:37

2 respostas

0

Se você conhece as diferenças entre seus hosts de desenvolvimento e seus hosts de produção, ou se há uma convenção de nomenclatura simples (por exemplo, dev.example.com vs. prod.example.com ), isso pode ser tão simples quanto:

for host in $(</home/completelistlistcheck.txt); do
    case "$(ssh $host hostname)" in
        *dev*)
            env="development"
            break
            ;;
        *prod*)
            env="production"
            break
            ;;
        *)
            env="non-categorized"
            break
            ;;
    esac
    echo "$host is a $env host."
done

Se houver um arquivo em cada host do qual você precise analisar o conteúdo, use cat /path/to/file em vez de hostname no comando executado por meio de ssh .

    
por 30.04.2018 / 19:53
0

Existem vários problemas:

nome do host

A menos que seu login garanta que essa variável exista, você deve usar o comando hostname :

chk=$(hostname)

ssh

ssh $host apenas faz um login e aguarda a entrada do terminal. O seguinte comando é executado após ssh sair. Você precisa adicionar um comando à chamada ssh . Seria um pouco demais para passar todo o case stuff para ssh , mas pelo que entendi você precisa apenas do resultado de hostname :

chk="(ssh "$host" hostname)"
    
por 30.04.2018 / 20:02

Tags