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 / computer / Perguntas / 1423902
Accepted
abbood
abbood
Asked: 2019-04-11 09:58:54 +0800 CST2019-04-11 09:58:54 +0800 CST 2019-04-11 09:58:54 +0800 CST

como executar um script dentro de um script no comando shell

  • 772

Estou tentando fazer esse script funcionar (o que ele deve fazer é procurar uma string no último arquivo de log de um servidor remoto):

ssh -i $ssh_key_file ubuntu@$1 -t "cd /path/to/logs; grep \"POST api/orders \" `ls -Art | grep info | tail -n 1` -A 2 | grep \"'store_id' => '$2'\" -B 1; bash --login"

este roteiro

`ls -Art | grep info | tail -n 1`

deve retornar para mim o último arquivo de log, este é um exemplo disso se eu executar esse script sozinho no servidor remoto:

$ ls -Art | grep info | tail -n 1
info-2019-04-10.log

além disso, se eu executar exatamente o mesmo script acima, codificando o nome do arquivo de log, ele funcionará bem:

 ssh -i $ssh_key_file ubuntu@$1 -t "cd /path/to/logs; grep \"POST api/orders \" info-2019-04-10.log -A 2 | grep \"'store_id' => '$2'\" -B 1; bash --login"

Consegui incorporar este script (encontrar o último arquivo de log) em outros scripts de shell e funcionou bem, como este:

ssh -i $ssh_key_file ubuntu@$1 -t "cd /path/to/logs; grep $2 `ls -Art | grep info | tail -n 1`; bash --login"

O que estou fazendo de errado no roteiro original?

atualizar

usando este script

function totCreateOrder()
{
ssh -i "$ssh_key_file" ubuntu@"$1" -t<<EOF
cd /var/www/toters/storage/logs && grep "POST api/orders " "\$(ls -Art | grep info | tail -n 1)" -A 2 \
| grep "'store_id' => '"'$2'"'" -B 1
bash --login
EOF
}

está retornando esta estranha mensagem de erro

totCreateOrder $prod1as 1006
Pseudo-terminal will not be allocated because stdin is not a terminal.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1067-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

74 packages can be updated.
0 updates are security updates.

New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


*** System restart required ***

Eu pesquisei o que esse erro significa e fiz isso

function totCreateOrder()
{
ssh -i $ssh_key_file ubuntu@$1 -t -t<<EOF
cd /var/www/toters/storage/logs && grep "POST api/orders " "\$(ls -Art | grep info | tail -n 1)" -A 2 \
| grep "'store_id' => '"'$2'"'" -B 1
EOF
}

mas então recebo esta mensagem de erro:

totCreateOrder $prod1as 1006
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1067-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

74 packages can be updated.
0 updates are security updates.

New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


*** System restart required ***
Last login: Thu Apr 11 03:38:32 2019 from 185.81.141.32
 1"$(ls -Art | grep info | tail -n 1)" -A 2 | grep "'store_id' => '"'1006'"'" -B

atualizar dois

