Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Как послать клавиатурные нажатия процессу из bash?  (Прочитано 3222 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dimaxwell

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Всем привет! Хочу отправлять icq сообщения с помощью ysm из bash скрипта (и не только, поэтому интересует именно этот метод). ysm запускается как процесс и ждет клавиатурного ввода команды. Как послать клавиатурные нажатия для процесса из bash скрипта? Заранее благодарю!!!

Оффлайн dmig

  • Старожил
  • *
  • Сообщений: 1668
    • Просмотр профиля
попробуй xvkbd, оно умеет посылать текст в приложение. нужно будет указать window id и widget, куда отправлять текст

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
там клавиатурные нажатия или чтение из stdin?

Если второе, то обычный конвейер подойдет:

echo что-нибудь | ysm
или
cat file   | ysm
или
cat  | ysm <<END
Jxtym df;ysq ntrcn
очень важный текст
END
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Dimaxwell

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Всем спасибо за ответы, но чувствую что слегка не то. xvkbd я так понимаю для X-ов, а у меня cli. Я так понял что ysm не использует стандартный ввод, т.е. необходимо послать именно клавиатурные нажатия.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Требуется icq-бот, я правильно понимаю?

Есть питоньи библиотеки, есть что-то на PHP...
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Dimaxwell

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Ну не знаю бот или не бот, я хочу например по крону раз в 1 час (или при критических параметрах) передавать состояние работы сервера себе на icq. Думаю есть же вариант отправить текст в процесс.

Оффлайн dmig

  • Старожил
  • *
  • Сообщений: 1668
    • Просмотр профиля
Ну не знаю бот или не бот, я хочу например по крону раз в 1 час (или при критических параметрах) передавать состояние работы сервера себе на icq. Думаю есть же вариант отправить текст в процесс.
именно бот и получается.
кстати, а почему бы не попробовать другой клиент? тот же finch например. м.б. у него есть команды для отсылки текста.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
бот - это сокращение от робот.

Если обязательно icq, то вот: http://forum.vingrad.ru/forum/topic-177157/kw-python-icq-библиотеки.html

А можно на емыл отсылать сообщения, командой mail.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Dimaxwell

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
C icq более оперативно получается да и есть определенный момент что именно ICQ нужен.
Я не программист, но не могу понять почему нельзя просто сэмулировать нажатия клавиш для определенного процесса? :)
Вполне вероятно что xvkbd то что надо, но смущает что это именно для X-ов

Оффлайн dmig

  • Старожил
  • *
  • Сообщений: 1668
    • Просмотр профиля
Я не программист, но не могу понять почему нельзя просто сэмулировать нажатия клавиш для определенного процесса? :)
потому что использовать бота для таких целей -- более правильно. поищите готовые варианты решений, наверняка кто-то выкладывал свои скрипты оповещения.
Цитировать
Вполне вероятно что xvkbd то что надо, но смущает что это именно для X-ов
нет, не то. он генерит евенты для X сервера.
точно есть что-то консольное, но вспомнить не могу.

Оффлайн Dimaxwell

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Покурил маны xvkbd и убедился что был прав на счет его назначения :)
Не могу понять чем отличается бот от клиента со скриптами?

Пользователь решил продолжить мысль 16 Июнь 2009, 13:24:48:
Объясните мне глупому. Я так понимаю что стандартный ввод это клавиатура, т.е. если я что-то печатаю в консольном приложении это вводится туда через стандартный ввод? Тогда возникает вопрос как подключиться к стандартному вводу определенного процесса?
« Последнее редактирование: 16 Июнь 2009, 13:24:48 от Dimaxwell »

Оффлайн dmig

  • Старожил
  • *
  • Сообщений: 1668
    • Просмотр профиля
Покурил маны xvkbd и убедился что был прав на счет его назначения :)
Не могу понять чем отличается бот от клиента со скриптами?
В принципе -- ничем. Речь о том, чтобы сдлеать бота попроще, без аццких костылей в виде отправки нажатия клавиш.
Цитировать
Объясните мне глупому. Я так понимаю что стандартный ввод это клавиатура...
Нет. В системе существует 3 стандартных потока ввода-вывода: stdin, stdout и stderr. Стандартный ввод -- stdin, не факт, что он клавиатура. Для процесса эти потоки можно перенаправить, например stdin из файла, а stdout/stderr в файл.
И не факт, что приложение будет читать оттуда, оно может просто обрабатывать события нажатия клавиш (например, чтобы обрабатывать сочетания).

ЗЫ рекомендую обратить внимание на пакет libpurple-bin (эт я к тому, что проще будет применить finch + purple-remote/purple-send)!
« Последнее редактирование: 16 Июнь 2009, 13:37:38 от dmig »

Оффлайн Dimaxwell

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
За объяснение спасибо, но об этом я знал, просто спрашивал как именно консольные приложения получают ввод. Уже как минимум два варианта есть :)

За пакет отдельное, спасибо, помучаем. Но если не трудно все таки может поможете найти пакет схожий с xvkbd, но для консоли?

Оффлайн Dimaxwell

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Спустя год отвечаю на свой вопрос, вдруг кому-то пригодится :)

необходимо запустить нужный процесс с помощью screen, и затем направлять в stdin с помощью

команды screen'a paste [registers [dest_reg]]

Выдержка из man'a
Write the (concatenated) contents of the specified registers to the stdin queue of the current window. The register '.' is treated as the paste buffer. If no parameter is given the user is prompted for a single register to paste. The paste buffer can be filled with the copy, history and readbuf commands. Other registers can be filled with the register, readreg and paste commands. If paste is called with a second argument, the contents of the specified registers is pasted into the named destination register rather than the window. If '.' is used as the second argument, the displays paste buffer is the destination. Note, that "paste" uses a wide variety of resources: Whenever a second argument is specified no current window is needed. When the source specification only contains registers (not the paste buffer) then there need not be a current display (terminal attached), as the registers are a global resource. The paste buffer exists once for every user.

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
"нажимаю" любые клавиши в любых шелах - дорого
Я конечно далек от мысли...(с)

 

Страница сгенерирована за 0.07 секунд. Запросов: 24.