Отправка команд на экран GNU
У меня есть экран GNU с именем demo, я хочу отправить ему команды. Как это сделать?
screen -S demo -X /home/aa/scripts/outputs.sh
yeilds No screen session found.
и выполнение screen -ls
показывает, что оно не работает.
Ответы
Ответ 1
Если сеанс экрана не запущен, вы не сможете отправлять ему сообщения. Начните сначала.
Как только у вас есть сеанс, вам нужно различать команды экрана и ввода с клавиатуры. screen -X
ожидает команду Screen. Команда stuff
отправляет ввод, и если вы хотите запустить эту программу из приглашения оболочки, вам также нужно будет передать новую строку.
screen -S demo -X stuff '/home/aa/scripts/outputs.sh
'
Обратите внимание, что это может быть неправильный подход. Вы действительно хотите набрать то, что активно в этом сеансе? Чтобы направлять ввод в конкретном окне, используйте
screen -S demo -p 1 -X stuff '/home/aa/scripts/outputs.sh
'
где 1 - номер окна (вместо этого вы можете использовать его заголовок).
Чтобы запустить новое окно в этом сеансе, вместо этого используйте команду screen
. (Это команда screen
Screen, а не команда оболочки screen
.)
screen -S demo -p 1 -X screen '/home/aa/scripts/outputs.sh'
Ответ 2
Я собрал это вместе, чтобы захватить вывод из команд. Он также обрабатывает stdin, если вы хотите передать какой-либо ввод.
function xscreen {
# Usage: xscreen <screen-name> command...
local SCREEN_NAME=$1
shift
# Create screen if it doesn't exist
if ! screen -list | grep $SCREEN_NAME >/dev/null ; then
screen -dmS $SCREEN_NAME
fi
# Create I/O pipes
local DIR=$( mktemp -d )
local STDIN=$DIR/stdin
local STDOUT=$DIR/stdout
local STDERR=$DIR/stderr
mkfifo $STDIN $STDOUT $STDERR
trap 'rm -f $STDIN $STDOUT $STDERR; rmdir $DIR' RETURN
# Print output and kill stdin when both pipes are closed
{ cat $STDERR >&2 & cat $STDOUT & wait ; fuser -s -PIPE -k -w $STDIN ; } &
# Start the command (Clear line ^A^K, enter command with redirects, run with ^O)
screen -S $SCREEN_NAME -p0 -X stuff "$(echo -ne '\001\013') { $* ; } <$STDIN 1> >(tee $STDOUT) 2> >(tee $STDERR >&2)$(echo -ne '\015')"
# Forward stdin
cat > $STDIN
# Just in case stdin is closed
wait
}
Сделав еще один шаг, полезно вызвать эту функцию по ssh:
ssh [email protected] -n xscreen somename 'echo hello world'
Может быть, объединить его с чем-то вроде ssh [email protected] "$(typeset -f); xscreen ..."
, чтобы вам не нужно было иметь уже определенную функцию на удаленном хосте.