eu estava revisando o script linha por linha .. isso funcionou no sentido de que alcançou o seguinte:

  • logado no servidor remoto
  • foi capaz de analisar ls -Art | grep info | tail -n 1corretamente
  • execute este comando no servidor remoto:grep "POST api/orders " "$(ls -Art | grep info | tail -n 1)" -A 2

    function test() { ssh -i $ssh_key_file ubuntu@$1 -t -t<

voltou isso

test $prod1as
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1067-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

74 packages can be updated.
0 updates are security updates.

New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


*** System restart required ***
Last login: Thu Apr 11 05:18:10 2019 from 185.81.141.85
ubuntu@ip-x-xx-xx:~$ cd /var/www/toters/storage/logs
-Art | grep info | tail -n 1)" -A 2 storage/logs$ grep "POST api/orders " "$(ls
[2019-04-11 04:10:39] production.INFO: POST api/orders [] []
[2019-04-11 04:10:39] production.INFO: array (   'store_id' => '831',   'items' =>    array (     0 =>      array (       'additional_info' => '',       'addons' =>        array (       ),       'quantity' => 1,       'id' => 129369,
),     1 =>      array (       'additional_info' => '',       'addons' =>        array (       ),       'quantity' => 1,       'id' => 133351,     ),     2 =>      array (       'additional_info' => '',       'addons' =>        ..

no entanto, as coisas quebraram quando eu adicionei o tubo assim:

function test()
{
ssh -i $ssh_key_file ubuntu@$1 -t -t<<EOF
cd /var/www/toters/storage/logs 
grep "POST api/orders " "\$(ls -Art | grep info | tail -n 1)" -A 2 | grep "'store_id' => '"'$2'"'" -B 1
EOF
}

ele retorna isso

 $ test $prod1as 1006
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-1067-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

74 packages can be updated.
0 updates are security updates.

New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


*** System restart required ***
Last login: Thu Apr 11 05:33:22 2019 from 185.81.141.85
ubuntu@ip-10-0-1-39:~$ cd /var/www/toters/storage/logs
-Art | grep info | tail -n 1)" -A 2 | grep "'store_id' => '"'1006'"'" -B 1"$(ls
linux script shell
  • 1 1 respostas
  • 92 Views

1 respostas

  • Voted
  1. Best Answer
    Kamil Maciorowski
    2019-04-11T12:28:47+08:002019-04-11T12:28:47+08:00

    O que estou fazendo de errado no roteiro original?

    O principal problema é este: crases entre aspas duplas são expandidos localmente. Normalmente, eu recomendaria aqui o documento, mas no seu caso você precisa de um pseudo terminal e não pode realmente redirecionar a entrada padrão (que é o que o documento aqui faz). De qualquer forma, use $()em vez de acentos graves e escape do $(ou você pode usar acentos graves e escapá-los, mas $()é preferível em geral ) ou aspas simples neste fragmento. Isso deve passar toda a $( … )sintaxe para o lado remoto. Você também deve certificar-se de que o shell remoto coloque isso entre aspas duplas, porque é bastante óbvio que você não deseja que o resultado sofra divisão de palavras e correspondência de padrões neste caso.

    Em geral , não se deve analisarls . Acho que seria difícil substituir seu código por algo mais robusto, a menos que findno lado remoto suporte -printf. Mas não sei se dá, então não vou melhorar essa parte. (Exceto talvez com isto: por que inverter a saída lse pegar a última entrada? por que não a primeira entrada da saída não invertida? o seu grepsuporte -m 1?)

    grepnão deve ser invocado se cdfalhar.

    Você deve colocar aspas duplas nas variáveis, a menos que saiba que não precisa. :) Não estou citando $ssh_key_fileou $1pode abrir uma lata de… surpresas . $2no seu código é um pouco diferente. Pelo contexto, vejo que deve ser expandido localmente e o resultado passado para o shell remoto. O que quer que chegue ao shell remoto será analisado . Eu acho que você não quer que o resultado da expansão local $2sofra uma expansão variável no lado remoto (ou quer?). Em seu script original, o shell remoto vê o expandido localmente $2em aspas simples dentro de aspas duplas, as externas importam . Então você deve fazer o expandido localmente$2aparecem no shell remoto entre aspas simples. Mas então você tem aspas simples literais incorporando essa string como partes do greppadrão, elas devem ser aspas duplas. Isso leva ao frenesi de citações, é complicado.

    Ainda assim, o que você está passando para o shell remoto é uma string que será analisada , alguns valores de (local) $2quebrarão o código. A injeção de código é possível. Este é um problema comum em que comandos dependentes de variáveis ​​são passados ​​como strings para serem analisados, é bastante difícil sanitizar isso. Espero que você tenha controle total sobre o local $2. Caso contrário, é uma vulnerabilidade: qualquer pessoa que o controle pode executar comandos arbitrários como ubuntuusuário no host remoto. Por exemplo, se você executar seu código original quando $2expande para "& rm -rf ~/ & "(aspas duplas pertencem à variável aqui), você ficará desagradavelmente surpreso (portanto, não faça isso).

    O snippet a seguir não foi totalmente testado. Seu código parece muito específico e, portanto, é difícil testá-lo.

    ssh -i "$ssh_key_file" ubuntu@"$1" -t "
    cd /path/to/logs && grep \"POST api/orders \" \"\$(ls -Art | grep info | tail -n 1)\" -A 2 \
    | grep \"'store_id' => '\"'$2'\"'\" -B 1
    bash --login
    "
    

    Notas:

    • Por causa das aspas simples e expandidas localmente $2que precisam chegar ao lado remoto, decidi colocar aspas duplas em todo o comando. Colocar algumas partes dele entre aspas simples pode reduzir o frenesi de citações (e escapar), mas não necessariamente tornaria o comando menos enigmático porque seria difícil identificar qual parte é citada de que maneira.
    • $2ainda torna a injeção de código possível.

    Nota pós-aceitação

    O OP relatou que o seguinte código funcionou:

    function test()
    {
    ssh -i "$ssh_key_file" ubuntu@"$1" -t "cd /path/to/logs; grep \"POST api/orders \" \"\$(ls -Art | grep info | tail -n 1)\" -A 2 \
        | grep \"'store_id' => '\"'$2'\"'\" -B 1 \
        ; bash --login"
    }
    

    Este código corrige o problema principal da mesma forma que meu código acima. As variações podem ser importantes em termos de sintaxe (?) Mas são secundárias em relação à questão principal, eu acho.

    • 2

relate perguntas

  • Existe um equivalente a cd - para cp ou mv?

  • execute o contêiner do docker como root

  • Como ativar o sensor de impressão digital no domínio e no diretório ativo do Linux

  • Como alterar permanentemente Ctrl + C para Ctrl + K no CentOS 7?

  • atalho do shell da área de trabalho no painel lateral do explorer

Sidebar

Stats

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

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    Serviço do Windows 10 chamado AarSvc_70f961. O que é e como posso desativá-lo?

    • 2 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Marko Smith

    ssl.SSLCertVerificationError: falha na verificação do certificado [SSL: CERTIFICATE_VERIFY_FAILED]: não foi possível obter o certificado do emissor local (_ssl.c:1056)

    • 4 respostas
  • Marko Smith

    Como posso saber em qual unidade o Windows está instalado?

    • 6 respostas
  • Martin Hope
    Albin Como faço para ativar o WindowsXP agora que o suporte acabou? 2019-11-18 03:50:17 +0800 CST
  • Martin Hope
    fixer1234 O "HTTPS Everywhere" ainda é relevante? 2019-10-27 18:06:25 +0800 CST
  • Martin Hope
    Kagaratsch O Windows 10 exclui muitos arquivos minúsculos muito lentamente. Algo pode ser feito para agilizar? 2019-09-23 06:05:43 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    Inter Sys Como Ctrl+C e Ctrl+V funcionam? 2019-05-15 02:51:21 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

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