obtém a saída deste comando de outro servidor via ssh

0

Eu estou tentando ssh em um servidor e obter o tempo de atividade do sistema usando um comando específico, mas ele não está conseguindo executar.

isso funcionaria localmente em quase todos os sistemas unix

startuptime='uptime | awk '{print $2,$3,$4,$5}'' && startuptime1=${startuptime%,} && startdayshours=${startuptime1%%:*}' Hours, ' && startminutes=${startuptime1##*:}' Minutes' && echo 'System Uptime -' $startdayshours$startminutes 'date'

mas se eu fizer isso, não vai funcionar (não importa como eu mudo / adicione caracteres de escape ou $ () ou '' ou '' '' 'citações etc.)

ssh user@server "startuptime='uptime | awk '{print $2,$3,$4,$5}''; startuptime1=${startuptime%,}; startdayshours=${startuptime1%%:*}' Hours, '; startminutes=${startuptime1##*:}' Minutes'; echo 'System Uptime -' $startdayshours$startminutes 'date'"

P.S: Eu sei que não vai funcionar com aspas porque eu preciso escapar dos internos, mas é apenas um exemplo como ssh user@server command_goes_here

    
por Sec Karma 10.10.2018 / 15:48

4 respostas

2

Você tem backticks em seu comando. Isso significa que eles são executados antes do comando ssh. Além disso, você está fazendo uma atribuição no seu comando ssh. Você não faz nada com essa atribuição embora. Então, ssh provavelmente atribui lixo à variável startuptime que você nunca usa.

O que você realmente quer é apenas a saída do comando uptime no servidor remoto. Você pode então canalizar isso através do seu awk local e outras coisas para conseguir o que você quer.

ssh user@server uptime | awk '{print $2, $3, $4, $5}'

Se isso funcionar para você, você poderá adicionar o restante dos seus comandos.

Você poderia até fazer

startuptime=$(ssh user@server uptime)
echo startuptime | awk '{print $2, $3, $4, $5}'

se você quiser fazer mais processamento localmente desse valor de remoção.

    
por 10.10.2018 / 15:55
1

Você pode simplesmente colocar esse comando no arquivo bash e executá-lo da seguinte forma:

  • ssh user@server < script.sh
por 10.10.2018 / 15:55
1

Concordo com a sugestão de que você deve apenas obter o tempo de atividade do servidor e processar esse resultado localmente.

No entanto, a solução geral para essas tarefas é que você deve citar tudo o que seria interpretado pelo shell local. Isso inclui as citações em si, os cifrões e os backticks (que estão obsoletos de qualquer forma).

    
por 10.10.2018 / 16:07
1

Referindo-se à resposta de Lewis, Funcionou dessa maneira

script.sh com chmod + x

#!/bin/bash
running=$(ps aux | grep -v grep | grep "'basename "$0"'" | wc -l);
[[ $running > 2 ]] && exit;

declare -a servers=(
            "server1"
            "server2"
            "server3"
        )

for i in "${servers[@]}"
    do
    log_path="/path/to/log/folder/$i"
    if [ ! -f "$log_path" ]; then
        touch "$log_path"
    fi
    ssh_output=$(ssh user@$i uptime | awk '{print $2,$3,$4,$5}')
    startuptime=${ssh_output%,}
    startdayshours=${startuptime%%:*}' Hours, '
    startminutes=${startuptime##*:}' Minutes'
    echo 'System Uptime -' $startdayshours$startminutes 'date' >> "$log_path"
done

e usando o cron eu fiz o seguinte:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * /path/to/script/script.sh
    
por 10.10.2018 / 17:08