Отправка команд на экран 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 ...", чтобы вам не нужно было иметь уже определенную функцию на удаленном хосте.