LinuxForum.Fans
Тема

screen - как выполнить команду, не подсоединяясь к вирт. "экрану"?

Автор: santic 17 сообщений 8346 просмотров
#150248

Привет. Возник вопрос по программе screen. Сделал сервер по ку2, который запускается в screen как бы в режме демона - screen -A -m -d -S quake-pro ./quake2 +set dedicated 1 +exec servercoop.cfg
Возникла нужна Выполнять некоторое множество команд на ку2-сервере не подсоединяясь к экрану с помощью скрипта. Нагуглил ключ для моей цели - screen -X <cmd> , однако screen жалуется:
[console]santic@Debian-server:~$ screen -X "save /1"
There are several suitable screens on:
2506.quake-pro (10.04.2011 22:45:44) (Detached)
2163.rtorrent (10.04.2011 22:14:06) (Detached)
Use -S to specify a session.
[/console]
Надо как-то выбрать нужное окно.
Да, в скрине еще крутится rtorrent. Так как мне выполнить команду? Заранее спасибо!

#150255

указать номер процесса

#150256
villian написал:
указать номер процесса

X_X а синтаксис примерный можно? Проблема в синтаксисе.

#150257

ну как бы man screen

В дистрибутив входит два конфигурационных файла-примера: etc/etcscreenrc и etc/screenrc. В этих файлах есть много хороших примеров различных конфигурационных команд GNU Screen.
Настраивать GNU Screen можно и в on-line режиме. Для того чтобы перейти в режим командной строки, нажмите C-a :. Команды, начинающиеся с "def" меняют настройки по умолчанию, а остальные меняют текущие настройки.

sessionname [name]
Переименовать текущий сеанс. Если аргумент name опущен, просто показывается имя сеанса.


Опция
-S sessionname
Эта опция может использоваться для задания имени сеансу при его создании. Имя используется для идентификации при вызове "screen -list" и "screen -r". Оно заменяет префикс "tty.host", использующийся по умолчанию.

[console]screen -list[/console]
в выводе 'screen -list' содержится имя с идентификатором процесса

#150258

Имя сессии установлено давно - quake-pro. Как теперь команду послать? Screen -X -r quake-pro save /baseq2/1 ???

#150264

ну
[console]screen -S quake-pro -X -r quake-pro save /baseq2/[/console]

#150476
mogul82 написал:
ну
[console]screen -S quake-pro -X -r quake-pro save /baseq2/[/console]

Не прокатило, к сожалению. Перевод на новую строку происходит и всё. Открывая quake-pro сессию - консоль сервера пуста. Видимо другой подход нужен или не выполнима задача.

#150570

При таком раскладе команда посылается серверу, только надо как-то enter "нажать", чтобы она выполнилась:

text
screen -S quake-pro -X stuff "save /baseq2/123"

Т.е., команда появляется в строке сервера, но не может выполниться, т.к. надо нажать enter. Можно ли в bash эмулировать нажатие клавиши "Enter"?

#150574
santic написал:
Т.е., команда появляется в строке сервера, но не может выполниться, т.к. надо нажать enter. Можно ли в bash эмулировать нажатие клавиши "Enter"?

bash тут не причём.
подсоеденитесь к скрину повторно, ти набирайте свои команды.
вот, уже писал: http://linuxforum.ru/viewtopic.php?id=5982

#150580
drBatty написал:
[quote=santic]Т.е., команда появляется в строке сервера, но не может выполниться, т.к. надо нажать enter. Можно ли в bash эмулировать нажатие клавиши "Enter"?

bash тут не причём.
подсоеденитесь к скрину повторно, ти набирайте свои команды.
вот, уже писал: http://linuxforum.ru/viewtopic.php?id=5982[/quote]
Не так меня поняли. У меня задача: автоматически(т.е. с помощью скрипта, без моего участия) послать команду серверу, который крутится в screen. На данный момент, я выяснил, как послать команду, но она не выполняется, а висит в консоли сервера и ждёт нажатия enter. Но ведь я хочу, чтобы автоматом всё было...Вот и получается, что нагородил всяких костылей. Кстати, аналогичную проблему решили с помощью php -

text
#!/usr/bin/php
<?
$command = 'info';
$screen_name = 'game_server';
$com = `screen -S '$screen_name' -X stuff '$command\r'`;
print($com);
?>
#150585
santic написал:
screen -S '$screen_name' -X stuff '$command\r'

а просто на bash'е это не срабатывает? тогда expect (тот ещё костыль...). У меня сейчас под рукой нет конфигов, но помнится у меня был комп без клавы, но с монитором. Я там собирал разное. Иксов там небыло, был автологин и screen, в неё я и посылал команды по ssh (просто с терминала, без expect'а). всё прекрасно работало. Проблема была лишь в том, что я не сразу сообразил, как залогинится в screen'е вторым юзверем. Но это оказалось просто: какой-то командой (acladd ЕМНИП) разрешил доступ второму юзверю с тем-же именем (имя должно быть такое-же, иначе надо suid'бит на screen)

#150591
drBatty написал:
а просто на bash'е это не срабатывает?

сработает, но как сэмулировать нажатие enter?
Почитал вики screen - нашел интересную весчь -

text
Трансляция при вводе

Для того чтобы полностью эмулировать VT100 screen должен определять, нажатием какой клавиши была сгенерирована последовательность во входном потоке, и превращать её в последовательность подходящую VT100. Screen очень гибок в этом вопросе — он позволяет привызывать произвольные команды к произвольным последовательностям символов. В случае простой эмуляции VT100 команда будет вставлять строку в буфер ввода окна (см. команду stuff). Последовательности, которые генерируются по нажатию клавиши, могут измениться при подключении из терминала с другим типом. Чтобы обойти эту проблему, можно привязывать команды к termcap-именам клавиш. Screen будет делать правильные привязки после каждого повторного подключения. Более подробная информация и примеры использования есть в описании команды bindkey. Ниже представлена таблица привязок по умолчанию (default key bindings). (A) обозначает, что команда выполняется, если клавиатура переключена в режим приложения. Клавиша Имя termcap Команда ______________________________________________________ Курсор вверх ku stuff \033[A stuff \033OA (A) Курсор вниз kd stuff \033[B stuff \033OB (A) Курсор вниз kr stuff \033[C stuff \033OC (A) Курсор влево kl stuff \033[D stuff \033OD (A) F0 k0 stuff \033[10~ F1 k1 stuff \033OP F2 k2 stuff \033OQ F3 k3 stuff \033OR F4 k4 stuff \033OS F5 k5 stuff \033[15~ F6 k6 stuff \033[17~ F7 k7 stuff \033[18~ F8 k8 stuff \033[19~ F9 k9 stuff \033[20~ F10 k; stuff \033[21~ F11 F1 stuff \033[23~ F12 F2 stuff \033[24~ Home kh stuff \033[1~ End kH stuff \033[4~ Insert kI stuff \033[2~ Delete kD stuff \033[3~ Page up kP stuff \033[5~ Page down kN stuff \033[6~ Серый 0 f0 stuff 0 stuff \033Op (A) Серый 1 f1 stuff 1 stuff \033Oq (A) Серый 2 f2 stuff 2 stuff \033Or (A) Серый 3 f3 stuff 3 stuff \033Os (A) Серый 4 f4 stuff 4 stuff \033Ot (A) Серый 5 f5 stuff 5 stuff \033Ou (A) Серый 6 f6 stuff 6 stuff \033Ov (A) Серый 7 f7 stuff 7 stuff \033Ow (A) Серый 8 f8 stuff 8 stuff \033Ox (A) Серый 9 f9 stuff 9 stuff \033Oy (A) Серый + f+ stuff + stuff \033Ok (A) Серый - f- stuff - stuff \033Om (A) Серый * f* stuff * stuff \033Oj (A) Серый / f/ stuff / stuff \033Oo (A) Серый = fq stuff = stuff \033OX (A) Серый . f. stuff . stuff \033On (A) Серый , f, stuff , stuff \033Ol (A) Серый enter fe stuff \015 stuff \033OM (A)

#150673
santic написал:
сработает, но как сэмулировать нажатие enter?

у меня так работало. А вообще да - \0330M (причём у обоих интеров одинаковый код).
ESC 0M или ^M

#150761

Решил проблему костылями =) Использовал, выложенный здесь мною php скрипт. Не Unix-way конечно, но работает.

#150821
santic написал:
Использовал, выложенный здесь мною php скрипт. Не Unix-way конечно, но работает.

обычно используют expect http://ru.wikipedia.org/wiki/Expect
просто такого php часто нету, даже если есть php в виде надстройки над apache, он не обязан быть в /usr/bin. конечно expect тоже не всегда есть...

#150911

>expect
Когда гуглил - постоянно на неё натыкался. Пока мне рано в ней разбираться.

#150923
santic написал:
Когда гуглил - постоянно на неё натыкался. Пока мне рано в ней разбираться.

а это стандартный инструмент для отправки команд так, как будто вы их руками набиваете. Необходим, если скрипт желает набрать пароль скажем к ssh, ибо ssh просто так пароли не жрёт.

Войдите или зарегистрируйтесь, чтобы ответить.