Отправить уведомление или оповещение, когда bash просит ввода от пользователя

Чтобы предложить альтернативу, пробовали ли вы minicom или screen . То, что вы хотите, - это изменить дисциплину строки, это звучит так, как будто вы находитесь в необработанном режиме (каждый символ отправляется на удаленный) вместо буферизованного (или приготовленного) режима (cr запускает отправку буфера). есть также режим полуфабриката на полпути (cbreak).

Все эти значения могут быть установлены с помощью команды stty , однако возможно, что kermit переопределит их при инициализации, если вы не позаботитесь об этом.

Тогда вы хотите ^? (DEL) для удаления символа. Об этом есть раздел в документации Kermit. здесь . Это объясняет, как установить элементарный профиль терминала для xterm .

Поэтому я бы предложил использовать minicom , но это может быть невозможно из-за протокола передачи удаленного устройства. Если у вас есть дополнительная информация, то отредактируйте ваш исходный вопрос, если только он не является комментарием.

Обратите внимание, что когда вы используете stty, это вход, который вы устанавливаете для последовательного устройства, а не выход stty [options] dev / sttyN (поскольку он хочет отображать выходные данные на вашем экране).

3
27.12.2018, 18:33
2 ответа

Мониторинг диалога программы и отправка оповещения

Вы можете отслеживать активность

  1. afifoили
  2. файл журналаxterm, теперь с интерактивным режимом

и запускатьzenityинформационное сообщение при вводе данных из контролируемой программы. Если вы хотите, вы также можете установитьespeakи позволить ему отправлять звуковое сообщение .

1. Запустите информационное сообщение zenityпри вводе данных из контролируемой программы с использованием FIFO.

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

  • предполагается графическая среда рабочего стола
  • запустить сценарий оболочки в окне терминала, который используется как «консоль» дляwrapper
  • запуск отслеживаемой программы в окне xterm
  • запуск диалога в окне xterm(, где вы вводите ввод)
  • использование FIFO для доступа к выходным данным программы, которую нужно отслеживать, /dev/stdoutи dev/stderr.
  • запуск цикла while
    • проверка того, был ли изменен FIFO, и в этом случае
      • запуск окна zenityинформационного сообщения.

Ожидается, что вы закроете окно zenity, (можете работать с 'Enter' ), чтобы вернуться в окно xterm, где вы вводите свой ввод.

#!/bin/bash

