Trabalhando com variáveis locais e remotas na sessão ssh

2

Estou escrevendo um script que deve me escutar alguns arquivos depois de terem sido processados em um servidor remoto. Para fazer isso eu preciso de variáveis do servidor local que executa o script e depois algumas variáveis do servidor remoto também.

Eu tentei várias maneiras que encontrei em Stack Exchange , nenhuma delas funcionou para mim até agora.

Esta lista o script inicial:

#!/bin/bash

set -x

export someID=$1

LOG=/folder/subfolder1/$someID/tmp/getResult.log
export DIR=/folder/subfolder1/$someID
export rc=0
export lServ='hostname'

case $lServ in
        test.server*)
            remoteServer=remote.test.server
        ;;
        prod.server*|backup.server*)
            remoteServer=remote.prod.server
        ;;
esac

cd $DIR

ssh -v $remoteServer << 'EOF' >> $LOG 2>&1

    cd $someID

    folders='ls'

    for file in $folders; do
        case $file in
        *.1)
            scp -v $file/outputFolder/$file.someExt $lServ:$DIR/p.someExt
            rc='expr $rc + $?'
        ;;
        *)
            export subID='echo $file | awk -F"." '{print $2}'
            scp -v $file/outputFolder/$file.ext $lServ:$DIR/k$subID.someExt 
            rc='expr $rc + $?'
        ;;
        esac
    done

    case $rc in
    0)
        cd ..
        rm -rfv $someID
        export rc=$?
    ;;
    *)
        echo "some Errormessage"
        rc='expr $rc + 1'
    ;;
    esac
EOF

rc='expr $rc + $?'

exit $rc

Devido a restrições da empresa, não posso publicar os nomes reais ou a estrutura de pastas.

    
por Galagenberg 09.08.2016 / 10:14

2 respostas

4

A peça que falta no seu script parece ser a variável rc . Seu script (principalmente) está sendo executado em sua máquina local, então você poderia

  • cria um nome de arquivo temporário fora da parte redirecionada,
  • use esse nome dentro da parte redirecionada e
  • echo $rc no arquivo temporário e
  • leia a variável fora da parte direcionada.

Para um nome de arquivo temporário, geralmente é feito com mktemp , então as partes podem parecer

  • fora
    mytemp=$(mktemp)
    trap "rm -f $mytemp" EXIT HUP INT QUIT
  • dentro
    # get my IP-address from 'SSH_CLIENT'
    my_addr=\$(echo "\$SSH_CLIENT" |awk '{printf \;}')
    result=\$(mktemp)
    echo "\$rc" >\$result
    scp \$result \$my_addr:$mytemp
    rm -f \$result
  • fora
    rc=$(cat $mytemp)

A razão pela qual $someID não é passado do servidor local para o remoto é que o seu documento aqui começa com

ssh -v $remoteServer << 'EOF' >> $LOG 2>&1

tem citado o marcador 'EOF' , dizendo ao shell para não expandir a string antes de passá-la ao comando ssh . Se você quiser a expansão, retire as cotações. No entanto, quando você fizer isso, terá que colocar uma barra invertida antes de cada caractere $ que deseja que o shell remoto expanda.

Pode ser mais simples usar a opção -q (quiet) para ssh / scp e reduzir a saída do seu script para algo que poderia ser facilmente redirecionado para uma variável.

    
por 09.08.2016 / 10:45
2

Você não precisa executar comandos no sistema remoto, exceto para examinar arquivos. Portanto, em vez de executar comandos remotos para examinar arquivos, monte o sistema de arquivos remoto na máquina local e use comandos locais para examinar os arquivos locais e remotos. Para montar um sistema de arquivos remoto que você acessa via SSH, use SSHFS .

mkdir remote
sshfs "$remoteServer": remote
cd "$remoteServer/$someID"
for file in */*; do …
fusermount -u remote
    
por 10.08.2016 / 01:13