Eu tenho uma máquina local que deveria fazer uma sessão SSH em uma master
máquina remota e, em seguida, outra sessão SSH interna de master
para cada um dos remotos slaves
, e depois executar 2 comandos, ou seja, para excluir um diretório específico e recriá-lo.
Observe que a máquina local possui SSH sem senha para o mestre e o mestre tem SSH sem senha para os escravos. Também todos os nomes de host são conhecidos nas .ssh/config
máquinas locais / master e os nomes de host dos escravos estão slaves.txt
localmente e eu os leio a partir daí.
Então, o que eu faço e funciona é o seguinte:
username="ubuntu"
masterHostname="myMaster"
while read line
do
#Remove previous folders and create new ones.
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition""
ssh -n $username@$masterHostname "ssh -t -t $username@$line "mkdir -p EC2_WORKSPACE/$project Input Output Partition""
#Update changed files...
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rsync --delete -avzh /EC2_NFS/$project/* EC2_WORKSPACE/$project""
done < slaves.txt
Este cluster está no Amazon EC2 e notei que existem 6 sessões SSH criadas a cada iteração, o que induz um atraso significativo. Gostaria de combinar esses 3 comandos em 1 para obter menos conexões SSH. Então, eu tentei combinar os 2 primeiros comandos em
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""
Mas não funciona como esperado. Parece executar o primeiro ( rm -rf Input Output Partition
) e depois sai da sessão e continua. O que eu posso fazer?
fonte
-J
opção que definiria seu host de salto.Respostas:
Considere que este
&&
é um operador lógico. Isso não significa "também execute este comando", significa "execute este comando se o outro tiver êxito".Isso significa que se o
rm
comando falhar (o que acontecerá se algum dos três diretórios não existir),mkdir
ele não será executado. Isso não soa como o comportamento que você deseja; se os diretórios não existirem, provavelmente será bom criá-los.Usar
;
O ponto
;
e vírgula é usado para separar comandos. Os comandos são executados seqüencialmente, aguardando um antes de continuar no próximo, mas seu sucesso ou falha não tem impacto um no outro.Fugir das citações internas
As aspas dentro de outras aspas devem ser escapadas; caso contrário, você estará criando um ponto final e um ponto inicial adicionais. Seu comando:
Torna-se:
Seu comando atual, devido à falta de aspas escapadas, deve estar executando:
se isso tiver êxito:
Você notará que o realce da sintaxe mostra todo o comando em vermelho aqui, o que significa que todo o comando é a string que está sendo passada para o ssh. Verifique sua máquina local; você pode ter os diretórios
Input
Output
ePartition
onde estava executando isso.fonte
&
comandos de causas são executados em segundo plano, o que significa que eles não serão esperados para concluir antes de passar para o próximo.Você sempre pode definir na sua caixa de salto Multiplexação no OpenSSH
Para que faça em
/etc/ssh/ssh_config
:Dessa maneira, todas as conexões consecutivas feitas no mesmo servidor nos 30 minutos seguintes serão feitas reutilizando a conexão ssh anterior.
Você também pode defini-lo para uma máquina ou grupo de máquinas. Retirado do link fornecido.
fonte
/tmp/
.man ssh
,ControlPath
,ControlMaster
eControlPersist
são opções válidas para passar umssh
comando usando-o
. Pode ser um caso de uso ainda mais preciso, configure a multiplexação no primeirossh
do script e recicle-o para os outros, mas evite a penalidade de desempenho. Eu me pergunto o que o valor de referência de multiplexação VS não para 3 conexões SSH, dado que "Há também um atraso significativo quando se abre uma nova conexão"Você pode colocar todos os seus comandos em um script separado no servidor "mestre".
Script mestre
Em seguida, no seu script ssh, chame-o assim: Script SSH
OU se todos os arquivos tiverem que estar na máquina inicial, você poderá fazer algo assim:
script1
script2
script ssh
fonte
Há algum tempo, tive a oportunidade de usar soquetes de controle como as outras respostas recomendam (essa resposta é essencialmente uma combinação do uso de soquetes de controle como esta resposta e scripts como essa resposta ).
O caso de uso foi um hack:
authorized_keys
o usuário de destino era substituído periodicamente por uma tarefa agendada e eu queria testar rapidamente as coisas sem passar pela burocracia necessária para adicionar algo a esse arquivo. Então, eu configurei um loop while que adicionou a chave ao arquivo, conforme necessário, execute meu teste e cancele o loop. No entanto, haveria uma pequena janela onde a tarefa agendada sobrescreveria o arquivo e meu loop ainda estaria emsleep
execução. Portanto, configurar um soquete de controle no início deixaria meu script SSH posteriormente sem problemas:Onde
setup-ssh.sh
fica:E
.ssh-config
:E
run-test.sh
:A sequência é assim:
setup-ssh.sh
.setup-ssh.sh
ocupado-loops os servidores até que todos eles tenham uma configuração de soquete de controle. Ohosts
arquivo simplesmente lista os nomes de host do servidor, um por linha.${CONFIG_DIR}/scripts/.ssh-config
, a menos que eu especifique esse arquivo-F
, as conexões SSH não o usarão. Portanto, isso me permite usar o soquete de controle somente onde eu precisar deles usando aF
opçãoxargs
para distribuir a carga de trabalho pelos servidores, iniciando novos trabalhos assim que os em execução terminam.fonte