if [ $# -eq 0 ]
then
 echo "'$0' is a wrapper, that sends a notification, when the wrapped program
has written to standard input and standard error and may be waiting for input.
---
Usage:   $0 <program name> [parameters]
Example: $0.program"
 exit
fi

message="'${1##*/} $2...' has written something, maybe asks for input"

tmpdir=$(mktemp -d)
tmpfifo=$(mktemp --tmpdir=$tmpdir)
rm "$tmpfifo"
mkfifo "$tmpfifo"
#ls -l "$tmpdir"
cnt1=$(stat --printf "%Y" "$tmpfifo")
sleep 1

xterm -title "${1##*/} $2..." -fa default -fs 11 -bg '#403600' \
 -e bash -c "$* 2>&1 | tee /dev/stderr 2>&1 > $tmpfifo" 2> /dev/null & pid=$!

#< "$tmpfifo" espeak &
< "$tmpfifo" cat &

cont=true
while $cont
do
 tmpstr=$(ps -Af |sed "s/grep $pid//"|grep "$pid")
# echo "$tmpstr"
 if [ "$tmpstr" != "" ]
 then
  cnt0=$cnt1
  cnt1=$(stat --printf "%Y" "$tmpfifo")
  if [ "$cnt1" != "$cnt0" ]
  then
#   zenity --notification --text="$message" 2> /dev/null
#   espeak "$message" &
   zenity --info --title="${0##*/} ${1##*/} $2..." \
    --text="$message" --width=500  2> /dev/null
  fi
  sleep 1
  else
  sleep.2
  # echo "process $pid has finished"
  cont=false
 fi
done

# clean up

rm -r "$tmpdir"

Вы также можете запустить espeakрядом с zenity, чтобы получить звуковое сообщение. В этом случае вы можете удалить символ #в начале этой строки. (В программе может быть много текста, поэтому обычно не рекомендуется перенаправлять fifo на espeak. Лучше перенаправить файл fifo на catи распечатать его в «консоли».)

Демо

Вы можете протестировать некоторые командные строки с помощью cp -iи mv -iи вы можете протестировать с помощью следующего небольшого сценария оболочки program,

#!/bin/bash

while true
do
 read -p "Waiting for input. 'Stop' to Quit " string
 if [ "${string:0:4}" == "Stop" ]
 then
  printf "$string. Gotcha\n"
  break
 elif [ "$string" != "" ]
 then
  printf "$string\n"
  printf "Working for 10 seconds...\n"
  sleep 10
 else 
  sleep 3
 fi
done

Текст справки:

$./wrapper
'./wrapper' is a wrapper, that sends a notification, when the wrapped program
has written to standard input and standard error and may be waiting for input.
---
Usage:  ./wrapper <program name> [parameters]
Example:./wrapper.program

Мониторингprogram:

$./wrapper./program

zenityокно информационного сообщения:

enter image description here

Диалог в окне xterm:

Waiting for input. 'Stop' to Quit Hello
Hello
Working for 10 seconds...
Waiting for input. 'Stop' to Quit World
World
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Goodbye
Goodbye
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Stop

Вывод «Консоли» в исходном окне терминала после завершения:

$./wrapper./program
Waiting for input. 'Stop' to Quit Hello
Working for 10 seconds...
Waiting for input. 'Stop' to Quit World
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Goodbye
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Stop. Gotcha

Мониторингcp -ip:

$ LANG=C /path/wrapper cp -ip ubuntustudio-18.04-dvd-amd64.iso ubuntu-18.04.1-desktop-amd64.iso /tmp

zenityокно информационного сообщения:

enter image description here

Диалог вxterm:

cp: overwrite '/tmp/ubuntustudio-18.04-dvd-amd64.iso'? y
cp: overwrite '/tmp/ubuntu-18.04.1-desktop-amd64.iso'? n

Мониторингsudo parted /dev/sdc:

$ LANG=C./wrapper sudo parted /dev/sdc

Диалог вxterm:

[sudo] password for sudodus: 
GNU Parted 3.2
Using /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p                                                                
Model: SanDisk Extreme (scsi)
Disk /dev/sdc: 16,0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type      File system  Flags
 3      2097kB  258MB   256MB   primary   fat32        boot
 4      258MB   1366MB  1108MB  primary
 2      1366MB  12,4GB  11,0GB  extended               lba
 5      1367MB  6736MB  5369MB  logical   ext2
 6      6737MB  12,4GB  5615MB  logical   ext4
 1      12,4GB  16,0GB  3662MB  primary   ntfs

(parted) q

2. Запускать zenityинформационное сообщение, когда что-то записывается в xtermокно (из контролируемой программы или от пользователя ).

Следующий сценарий оболочки может отслеживать диалог с программой и отправлять предупреждения.

  • предполагается графическая среда рабочего стола
  • запустить сценарий оболочки в окне терминала, который используется как «консоль» дляwrapper
  • запуск отслеживаемой программы в окне xterm
  • запуск диалога в окне xterm(, где вы вводите данные)
  • использование файла журнала xtermдля доступа к выходным данным и входным данным отслеживаемой программы
  • запуск цикла while
    • проверка того, был ли изменен файл журнала, и в этом случае
      • запуск окна информационного сообщения zenity.
      • допускаются короткие задержки при наборе ввода (8 секунд; вы можете отредактировать файл сценария, чтобы изменить время задержки ).

Ожидается, что вы закроете окно zenity, (можете работать с 'Enter' ), чтобы вернуться в окно xterm, где вы вводите свой ввод.

Теперь есть интерактивный режим, в котором вы используете окно xtermточно так же, как и любое окно терминала.Закройте окно xterm, чтобы остановить мониторинг.

#!/bin/bash

# date        editor   comment
# 2018-12-31  sudodus  version 1.0

version=1.0

name="${0##*/}"
if [ "$1" == "-h" ] || [ "$1" == "--help" ]
then
 echo "'$name' is a wrapper, that sends a notification, when the wrapped program
has written to standard input and standard error and may be waiting for input.
---
Usage:    $name [program name] [parameters]
Examples: $name          # to run program(s) interactively in an xterm window
          $name program
          $name -h       # to get help (this text)
          $name -v       # show version"
 exit
elif [ "$1" == "-v" ]
then
 echo "$name version $version"
 exit
fi
tstart=$(date '+%s')
echo "----- start $name at $(date '+%F %T') ----------------------------"
tmpstr="${1##*/}"
xtermlog=$(mktemp -u)

if [ $# -eq 0 ]
then
 mess_zenity="Check, if the monitored program asks for input"
 mess_espeak="${mess_zenity/program/, Program,}"
 xterm -title "monitored by ${0##*/}" -fa default -fs 11 -bg '#2c2b2a' \
 -l -lf "$xtermlog" -sb -rightbar 2> /dev/null & pid=$!
else
 mess_espeak="Check if '${tmpstr^} ${2##*/} ${3##*/}...' asks for input"
 mess_zenity="Check if '$tmpstr $2 $3...' asks for input"
 xterm -title "${1##*/} $2 $3..." -fa default -fs 11 -bg '#2c2b2a' \
 -l -lf "$xtermlog" -e "$@" 2> /dev/null & pid=$!
fi
sleep 0.5
sync
cnt1=$(stat --printf "%Y" "$xtermlog")
tail -f "$xtermlog" & ptail=$!

cont=true
while $cont
do
 sleep 1
 cnt0=$cnt1
 tmpstr=$(ps -Af |sed "s/grep $pid//"|grep "$pid")
# echo "$tmpstr"
 if [ "$tmpstr" != "" ]
 then
  cnt1=$(stat --printf "%Y" "$xtermlog")
  if [ $cnt1 -gt $((cnt0 + 8)) ]
  then
#   zenity --notification --text="$message" 2> /dev/null
   espeak "$mess_espeak" &
   zenity --info --title="${0##*/} ${1##*/} $2..." \
    --text="$mess_zenity" --width=500  2> /dev/null
   touch "$xtermlog"
   cnt1=$(stat --printf "%Y" "$xtermlog")
  fi
  sleep 1
  else
  sleep.2
  # echo "process $pid has finished"
  cont=false
 fi
done

# clean up
tmpstr="$(tail -n1 "$xtermlog" | sed 's/.*exit.*/exit/')"
if [ "$tmpstr" != "exit" ]
then
 echo ""
fi
rm -r "$xtermlog"
kill $ptail
tend=$(date '+%s')
tuse=$((tend-tstart))
echo "------- end $name at $(date '+%F %T') --- used $tuse seconds"

Сохраните этот bashкод в файл и дайте ему [например] имя vialog, сделайте его исполняемым и, возможно, переместите его в каталог по вашему пути.

$ vialog
----- start vialog at 2018-12-31 14:37:41 ----------------------------

Вы работаете в окне xterm, и диалог также отображается в стартовом окне.

enter image description here

sudodus@bionic64 /media/multimed-2/test/test0/pomsky-wrap $./program
Waiting for input. 'Stop' to Quit Hello World
Hello World
Working for 10 seconds...
Waiting for input. 'Stop' to Quit I am writing...
I am writing...
Working for 10 seconds...
Waiting for input. 'Stop' to Quit Stop
Stop. Gotcha
sudodus@bionic64 /media/multimed-2/test/test0/pomsky-wrap $ scrot -sb
sudodus@bionic64 /media/multimed-2/test/test0/pomsky-wrap $ exit
exit
------- end vialog at 2018-12-31 14:39:02 --- used 81 seconds

enter image description here

3
27.01.2020, 21:17

Приглашение к отзыву

Вместо того, чтобы добавлять еще один шеллскрипт к моему уже существующему ответу, я думаю, будет лучше со вторым ответом. Я прислушаюсь к отзывам и сосредоточусь на предпочтительном сценарии/методе и попытаюсь объединить то, что предпочтительно, в один ответ (, если только нет причин оставить их все (для разных целей ).

Мониторинг диалога программы и отправка оповещения

Вы можете отслеживать активность

  1. afifoили
  2. файл журналаxterm

и запускатьzenityинформационное сообщение при вводе данных из контролируемой программы. Если хотите, вы также можете установитьespeakи позволить ему отправлять звуковое сообщение .

Этот ответ посвящен второму варианту с использованием fifo .

Запуск информационного сообщения zenityпри вводе данных от контролируемой программы с использованием FIFO.

1.1 Использование xterm, мониторинг стандартного вывода и стандартной ошибки через fifo

Этот wrapperметод имеет

  • Преимущество в том, что ни один прямой ввод не вызовет оповещения. Это хорошо работает со многими программами, например cp -iи sudo.
  • недостаток , что
    • некоторые программы будут отключены, потому что они используют не только стандартный вывод и стандартную ошибку для записи своего вывода. Пример:sftpпотеряет подсказку, и пользователь не сможет узнать, когда программа будет готова к новой задаче.
    • некоторые программы повторяют ввод (есть косвенный ввод ), и это вызовет предупреждение, которое может вызвать много предупреждений в сценарии оболочки, который не принимает это во внимание. Пример:ssh.

1.2 Использование скомпилированной программы scriptи ее лог-файла через fifo

Следующий шелл-скрипт может отслеживать диалог вывода из программы и отправлять предупреждение. Он требует espeakиscript(scriptне требует установки в Ubuntu и Debian ).

sudo apt update
sudo apt install espeak
  • предполагается графическая среда рабочего стола
  • запустить шеллскрипт в окне терминала, назовем егоviafifo.
  • запуск отслеживаемой программы «в viafifo»
  • запуск диалога в окне терминала (, где вы записываете ввод)
  • использование FIFO для доступа к выходным данным программы, которую нужно отслеживать, /dev/stdin, /dev/stdoutи dev/stderr. Основной задачей в шеллскрипте является строка с программой script, т.е. отслеживание активности в окне терминала и запись в fifo.
  • запуск цикла while
    • проверка того, был ли изменен FIFO, и в этом случае
      • запуск окна информационного сообщения zenityи соответствующего голосового сообщения с помощью espeak.
      • допускаются короткие задержки при наборе ввода (8 секунд; вы можете отредактировать файл сценария, чтобы изменить время задержки ).

Ожидается, что вы закроете окно zenity, (можете работать с 'Enter' ), чтобы вернуться в окно xterm, где вы вводите свой ввод.

Введите exit, чтобы выйти из scriptи viafifo. После этого вы можете получить лог-файл со всем диалогом.

viafifoтестируется с

Демонстрационный пример

Скриншоты

enter image description here

enter image description here

time viafifo

user@debian:~$ time viafifo
----- Start viafifo ------------------------------------------------------------
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
----- End viafifo --------------------------------------------------------------
See 'viafifo.log'
viafifo used 8 seconds plus a few (5-10) seconds for preparing and finishing
real    0m13.295s
user    0m0.104s
sys 0m0.012s

viafifo.log

user@debian:~$ cat viafifo.log
Script started on Sat 05 Jan 2019 07:57:45 PM UTC
user@debian:~$ echo hello
hello
user@debian:~$ exit
exit
viafifo used 8 seconds
user@debian:~$ 
1
27.01.2020, 21:17

Теги

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