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 1
corretamente 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
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 analisar
ls
. Acho que seria difícil substituir seu código por algo mais robusto, a menos quefind
no 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ídals
e pegar a última entrada? por que não a primeira entrada da saída não invertida? o seugrep
suporte-m 1
?)grep
não deve ser invocado secd
falhar.Você deve colocar aspas duplas nas variáveis, a menos que saiba que não precisa. :) Não estou citando
$ssh_key_file
ou$1
pode abrir uma lata de… surpresas .$2
no 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$2
sofra uma expansão variável no lado remoto (ou quer?). Em seu script original, o shell remoto vê o expandido localmente$2
em aspas simples dentro de aspas duplas, as externas importam . Então você deve fazer o expandido localmente$2
aparecem no shell remoto entre aspas simples. Mas então você tem aspas simples literais incorporando essa string como partes dogrep
padrã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)
$2
quebrarã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 comoubuntu
usuário no host remoto. Por exemplo, se você executar seu código original quando$2
expande 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.
Notas:
$2
que 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.$2
ainda torna a injeção de código possível.Nota pós-aceitação
O OP relatou que o seguinte código funcionou:
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.