Estou tentando fazer isso em um script. Eu tenho que executar alguns comandos em um host remoto. Atualmente, estou fazendo isso:
ssh root@host 'bash -s' < command1
ssh root@host 'bash -s' < command2
ssh root@host 'bash -s' < command3
No entanto, isso significa que tenho que me conectar ao servidor repetidamente, o que está aumentando muito o tempo entre o processamento dos comandos. Estou procurando algo assim:
varSession=$(ssh root@host 'bash -s')
varSeesion < command1
varSeesion < command2
varSeesion < command3
Novamente, preciso executar esses comandos por meio de um script. Eu dei uma olhada, screen
mas não tenho certeza se ele pode ser usado em um script.
Você pode usar um
ControlMaster
eControlPersist
para permitir que uma conexão persista após o término do comando:Portanto, o primeiro comando SSH configurará um arquivo de controle para a conexão e os outros dois reutilizarão essa conexão por meio desse arquivo de controle. O seu
~/.ssh/config
deve ter algo como:E seu script não precisará de nenhuma outra alteração.
Você pode dar uma dica de uma pergunta semelhante no StackOverflow e usar um documento bash Here :
Você pode usar
expect
script. Ele pode automatizar a conexão ssh e executar comandos na máquina remota. Este código deve lançar alguma luz sobre como automatizar a conexão ssh.você está procurando algo assim. armazene o seguinte código em um arquivo
foo.expect
execute-o como
expect foo.expect
Você precisa esperar que o aplicativo execute esse script. Pode ser instalado com o comando
apt-get install expect
Este livro irá ajudá-lo a explorar o script esperado. Feliz script!
Descritor de arquivo independente para uma ou mais conexões SSH
De forma complementar
ControlPath
eControlPersist
correta, proposta pela resposta de muru , gostaria de apresentar uma alternativa:Método
Crie um fifo que você usará para as saídas do ssh
Você tem que criar este arquivo em um caminho que você esteja confiante
Execute o comando de longa duração :
Então agora você não precisa mais do fifo
Agora você está pronto para enviar e receber comandos de sua conexão:
Nota:
0.002 seconds
pode ser insuficiente em conexões de internet ruins... O tempo limite pode ser inútil dependendo do tipo de solicitações. Tudo isso pode ser adaptado para qual tipo de diálogo é atendido.E assim por diante...
Isso permanecerá até que você feche explicitamente esta conexão:
Mais longe
Isso não é perfeito. Você poderia
Vincule STDERR também, com um segundo fifo
Use o bash interativo e reduza o tempo limite
... em seguida, observando como marcador para o final
/^ReAdY aS BoUnD$/
da execução do último comando , você pode evitar o tempo limite para STDERR ( ), então reduzir o tempo limite para STDOUT ( ).fd/10
-u 10
-u 9 -t .002
E de lá
É ainda possível abrir várias conexões para serem usadas juntas
Então
enviar o mesmo comando simultaneamente para ambas as extremidades...
Você pode usar
cat
para concatenar todos os arquivos e, em seguida, canalizá-los parassh
.