Чтобы предложить альтернативу, пробовали ли вы minicom
или screen
. То, что вы хотите, - это изменить дисциплину строки, это звучит так, как будто вы находитесь в необработанном режиме (каждый символ отправляется на удаленный) вместо буферизованного (или приготовленного) режима (cr запускает отправку буфера). есть также режим полуфабриката на полпути (cbreak).
Все эти значения могут быть установлены с помощью команды stty
, однако возможно, что kermit
переопределит их при инициализации, если вы не позаботитесь об этом.
Тогда вы хотите ^? (DEL) для удаления символа. Об этом есть раздел в документации Kermit. здесь . Это объясняет, как установить элементарный профиль терминала для xterm
.
Поэтому я бы предложил использовать minicom
, но это может быть невозможно из-за протокола передачи удаленного устройства. Если у вас есть дополнительная информация, то отредактируйте ваш исходный вопрос, если только он не является комментарием.
Обратите внимание, что когда вы используете stty, это вход, который вы устанавливаете для последовательного устройства, а не выход stty [options] dev / sttyN
(поскольку он хочет отображать выходные данные на вашем экране).
Вы можете отслеживать активность
xterm
, теперь с интерактивным режимом и запускатьzenity
информационное сообщение при вводе данных из контролируемой программы. Если вы хотите, вы также можете установитьespeak
и позволить ему отправлять звуковое сообщение .
zenity
при вводе данных из контролируемой программы с использованием FIFO. Следующий сценарий оболочки может отслеживать диалог вывода из программы и отправлять предупреждение.
wrapper
xterm
xterm
(, где вы вводите ввод)/dev/stdout
и dev/stderr
. while
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
окно информационного сообщения:
Диалог в окне 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
окно информационного сообщения:
Диалог в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
zenity
информационное сообщение, когда что-то записывается в xterm
окно (из контролируемой программы или от пользователя ). Следующий сценарий оболочки может отслеживать диалог с программой и отправлять предупреждения.
wrapper
xterm
xterm
(, где вы вводите данные)xterm
для доступа к выходным данным и входным данным отслеживаемой программы while
zenity
. Ожидается, что вы закроете окно 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
, и диалог также отображается в стартовом окне.
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
Вместо того, чтобы добавлять еще один шеллскрипт к моему уже существующему ответу, я думаю, будет лучше со вторым ответом. Я прислушаюсь к отзывам и сосредоточусь на предпочтительном сценарии/методе и попытаюсь объединить то, что предпочтительно, в один ответ (, если только нет причин оставить их все (для разных целей ).
Вы можете отслеживать активность
xterm
и запускатьzenity
информационное сообщение при вводе данных из контролируемой программы. Если хотите, вы также можете установитьespeak
и позволить ему отправлять звуковое сообщение .
Этот ответ посвящен второму варианту с использованием fifo .
zenity
при вводе данных от контролируемой программы с использованием FIFO. xterm
, мониторинг стандартного вывода и стандартной ошибки через fifo Этот wrapper
метод имеет
cp -i
и sudo
. sftp
потеряет подсказку, и пользователь не сможет узнать, когда программа будет готова к новой задаче. ssh
. script
и ее лог-файла через fifo Следующий шелл-скрипт может отслеживать диалог вывода из программы и отправлять предупреждение. Он требует espeak
иscript
(script
не требует установки в Ubuntu и Debian ).
sudo apt update
sudo apt install espeak
viafifo
.viafifo
» /dev/stdin
, /dev/stdout
и dev/stderr
. Основной задачей в шеллскрипте является строка с программой script
, т.е. отслеживание активности в окне терминала и запись в fifo. while
zenity
и соответствующего голосового сообщения с помощью espeak
. Ожидается, что вы закроете окно zenity
, (можете работать с 'Enter' ), чтобы вернуться в окно xterm
, где вы вводите свой ввод.
Введите exit
, чтобы выйти из script
и viafifo
. После этого вы можете получить лог-файл со всем диалогом.
viafifo
тестируется с
viafifo
в по этой ссылке . time viafifo
и viafifo.log
. Скриншоты
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:~$