AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 552723
Accepted
SayantanRC
SayantanRC
Asked: 2019-11-18 19:18:04 +0800 CST2019-11-18 19:18:04 +0800 CST 2019-11-18 19:18:04 +0800 CST

"Armazenar" uma sessão SSH remota?

  • 772

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, screenmas não tenho certeza se ele pode ser usado em um script.

ssh
  • 5 5 respostas
  • 3491 Views

5 respostas

  • Voted
  1. Best Answer
    muru
    2019-11-18T19:25:19+08:002019-11-18T19:25:19+08:00

    Você pode usar um ControlMastere ControlPersistpara permitir que uma conexão persista após o término do comando:

    Quando usado em conjunto com ControlMaster, especifica que a conexão mestre deve permanecer aberta em segundo plano (aguardando futuras conexões de cliente) após o fechamento da conexão inicial do cliente. Se definido como no, a conexão mestre não será colocada em segundo plano e será fechada assim que a conexão inicial do cliente for fechada. Se definido como yesou 0, a conexão mestre permanecerá em segundo plano indefinidamente (até ser encerrada ou fechada por meio de um mecanismo como o “ ssh -O exit”). Se definido para um tempo em segundos, ou um tempo em qualquer um dos formatos documentados em sshd_config(5), a conexão mestre em segundo plano será encerrada automaticamente depois de permanecer inativa (sem conexões de cliente) pelo tempo especificado.

    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/configdeve ter algo como:

    Host host
        User root
        ControlMaster auto
        ControlPath /tmp/ssh-control-%C
        ControlPersist 30   # or some safe timeout
    

    E seu script não precisará de nenhuma outra alteração.

    • 29
  2. Twinkles
    2019-11-19T06:07:42+08:002019-11-19T06:07:42+08:00

    Você pode dar uma dica de uma pergunta semelhante no StackOverflow e usar um documento bash Here :

    ssh root@host 'bash -s' << EOF
      command1
      command2
      command3
    EOF
    
    • 7
  3. daedalus_hamlet
    2019-11-20T02:39:17+08:002019-11-20T02:39:17+08:00

    Você pode usar expectscript. 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 arquivofoo.expect

    #login to the remote machine
    spawn ssh username@hostname
    expect "?assword" { send "yourpassword\r"}
    
    #execute the required commands; following demonstration uses echo command
    expect "$ " {send "echo The falcon has landed\r"}
    expect "$ " {send "echo The falcons have landed\r"}
    expect "$ " {send "echo Will the BFR? land? \r"}
    
    #exit from the remote machine
    expect "$ " {send "exit\r"}
    

    execute-o comoexpect foo.expect

    Você precisa esperar que o aplicativo execute esse script. Pode ser instalado com o comandoapt-get install expect

    Este livro irá ajudá-lo a explorar o script esperado. Feliz script!

    • 4
  4. F. Hauri - Give Up GitHub
    2019-11-20T13:11:29+08:002019-11-20T13:11:29+08:00

    Descritor de arquivo independente para uma ou mais conexões SSH

    De forma complementar ControlPathe ControlPersistcorreta, proposta pela resposta de muru , gostaria de apresentar uma alternativa:

    Método

    1. 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

      mkfifo $HOME/sshfifo
      
    2. Execute o comando de longa duração :

      exec 8> >(exec ssh user@host /bin/bash >$HOME/sshfifo
      exec 9<$HOME/sshfifo
      
    3. Então agora você não precisa mais do fifo

      rm $HOME/sshfifo
      
    4. Agora você está pronto para enviar e receber comandos de sua conexão:

      echo >&8 uptime
      while read -t .002 -r -u 9 answer;do echo "$answer";done
      

      Nota: 0.002 secondspode 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...

      myremote() {
          echo "$@" >&8
          while IFS= read -t .02 -r -u 9 answer;do
               echo "$answer"
          done
      }
      
    5. Isso permanecerá até que você feche explicitamente esta conexão:

      exec 8>&-
      exec 9<&-
      

    Mais longe

    Isso não é perfeito. Você poderia

    • Vincule STDERR também, com um segundo fifo

      mkfifo $HOME/sshfifo{out,err}
      exec 8> >(exec ssh user@host /bin/bash >$HOME/sshfifoout 2>$HOME/sshfifoerr)
      exec 9<$HOME/sshfifoout
      exec 10<$HOME/sshfifoerr
      rm $HOME/sshfifo{out,err}
      
    • Use o bash interativo e reduza o tempo limite

      mkfifo $HOME/sshfifo{out,err}
      exec 8> >(exec ssh -tT user@host /bin/bash -i >$HOME/sshfifoout 2>$HOME/sshfifoerr)
      exec 9<$HOME/sshfifoout
      exec 10<$HOME/sshfifoerr
      rm $HOME/sshfifo{out,err}
      echo >&8 'set -i;PS1="ReAdY aS BoUnD\\n"'
      while IFS= read -d '' -rn 1 -t .02 -u 9 foo;do echo -n "$foo";done
      while IFS= read -d '' -rn 1 -t .02 -u 10 foo;do echo -n "$foo";done
      

      ... 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

    mkfifo $HOME/sshfifo
    exec 8> >(exec ssh user1@hostA /bin/bash >$HOME/sshfifo 2>&1)
    exec 9<$HOME/sshfifo
    rm $HOME/sshfifo
    
    mkfifo $HOME/sshfifo
    exec 11> >(exec ssh user2@hostB /bin/bash >$HOME/sshfifo 2>&1)
    exec 12<$HOME/sshfifo
    rm $HOME/sshfifo
    

    Então

    tee <<<uptime /dev/fd/8 >&11
    read -u  9 -t .02 ansA
    read -u 12 -t .02 ansB
    

    enviar o mesmo comando simultaneamente para ambas as extremidades...

    • 3
  5. Barmar
    2019-11-20T12:42:39+08:002019-11-20T12:42:39+08:00

    Você pode usar catpara concatenar todos os arquivos e, em seguida, canalizá-los para ssh.

    cat command1 command2 command3 | ssh root@host 'bash -s'
    
    • 1

relate perguntas

  • Por que o utilitário ssh é considerado um pty?

  • Auto-SSH funciona manualmente, mas não em segundo plano

  • Execute o aplicativo X remotamente, execute a GUI no host remoto [fechado]

  • rsync porta 22 e 873 uso

  • Aborto repentino do SCP: tubo quebrado, código de autenticação de mensagem incorreto

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve