Как мне сделать следующий вывод сценария: «Ошибка подключения к Mom через SSH» при отсутствии подключения?

Intention


Я сейчас пишу небольшой сценарий оболочки (POSIX, за исключением ] system_beep () ).

Скрипт, работающий в Cygwin, должен выяснить, закрыт ли ноутбук моей матери, и дать мне четкий результат, а при открытии также 5-кратный звуковой сигнал.

Код


#!/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 '\007'
}

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

Проблема

Несмотря на мои усилия, мне кажется, что я не могу понять, почему я получаю:

$ ./lid-status-mama-beep
Some error occurred!

Хотя он ведет себя правильно, когда ноутбук поддерживает SSH-соединение:

Если крышка закрыта закрыто:

$ ./lid-status-mama-beep
closed

Если крышка открыта:

$ ./lid-status-mama-beep
open

Я явно делаю что-то не так в этом случае обработки ошибок.


Вопрос

Как мне сделать этот вывод скрипта:

 Ошибка подключения к Mom через SSH

когда соединение не работает по какой-либо причине?

0
10.07.2018, 16:43
2 ответа

Решение

См. пояснения к каждой строке в комментариях.

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}')
1
28.01.2020, 02:42

Причина

Ваше утверждение if в get_lid_state_momневерно.

В следующем фрагменте кода видно, что учитывается только выходное значение second_command.

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

!инвертирует результат всех first_command | second_command, поэтому он эквивалентен! second_command

В вашем коде вторая команда _— это вызов awk, поэтому ваш ifверен только в случае сбоя awk.

0
28.01.2020, 02:42

Теги

Похожие вопросы