BASH: declara uma função local no host remoto com shell interativo

1

feliz por escrever para você aqui. Fiz muita pesquisa sobre isso e não encontrei uma solução. O que eu quero fazer é relativamente simples.

Há uma função bash local de advertência no ambiente da minha estação de trabalho.

function caveat(){
  echo "function main caveat executing in $HOSTNAME"

  function caveat_a(){
    echo "function caveat_a executing in $HOSTNAME"
  }

  function caveat_b(){
    echo "function caveat_b executing in $HOSTNAME"
  }
}

E eu gostaria de fazer o SSH em um host remoto (em um shell interativo) para fazer algumas tarefas com o preguiçoso do sysadmin. E quando eu precisar executar as funções caveat_a ou caveat_b, eu gostaria de poder chamá-las lá, no host remoto ..

O que minha pesquisa revelou é que é possível declarar uma função local para estar disponível remotamente e depois executá-la diretamente ... e funciona bem para mim. Mas o que eu preciso é declarar e cair em um shell interativo.

A última tentativa foi incluir um 'bash --login' no final da linha, conforme mostrado abaixo:

username@localhost ~ $ caveat
function main caveat executing in localhost
username@localhost ~ $ caveat_a
function caveat_a executing in localhost
username@localhost ~ $ caveat_b
function caveat_b executing in localhost
username@localhost ~ $
username@localhost ~ $ ssh username@remote_host -t "$(declare -f caveat); caveat; caveat_a; bash --login"
Are you sure you want to continue connecting (yes/no)? yes
username@remote_host's password: 
function main caveat executing in remote_host
function caveat_a executing in remote_host
username@remote_host ~ $ #nice, it executed those caveat functions as echoed above

.. desta forma ele interage comigo .. então eu posso executar outros comandos lá .. mas quando eu pressiono 'caveat<TAB><TAB>' minha advertência ainda não está declarada lá.

Acho que estou perdendo alguma coisa. Agradecemos antecipadamente por toda sua ajuda e respostas.

Se possível, parece melhor usar a solução de baunilha da forma mais simples possível (sem esperar, sem outros binários).

Obrigado

    
por Hudson Santos 11.12.2017 / 20:37

1 resposta

2

Tente isto:

ssh -t user@host "$(declare -f caveat); export -f caveat; exec bash -li"

Obrigado ao @Scott pelo excelente conselho.

A opção -t para ssh é necessária para permitir que o shell interativo tenha acesso total aos recursos do seu terminal.

exec bash -li inicia um shell de login interativo. Como a função foi exportada, ela estará disponível neste novo shell.

    
por 11.12.2017 / 21:29