Possível declarar a função localmente e usá-la no final remoto de uma conexão SSH

1

Eu estou olhando para criar uma função em um script localmente, e chamá-lo em um host remoto, através de uma conexão SSH, isso é possível?

set -e
gitpull () { 
    cd /var/www/html
    STATUS=$((git status) 2>&1)
    echo $STATUS
}

ez ssh two << 'EOSSH'
    gitpull
EOSSH

Basicamente, tenho que fazer algo como o seguinte e não quero repetir meu código ...

ez ssh two << 'EOSSH'
    gitpull
EOSSH

ez ssh three << 'EOSSH'
    gitpull
EOSSH

ez ssh four << 'EOSSH'
    gitpull
EOSSH

etc...
    
por Jeffrey L. Roberts 24.08.2018 / 08:07

3 respostas

2

Assumindo que ez ssh invoca um shell (possivelmente remotamente como o ssh sugere) para analisar esse código em seu stdin e que esse shell é o mesmo que interpretar o script (e executando em a mesma localidade) e que é ksh, bash ou zsh (para typeset -f support), você poderia fazer:

ez ssh two << EOSSH

$(typeset -f gitpull)
gitpull

EOSSH

Ou seja, passe a definição da função gitpull para o shell que ez ssh chama antes de invocá-lo. Ou com zsh :

ez ssh two << EOSSH
$functions[gitpull]
EOSSH

Ou, claro, você poderia fazer:

gitpull='
  cd /var/www/html
  STATUS=$((git status) 2>&1)
  echo $STATUS
'
ez ssh two << EOSSH
$gitpull
EOSSH

ou

printf '%s\n' "$gitpull" | ez ssh two

Outras abordagens podem ser usar loops como já sugerido ou fazer:

ez_ssh_gitpull() {
  ez ssh "$@" << 'EOSSH'
    cd /var/www/html
    STATUS=$((git status) 2>&1)
    echo $STATUS
EOSSH
}

ez_ssh_gitpull two
ez_ssh_gitpull three
    
por 24.08.2018 / 08:45
1

Parece que você está procurando por um loop:

for remote in two three four; do
    ez ssh "$remote" <<'END_SSH'
script
goes here
END_SSH
done

Um documento aqui é apenas um documento, como um arquivo, redirecionado para um comando. Se você tiver sua chamada de função em um arquivo que você redireciona em vez de um documento aqui, a definição da função deve estar disponível nesse mesmo ambiente de execução para que você possa chamá-la. O mesmo acontece com uma chamada de função em um documento aqui.

A definição da função em um shell local não a torna disponível para chamadas na máquina remota através de ssh .

As duas linhas

STATUS=$((git status) 2>&1)
echo $STATUS

pode ser simplificado na linha única

git status 2>&1

Portanto, seu script completo a ser executado remotamente é

cd /var/www/html && git status

... sem função.

Observe o && entre o comando cd e o git . Isso impede que git seja chamado se o cd falhar. Essa é uma maneira comum de proteger contra a execução acidental de um comando se o diretório necessário não existir (devido a circunstâncias imprevistas). Você também pode querer relatar um diretório /var/www/html ausente no script.

Eu também removi a combinação dos dois fluxos de saída. Isso permite que você faça isso no shell de chamada ou manipule-os separadamente, se desejar.

    
por 24.08.2018 / 08:43
0

create a function outside of a heredoc and call it from within a heredoc, is this possible?

Bem, parece, desde que você não cite a palavra "here-document", e use "command substitution":

gitpull () { echo $1; }

cat << 'EOF'
$(gitpull T1)
EOF

$(gitpull ARG1)    <--- output of 'cat'

cat << EOF 
$(gitpull ARG1)
EOF

ARG1               <--- output of 'cat'
    
por 24.08.2018 / 09:28