Я пытаюсь манипулировать процессом ssh другим процессом. Изображение Я запускаю ssh root@XXXX, а pid - 12345. Я хочу запустить программу, чтобы сообщить сеансу ssh о выполнении команды ls, я пробовал echo ls > /proc/12345/fd/0. терминал ssh правильно отображает эхо, но после того, как я нажму enter, удаленная машина не получит команду ls.

Есть ли что-нибудь, чтобы сделать то, что я хочу?

Если быть более точным, сервер, на который я пытался войти, использует динамический пароль, ни общедоступный, ни пароль стандартного метода аутентификации ssh. Сервер предлагает ввести otp и аутентифицироваться

2
demonguy 18 Май 2021 в 15:39
Я перечислил разные варианты в своем ответе. Дайте мне знать, если что-то из этого работает для вас
 – 
Nordine Lotfi
16 Май 2021 в 01:52

2 ответа

Лучший ответ

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

  • tmux
  • ssh
  • ожидать
  • другие методы

Tmux

Используя 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
Nordine Lotfi 16 Май 2021 в 01:59
Чтобы быть более конкретным, сервер, на котором я пытался войти, использует нестандартный метод аутентификации, ни общедоступный, ни пароль, но предлагает ввести динамический пароль, такой как otp (одноразовый пароль). и приглашение от сервера. поэтому ssh не работает, xdotool не работает, потому что для этого требуется мой экран. я не знаю, почему tmux и expect работают, но сервер всегда говорит «неправильный пароль». так как сервер не повторяет пароль, поэтому я понятия не имею, что когда неправильно
 – 
demonguy
18 Май 2021 в 15:37
Хорошо, tmux работает. мне просто нужно поспать перед отправкой ключей. Однако ожидать не работает. я не знаю почему
 – 
demonguy
18 Май 2021 в 15:48
Evdev требует root, я думаю, что это последний вариант
 – 
demonguy
18 Май 2021 в 15:53
Ну, я упоминал, что ваш пробег будет сильно различаться при использовании expect (приходилось пару раз бороться с этим раньше) :) Значит ли это, что вам удалось заставить его работать с любым из упомянутых мной вариантов?
 – 
Nordine Lotfi
18 Май 2021 в 22:13
1
Я понимаю. Означает ли это, что вы решили эту проблему с помощью tmux, поскольку она работает, или с ней есть какие-то проблемы? не стесняйтесь оставлять отзывы :) @demonguy
 – 
Nordine Lotfi
19 Май 2021 в 06:22

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

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

-2
waltinator 16 Май 2021 в 00:33
Это неправильно. Вы можете сделать это через evdev, который есть почти во всех системах.
 – 
forest
16 Май 2021 в 01:13
1
Не знал о evdev, Ницца :D @forest
 – 
Nordine Lotfi
16 Май 2021 в 01:47