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 / 775703
Accepted
xpt
xpt
Asked: 2024-05-03 02:59:13 +0800 CST2024-05-03 02:59:13 +0800 CST 2024-05-03 02:59:13 +0800 CST

canalizar para um descritor de arquivo diferente

  • 772

Seguindo em Usando loop while para ssh para vários servidores , ou seja, para

while IFS= read -r -u9 HOST ; do ssh "$HOST" "uname -a" ; done 9< servers.txt

que lê um descritor de arquivo diferente ( 9),

Como fazê-lo ler a partir de um canal de um descritor de arquivo diferente?

Se meu comando pipe for grep, qual é a maneira mais fácil de grepgravar no nono descritor de arquivo e qual é a sintaxe de canalizar o nono descritor de arquivo?

linux
  • 1 1 respostas
  • 201 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2024-05-03T03:26:07+08:002024-05-03T03:26:07+08:00

    Se você quer while IFS= read -ru9 line; do ...; donefazer um loop sobre a saída de grepem vez do conteúdo de servers.txt, então com bash, zsh ou versões recentes de ksh93¹, você pode usar o redirecionamento de uma substituição de processo em vez de um pipeline:

    while IFS= read -ru9 host; do
      ssh "$host" 'some code for the remote shell'
    done 9< <(grep something servers.txt)
    

    grepserá executado com seu stdout redirecionado para o final de escrita de um canal e <(...)será substituído por um caminho de arquivo que, uma vez aberto (aqui no fd 9 usando redirecionamento de entrada regular), apontará para o final de leitura desse mesmo canal. Dependendo do sistema e/ou shell, será um pipe nomeado ou /dev/fd/<a-number>algo semelhante (como /proc/self/fd/<a-number>).

    Portavelmente (em qualquer shell do tipo POSIX), você pode fazer:

    {
      grep something servers.txt |
        while IFS= read<&9 -r host; do
          ssh "$host" 'code for the remote shell'
        done 9<&0 0<&3 3<&-
    } 3<&0
    

    Isso está usando um pipeline normal, mas fazendo alguns embaralhamentos de fd para que o fd aberto na extremidade de leitura do pipe seja movido para fd 9 e o fd 0 seja restaurado para o stdin original usando um fd 3 temporário.

    Esteja ciente de que em alguns shells, incluindo o bash (exceto quando a lastpipeopção está habilitada e o shell não é interativo), o whileloop será executado em um subshell.

    Em vez de usar reado fd 9, você também pode simplesmente

    {
      grep something servers.txt |
        while IFS= read -r host; do
          ssh "$host" 'code for the remote shell' <&3 3<&-
        done
    } 3<&0
    

    Onde apenas restauramos ssho stdin para o original fora do pipeline usando aquele truque de redirecionamento fd 3 novamente.

    Em vez de um whileloop, em um sistema GNU, você pode usar xargscomo:

    xargs -rd '\n' -I HOST -a servers.txt ssh HOST '
      code for the remote shell
    '
    

    Para obter a lista de servers.txtum por linha e:

    xargs -rd '\n' -I HOST -a <(grep something servers.txt) ssh HOST '
      code for the remote shell
    '
    

    Para obtê-lo da saída de grep.

    Você também pode adicionar alguns -P0para executar todos eles em paralelo ou -P4para executar até 4 em paralelo (mas em ambos os casos todos compartilhando o mesmo stdin).

    Outro benefício é que se um dos sshfalha, isso será refletido no status geral de saída.

    Em vez de usar grep, você também pode fazer a correspondência de padrões de shell no loop:

    while IFS= read<&9 -r host; do
      case $host in
        (*something*) ssh "$host" 'some code for the remote shell';;
        (*else*) ssh "$host" 'some other code';;
      esac
    done 9< servers.txt
    

    (sintaxe padrão she não rodando em um subshell).


    ¹ ksh é o shell que introduziu a substituição de processos em meados dos anos 80, mas até recentemente, você não conseguia redirecionar o fds de lá.

    • 4

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

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