Eu já tenho um agente ssh configurado e posso executar comandos em um servidor externo no script Bash, fazendo coisas como:
ssh blah_server "ls; pwd;"
Agora, o que eu realmente gostaria de fazer é executar muitos comandos longos em um servidor externo. Incluir tudo isso entre aspas seria bastante feio, e eu realmente prefiro evitar o ssh'ing várias vezes apenas para evitar isso.
Então, existe uma maneira de fazer isso de uma só vez entre parênteses ou algo assim? Estou procurando algo ao longo das linhas de:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Basicamente, ficarei feliz com qualquer solução, desde que esteja limpa.
Editar
Para esclarecer, estou falando sobre fazer parte de um script bash maior. Outras pessoas podem precisar lidar com o script no final da linha, então eu gostaria de mantê-lo limpo. Eu não quero ter um script bash com uma linha que se parece com:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
porque é extremamente feio e difícil de ler.
ssh
chamada?scp
,ssh
e prazo. Esta será a maneira mais limpa, eu acho.Respostas:
Que tal um documento do Bash Here :
Para evitar os problemas mencionados por @Globalz nos comentários, você poderá (dependendo do que está fazendo no site remoto) evitar a substituição da primeira linha por
Observe que você pode fazer a substituição de variáveis no documento Aqui, mas pode ser necessário lidar com problemas de cotação. Por exemplo, se você citar a "string de limite" (ou seja,
EOF
acima), não poderá fazer substituições de variáveis. Mas sem citar a cadeia de limite, as variáveis são substituídas. Por exemplo, se você definiu$NAME
acima em seu script de shell, poderá fazere criaria um arquivo no destino
otherhost
com o nome do que você atribuiu$NAME
. Outras regras sobre a citação de scripts de shell também se aplicam, mas são muito complicadas para entrar aqui.fonte
Edite seu script localmente e coloque-o no ssh, por exemplo
onde se
commands-to-execute-remotely.sh
parece com sua lista acima:fonte
( echo $mycmd $myvar ; ...) | ssh myhost
como no uso do gato, você sabe exatamente o que está entrando no fluxo de comandos do ssh. E, claro, o subshell no script podem ser multi-line para facilitar a leitura - veja linuxjournal.com/content/bash-sub-shellscommands-to-execute-remotely.sh
?$localvar
para interpretar uma variável definida localmente,\$remotevar
interpretar remotamente uma variável definida remotamente,\$(something with optionnal args)
para obter a saída de algo executado no servidor remoto. Um exemplo de como você pode ssh através de 1 (ou, como mostrado aqui, vários comandos ssh):echo " for remotedir in /*/${localprefix}* ; do cd \"\$remotedir\" && echo \"I am now in \$(pwd) on the remote server \$(hostname) \" ; done " | ssh user1@hop1 ssh user2@hop2 ssh user@finalserver bash
ssh blah_server < commands-to-execute-remotely.sh
?Para corresponder ao seu código de amostra, você pode agrupar seus comandos dentro de qoutes únicos ou duplos. Por exemplo
fonte
Eu vejo duas maneiras:
Primeiro você faz um soquete de controle como este:
e execute seus comandos
Dessa forma, você pode escrever um comando ssh sem realmente se reconectar ao servidor.
O segundo seria gerar dinamicamente o script,
scp
inserindo-o e executando-o.fonte
Isso também pode ser feito da seguinte maneira. Coloque seus comandos em um script, vamos chamá-lo de command-inc.sh
Salve o arquivo
Agora execute-o no servidor remoto.
Nunca falhou por mim.
fonte
bash -s
necessário?#!/bin/bash
realmente usado?ssh user@remote < /path/to/commands-inc.sh
(parece funcionar para mim). Bem, acho que sua versão garante que usamos obash
shell, e não outro shell - esse é o objetivo, não é?Coloque todos os comandos em um script e ele pode ser executado como
fonte
bash -s
?man
páginasIf the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
bash
comando completamente, ou sejassh remote-user@remote-host <./remote-commands.sh
. Eu tentei do meu jeito e parecia funcionar, embora não tenha certeza se é de alguma forma deficiente.SSH e executar vários comandos no Bash.
Separe os comandos com ponto-e-vírgula dentro de uma sequência, transmitidos para eco, todos direcionados para o comando ssh. Por exemplo:
fonte
Para quem tropeça aqui como eu - tive sucesso ao escapar do ponto e vírgula e da nova linha:
Primeiro passo: o ponto e vírgula. Dessa forma, não quebramos o comando ssh:
Listou o diretório remoto hosts / home (conectado como root), enquanto
listou o diretório de trabalho atual.
Próxima etapa: dividindo a linha:
Isso novamente listou o diretório ativo remoto - formatação aprimorada:
Se realmente melhor do que aqui documento ou aspas em torno de linhas quebradas - bem, não eu para decidir ...
(Usando o bash, Ubuntu 14.04 LTS.)
fonte
ssh host "echo test && ls"
As respostas postadas usando seqüências de linhas múltiplas e vários scripts bash não funcionaram para mim.
Aqui está uma maneira funcional de ssh e executar vários comandos, mantendo o contexto local.
fonte
Não tenho certeza se o mais limpo para comandos longos, mas certamente o mais fácil:
fonte
Isso funciona bem para criar scripts, pois você não precisa incluir outros arquivos:
fonte
-s
flag, cito-o de que você pode se safar de substituir a primeira linha por ... , e não fui capaz de me safar apenas de chamar bash, lembro-me vagamente.A maneira mais fácil de configurar seu sistema para usar sessões ssh únicas por padrão com multiplexação.
Isso pode ser feito criando uma pasta para os soquetes:
E adicionando o seguinte à sua configuração .ssh:
Agora, você não precisa modificar nenhum do seu código. Isso permite várias chamadas para ssh e scp sem criar várias sessões, o que é útil quando é necessário que haja mais interação entre as máquinas local e remota.
Graças à resposta do @ terminus, http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/ e https://en.wikibooks.org / wiki / OpenSSH / Cookbook / Multiplexação .
fonte