Привет. Возник вопрос по программе 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. Так как мне выполнить команду? Заранее спасибо!
screen - как выполнить команду, не подсоединяясь к вирт. "экрану"?
указать номер процесса
указать номер процесса
X_X а синтаксис примерный можно? Проблема в синтаксисе.
ну как бы 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' содержится имя с идентификатором процесса
Имя сессии установлено давно - quake-pro. Как теперь команду послать? Screen -X -r quake-pro save /baseq2/1 ???
ну
[console]screen -S quake-pro -X -r quake-pro save /baseq2/[/console]
ну
[console]screen -S quake-pro -X -r quake-pro save /baseq2/[/console]
Не прокатило, к сожалению. Перевод на новую строку происходит и всё. Открывая quake-pro сессию - консоль сервера пуста. Видимо другой подход нужен или не выполнима задача.
При таком раскладе команда посылается серверу, только надо как-то enter "нажать", чтобы она выполнилась:
screen -S quake-pro -X stuff "save /baseq2/123"Т.е., команда появляется в строке сервера, но не может выполниться, т.к. надо нажать enter. Можно ли в bash эмулировать нажатие клавиши "Enter"?
Т.е., команда появляется в строке сервера, но не может выполниться, т.к. надо нажать enter. Можно ли в bash эмулировать нажатие клавиши "Enter"?
bash тут не причём.
подсоеденитесь к скрину повторно, ти набирайте свои команды.
вот, уже писал: http://linuxforum.ru/viewtopic.php?id=5982
[quote=santic]Т.е., команда появляется в строке сервера, но не может выполниться, т.к. надо нажать enter. Можно ли в bash эмулировать нажатие клавиши "Enter"?
bash тут не причём.
подсоеденитесь к скрину повторно, ти набирайте свои команды.
вот, уже писал: http://linuxforum.ru/viewtopic.php?id=5982[/quote]
Не так меня поняли. У меня задача: автоматически(т.е. с помощью скрипта, без моего участия) послать команду серверу, который крутится в screen. На данный момент, я выяснил, как послать команду, но она не выполняется, а висит в консоли сервера и ждёт нажатия enter. Но ведь я хочу, чтобы автоматом всё было...Вот и получается, что нагородил всяких костылей. Кстати, аналогичную проблему решили с помощью php -
#!/usr/bin/php
<?
$command = 'info';
$screen_name = 'game_server';
$com = `screen -S '$screen_name' -X stuff '$command\r'`;
print($com);
?>screen -S '$screen_name' -X stuff '$command\r'
а просто на bash'е это не срабатывает? тогда expect (тот ещё костыль...). У меня сейчас под рукой нет конфигов, но помнится у меня был комп без клавы, но с монитором. Я там собирал разное. Иксов там небыло, был автологин и screen, в неё я и посылал команды по ssh (просто с терминала, без expect'а). всё прекрасно работало. Проблема была лишь в том, что я не сразу сообразил, как залогинится в screen'е вторым юзверем. Но это оказалось просто: какой-то командой (acladd ЕМНИП) разрешил доступ второму юзверю с тем-же именем (имя должно быть такое-же, иначе надо suid'бит на screen)
а просто на bash'е это не срабатывает?
сработает, но как сэмулировать нажатие enter?
Почитал вики screen - нашел интересную весчь -
Трансляция при вводе
Для того чтобы полностью эмулировать 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)
сработает, но как сэмулировать нажатие enter?
у меня так работало. А вообще да - \0330M (причём у обоих интеров одинаковый код).
ESC 0M или ^M
Решил проблему костылями =) Использовал, выложенный здесь мною php скрипт. Не Unix-way конечно, но работает.
Использовал, выложенный здесь мною php скрипт. Не Unix-way конечно, но работает.
обычно используют expect http://ru.wikipedia.org/wiki/Expect
просто такого php часто нету, даже если есть php в виде надстройки над apache, он не обязан быть в /usr/bin. конечно expect тоже не всегда есть...
>expect
Когда гуглил - постоянно на неё натыкался. Пока мне рано в ней разбираться.
Когда гуглил - постоянно на неё натыкался. Пока мне рано в ней разбираться.
а это стандартный инструмент для отправки команд так, как будто вы их руками набиваете. Необходим, если скрипт желает набрать пароль скажем к ssh, ибо ssh просто так пароли не жрёт.