Como faço essa saída de script: “Erro ao conectar a mãe via SSH” quando a conexão está inativa?

0

Intenção

Estou no meio de escrever um pequeno script de shell (POSIX, exceto o system_beep() ).

O script, que roda no Cygwin, deve descobrir se o laptop da minha mãe está fechado ou não e me dá um resultado claro e se também abrir um sinal sonoro de 5x.

Código

#!/bin/bash

set -o nounset

blink=$(tput blink)
bold=$(tput bold)
reverse=$(tput rev)
no_color=$(tput sgr0)

red=$(tput setaf 1)
#blue=$(tput setaf 4)
#cyan=$(tput setaf 6)
green=$(tput setaf 2)
#white=$(tput setaf 7)
#yellow=$(tput setaf 3)
#magenta=$(tput setaf 5)

lid_open_color="${blink}${bold}${reverse}${red}"
lid_closed_color="${blink}${bold}${reverse}${green}"

system_beep()
{
    echo -ne '
$ ./lid-status-mama-beep
Some error occurred!
7' } beep_x_times() { i=1; while [ "$i" -le "$1" ]; do i=$((i + 1)) system_beep sleep 1s done } get_lid_state_mom() { if ! ssh heruser@laptop_ip -p port_number -o ConnectTimeout=3 -i /home/myuser/.ssh/id_rsa 2> /dev/null \ cat /proc/acpi/button/lid/LID0/state | awk '{print $2}'; then # if [ "$?" -ne 0 ]; then echo "Error connecting to Mom via SSH" exit 1 fi } state=$(get_lid_state_mom) if [ "$state" = "closed" ]; then echo "${lid_closed_color}closed${no_color}" elif [ "$state" = "open" ]; then echo "${lid_open_color}open${no_color}" beep_x_times 5 else echo "Some error occurred!" fi

Problema

Apesar dos meus esforços, pareço incapaz de entender por que recebo:

$ ./lid-status-mama-beep
closed

Enquanto se comporta corretamente, quando o laptop é conectável via SSH:

Se a tampa estiver fechada:

$ ./lid-status-mama-beep
open

Se a tampa estiver aberta:

#!/bin/bash

set -o nounset

blink=$(tput blink)
bold=$(tput bold)
reverse=$(tput rev)
no_color=$(tput sgr0)

red=$(tput setaf 1)
#blue=$(tput setaf 4)
#cyan=$(tput setaf 6)
green=$(tput setaf 2)
#white=$(tput setaf 7)
#yellow=$(tput setaf 3)
#magenta=$(tput setaf 5)

lid_open_color="${blink}${bold}${reverse}${red}"
lid_closed_color="${blink}${bold}${reverse}${green}"

system_beep()
{
    echo -ne '
$ ./lid-status-mama-beep
Some error occurred!
7' } beep_x_times() { i=1; while [ "$i" -le "$1" ]; do i=$((i + 1)) system_beep sleep 1s done } get_lid_state_mom() { if ! ssh heruser@laptop_ip -p port_number -o ConnectTimeout=3 -i /home/myuser/.ssh/id_rsa 2> /dev/null \ cat /proc/acpi/button/lid/LID0/state | awk '{print $2}'; then # if [ "$?" -ne 0 ]; then echo "Error connecting to Mom via SSH" exit 1 fi } state=$(get_lid_state_mom) if [ "$state" = "closed" ]; then echo "${lid_closed_color}closed${no_color}" elif [ "$state" = "open" ]; then echo "${lid_open_color}open${no_color}" beep_x_times 5 else echo "Some error occurred!" fi

Eu obviamente faço algo errado neste caso de tratamento de erros.

Pergunta

Como faço essa saída de script:

Error connecting to Mom via SSH

quando a conexão está desativada por alguma razão?

    
por Vlastimil 10.07.2018 / 15:43

2 respostas

1

Solução

Veja os comentários para explicação em cada linha.

get_lid_state_mom()
{
    # I have omitted awk completely here, getting raw value instead
    ssh -p port_number -o ConnectTimeout=3 -i /home/myuser/.ssh/id_rsa heruser@laptop_ip cat /proc/acpi/button/lid/LID0/state 2> /dev/null
}

# this had to be renamed in order for me to know it is a raw value
lid_state_raw=$(get_lid_state_mom)

# indirect test for successful execution seems to be the best method
if [ "$?" -ne 0 ]; then

    echo "Error connecting to Mom via SSH"
    exit 1

fi

# after the success extract the state from the raw value
lid_state=$(echo "$lid_state_raw" | awk '{print $2}')
    
por 11.07.2018 / 05:41
0

Razão

Sua declaração if em get_lid_state_mom está errada.

No trecho de código a seguir, você pode ver que apenas o valor de saída de second_command é considerado na conta.

if ! first_command | second_command ; then 
    echo "second_command exited false"
fi

O ! inverte o resultado de todos os first_command | second_command , por isso é equivalente a ! second_command

No seu código, second_command é a chamada para awk , então seu if é verdadeiro somente quando o awk falha.

    
por 10.07.2018 / 16:28