Отправить нажатие клавиши в программу без -GUI

Это можно сделать из командной строки терминала с помощью простого сценария bash. Первый цикл по содержимому файла . Затем для каждой строки передайте эхо в awk и пусть awk извлечет второй столбец . Наконец, перенаправьте этот текст в новый файл.

Собираем все вместе:

while read line; do
    echo $line | awk '{print $2}' >> new_file.txt
done 

2
18.05.2021, 15:39
2 ответа

На ум приходят четыре метода:

  • тмукс
  • сш
  • ожидать
  • другие методы

Тмукс

Используя tmux, вы можете отправлять строки или нажатия клавиш на панели, где sshможет быть запущен/может быть настроен на выполнение:

tmux new -d -s mySession
tmux send-keys -t mySession.0 "ssh root@XXXX" ENTER
tmux send-keys -t mySession.0 "ls" ENTER

Ваш пробег может варьироваться в зависимости от того, сколько раз требуется подключение или есть ли пароль/ключ для использования, но здесь это, вероятно, очевидно.

Сш

Это может быть не так очевидно, но есть примерно два способа запуска команд через ssh напрямую:

  • Непосредственное использование команд оболочки
ssh remote "command here"

или

ssh -t remote "command here"
  • Использование heredoc с ssh
ssh remote << 'EOF' # can use any other marker pair/string as explained below
command
list
here
EOF

Это дает вам больше свободы в том, что вы можете запускать, и здесь также меньше проблем с обработкой кавычек.

Одна из проблем заключается в том, что вам нужно либо использовать подсветку синтаксиса при создании heredoc в [здесь ваш текстовый редактор], чтобы вы могли видеть, правильно ли закрыт маркер heredoc, особенно если указанный маркер появляется в любом строка, которую вы используете в вашем heredoc... (или просто используйте более длинный маркер heredoc, это тоже работает)

Вы можете использовать оба из них в зависимости от того, что вы хотите сделать, но знайте:

  • Он создаст один PID для каждого процесса ssh на вашей удаленной машине, поэтому, если вы хотите запустить несколько команд подряд и решите, что хотите разделить их на разные строки или heredoc, то в какой-то момент у вас закончатся PID. (, если это виртуальная машина/машина с ограниченным доступом или если у вас мало ресурсов на удаленном компьютере ).

  • Просто убедитесь, что вы закрыли их/оставили только один, чтобы вы могли оставить ssh-соединение, если хотите.

  • Любое из этих решений может жаловаться на то, что переменная TERMне установлена,просто установите его так:

export TERM=xterm

Ожидать

Вы можете использовать expect, как упоминалось в другом ответе:

#!/usr/bin/expect -f
spawn ssh remote.server.com
expect "password: "
send "passwordhere?\r"
expect "$ "
......       ##Various automated commands##
expect "$ "
send "exit\r"

Ваш пробег будет варьироваться гораздо больше здесь, учитывая, что expectявляется своего рода попаданиемилипромахом , особенно когда дело доходит до взаимодействия с запросами пароля...

Другие методы

Вы можете использовать другие методы, такие как следующие:

  • sendkeysиз этого репозитория и/или xdotoolиз вашего локального репозитория могут отправлять ключи/строку в определенные окна, которые могут быть установлены на терминал, работающий sshили что-то еще, что вы можете выбрать. Ниже приведен пример синтаксиса ()для обоих.
sendkey.sh "Yourwindowname" "yourstringorkey"

и/или

xdotool type --window "window ID here" "your string here"

Примечание:

Иногда xdotoolи/или sendkeyмогут работать или не работать в разных окнах/программах, но оба должны работать на большинстве терминалов.

Если один не работает, попробуйте другой. Кроме того, wmctrlтакже, вероятно, должен быть установлен, чтобы получить идентификатор/pid/информацию окна (с ), на которое вы ориентируетесь, если только вы не предпочитаете использовать xpropдля этого... (, который уже установлен в большинстве дистрибутивов ).

Наконец, вы могли бы один из этих:

  • evdev(спасибо @Forest за упоминание об этом)
  • pyinput
  • pyautogui

Эти три в основном используются в качестве библиотеки Python, хотя также перенесены на другие языки... Это сделало бы этот ответ слишком длинным, если бы я осветил это здесь, поэтому я позволю кому-то другому сделать это в своем собственном ответе..

2
28.07.2021, 11:32

Нет. По своей природе процессы не работают в Unix/Linux таким образом.

Программа expectможет быть чем-то полезна, если я понимаю, что вы хотите. Прочтите man expect.

-2
28.07.2021, 11:32

Теги

Похожие вопросы