Você pode aninhar chamadas remotas usando ssh em um script bash? [duplicado]

1

Encontrei um problema estranho que Computer A pode ver Computer B , Computer B pode ver Computer C , mas Computer A pode não ver Computer C .

Eu gostaria de fazer um script bash que possa ser executado em A que chamará comandos arbitrários em C , mas não consigo fazer as aspas duplas funcionarem corretamente. A ideia é:

AMB_CMD='source eniron.dat; cd path/to/code/; make clean all'
ssh -t username@ComputerB "ssh -t username@ComputerC "$AMB_CMD""

Eu pensei que resolver o que está sendo executado em B iria corrigir isso, assim:

AMB_CMD='source eniron.dat; cd path/to/code/; make clean all'
B_CMD=ssh -t username@ComputerC "$AMB_CMD"
ssh -t username@ComputerB "$B_CMD"

Mas ainda estou tendo problemas.

    
por hehe3301 17.09.2018 / 15:58

2 respostas

3

Tanto quanto sei, não é necessário citar o comando real.

ssh username@ComputerB ssh username@ComputerC make clean all

Ou

ssh -J username@ComputerB username@ComputerC make clean all

Isso usaria ComputerB como um host de salto para conexão com ComputerC .

Com o OpenSSH 7.3+, a opção de configuração ProxyJump permite que você configure um host de salto em ~/.ssh/config :

Host ComputerC
    User username
    ProxyJump username@ComputerB

... então o comando seria reduzido para

ssh ComputerC make clean all

Dependendo do que seus problemas realmente consistem (nenhuma mensagem de erro foi mencionada na pergunta), pode ter algo a ver com a execução de make no diretório errado. Para cd no diretório correto antes de executar make use a opção -C do utilitário:

ssh username@ComputerC make -C path/to/build/dir clean all

Além disso, se você quiser armazenar o comando real em uma variável, não use uma única string em bash , mas uma matriz:

cmd=( make -C "path/to/build/dir" clean all )

ssh ... "${cmd[@]}"
    
por 17.09.2018 / 16:16
1

É importante perceber que os argumentos passados para ssh são concatenados para formar uma linha de comando do shell interpretada pelo shell de login do usuário remoto.

Portanto, para poder executar some-shell-code em C através de uma conexão ssh para B, você precisa construir uma linha de comando para B para que o shell de login do usuário de B interprete corretamente para passar esse some-shell-code como está para ssh .

Se o shell atual em A, o shell de login do usuário em B e o shell de login do usuário em C forem todos bash , mesma versão (e usando o mesmo código do idioma se algum desse código contiver não-ASCII caracteres), e $CODE contém o código bash para executar em C, você pode fazer:

printf -v quoted_CODE %q "$CODE"
ssh B "ssh C $quoted_CODE"

Se você não pode ter certeza de que o shell de login do usuário em B ou C é bash , e você não precisa passar nenhuma informação sobre stdin, você pode simplesmente fazer:

ssh B ssh C bash <<< "$CODE"

Ou se você sabe que sshd em A e B permite% Variáveis LC_* ( AcceptEnv LC_* comum em sshd_config ):

LC_CODE=$CODE ssh -o SendEnv=LC_CODE B '
  ssh -o SendEnv=LC_CODE C bash -c '\'' eval "$LC_CODE"'\'
    
por 17.09.2018 / 17:58