SSH com o comando não é executado como um alias

0

Eu tenho o seguinte comando para remoto em um servidor local e tail -f o arquivo de log mais recente para um aplicativo que eu tenho.

O comando funciona perfeitamente na linha de comando -

ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'

O problema é que quando eu faço isso um alias (ou até mesmo uma função), ele avalia a conclusão do ls -1r em minha máquina local e tenta passar isso para a máquina remota.

alias latestbotlogs="ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'"

function latestbotlogs {
    ssh user@hostname 'tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'
}

Qual sintaxe eu preciso usar para que todo o comando seja avaliado na máquina remota que estou acessando via SSH.

Obrigado antecipadamente!

    
por mattdonders 25.10.2018 / 19:43

3 respostas

2

Para o alias, você precisa de alguns escapes

alias latestbotlogs="ssh user@hostname 'tail -f \\$\(ls -1r \~/Development/python/twitter-bot/logs/*.log \| head -1\)'"

ou

alias latestbotlogs='ssh user@hostname '\''tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'\'

A segunda versão é mais fácil, você não precisa pensar em todos os operadores que precisa citar.

A função deve funcionar como está.

    
por 25.10.2018 / 20:09
1

Uma alternativa para obter o certo escape complicado da citação:

 alias botlogs='ssh user@host "ls -r ~/whatever/*log | head -1 | xargs tail -f"'
 # if (selected) filename contains backslash or quotemark(s) 
 # need -d'\n' on GNU and I don't know good solution on other
 # this also fails if filename contains whitespace, but so did $( )

embora eu concorde que a função deve funcionar sem qualquer hackery e, em geral, as funções são mais consistentes e flexíveis e simplesmente melhores que os aliases.

E PS: quando a saída ls é canalizada (ou redirecionada), ela sempre usa o formato de 1 coluna, você não precisa de -1 aqui.

    
por 26.10.2018 / 07:41
0

Provavelmente você precisa definir o alias atribuindo uma string entre aspas simples para latestbotlogs . Desta forma, o comando é literalmente preservado. Veja uma explicação sobre stackoverflow .

O formulário:

alias latestbotlogs='ssh user@hostname '\''tail -f $(ls -1r ~/Development/python/twitter-bot/logs/*.log | head -1)'\'

deve funcionar.

EDIT: adicionado aspas simples com escape ao redor do comando remoto. Como apontado nos comentários, não poderia funcionar sem eles.

    
por 25.10.2018 / 20:03