Não é possível executar o arquivo de script local com variáveis por meio do ssh

1

Eu preciso rodar o arquivo test.sh abaixo para ser executado no sistema remoto.

variables.txt:

name=stackexchange

test.sh:

#!/bin/bash
source ./variables.txt
echo $name

Em execução :

ssh -i "auth.key" user@host 'bash -s' < test.sh

Mas estou recebendo este erro:

bash: line 2: ./variables.txt: No such file or directory
    
por user3756483 14.02.2017 / 15:28

2 respostas

1

Você está dizendo ao shell na outra máquina para obter o arquivo ./variables , que não está presente no pwd desse shell. Passo a passo, parece assim:

  1. Este comando se conecta via ssh e envia as linhas do local test.sh

    ssh -i "auth.key" user@host 'bash -s' < test.sh
    
  2. As shells remotas são iniciadas pela conexão ssh e, em seguida, obtêm as seguintes linhas:

    • #!/bin/bash A interpretação desta linha pelo shell remoto depende do shell que é. A maioria das conchas tratará essa linha como um comentário. Se o shell for sh , o shell remoto não se tornará bash , porque a linha shebang é válida apenas em arquivos de script e os scripts precisam do conjunto de bits executáveis.
    • source ./variables.txt Agora, o shell remoto é instruído a origem do arquivo variables.txt no diretório de trabalho atual. Se o arquivo não estiver lá, o shell lançará um erro. No seu caso, o shell é Bash, e o erro é:

      bash: line 2: ./variables.txt: No such file or directory
      
    • echo $name Como $name está vazio, há apenas uma linha vazia impressa no terminal.

Para confirmar isso, coloque um arquivo variables.txt no diretório inicial remoto com uma linha diferente para a origem, por exemplo:

name=remotehost

E execute seu script de teste como antes.

    
por 14.02.2017 / 16:32
1

Os programas em execução na máquina remota vêem os arquivos na máquina remota, não os arquivos na máquina em que você executou ssh . Você está dizendo ao SSH para copiar o conteúdo de test.sh para a máquina remota e passá-lo como entrada para bash , então você não terá problemas em executar test.sh . Mas quando o script (que o bash recebe na entrada padrão) tenta ler variables.txt , ele procura na máquina em que está sendo executado (não é como se tivesse escolha) e não o encontra.

Se o seu script não for muito complexo e não houver inclusões aninhadas, você poderá fazer uma substituição de texto para incorporar o conteúdo do script. Note que isso é frágil - só funciona se source ./variables.txt aparecer diretamente no script, não se envolver citações complexas, variáveis, eval , etc. Para simplificar, assumirei que o comando source está sozinho em seu script. linha. Transformações mais complexas seriam possíveis para lidar com cenários mais complexos.

<test.sh sed '/^[ \t]*source variables\.txt[ \t]*$/ {
  d
  r variables.txt
}' | ssh -i "auth.key" user@host 'bash -s'
    
por 15.02.2017 / 01:21