Как подключить вход / выход к сеансу SSH - PullRequest
2 голосов
/ 17 июня 2019

Какой хороший способ иметь возможность напрямую отправлять в STDIN и получать от STDOUT процесса?Я особенно заинтересован в SSH, так как хочу сделать следующее:

[ssh into a remote server]
[run remote commands]
[run local commands]
[run remote commands]
 etc...

Например, допустим, у меня есть локальный скрипт "localScript", который выведет следующую команду, которую я хочу запустить удаленно,в зависимости от вывода «remoteScript».Я мог бы сделать что-то вроде:

output=$(ssh myServer "./remoteScript")
nextCommand=$(./localScript $output)
ssh myServer "$nextCommand"

Но было бы неплохо сделать это без закрытия / повторного открытия соединения SSH на каждом этапе.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Вы можете перенаправить вход и выход SSH в FIFO, а затем использовать их для двусторонней связи.

Например local.sh:

#!/bin/sh

SSH_SERVER="myServer"

# Redirect SSH input and output to temporary named pipes (FIFOs)
SSH_IN=$(mktemp -u)
SSH_OUT=$(mktemp -u)
mkfifo "$SSH_IN" "$SSH_OUT"
ssh "$SSH_SERVER" "./remote.sh" < "$SSH_IN" > "$SSH_OUT" &

# Open the FIFO-s and clean up the files
exec 3>"$SSH_IN"
exec 4<"$SSH_OUT"
rm -f "$SSH_IN" "$SSH_OUT"

# Read and write
counter=0
echo "PING${counter}" >&3
cat <&4 | while read line; do
    echo "Remote responded: $line"
    sleep 1
    counter=$((counter+1))
    echo "PING${counter}" >&3
done

И просто remote.sh:

#!/bin/sh

while read line; do
    echo "$line PONG"
done
0 голосов
/ 17 июня 2019

Используемый вами метод работает, но я не думаю, что вы можете использовать одно и то же соединение каждый раз. Однако вы можете сделать это с помощью screen, tmux или nohup , но это значительно повысит сложность вашего скрипта, поскольку теперь вам придется эмулировать нажатия клавиш / сочетания клавиш. Я даже не уверен, если вы можете, если вы делаете прямо в Bash. Если вы хотите эмулировать нажатия клавиш, вам придется запустить скрипт в новом x-терминале и использовать xdotool для эмуляции нажатий клавиш .

Другой метод - делегировать весь сценарий на сервер SSH, просто запустив сценарий на самом удаленном сервере :

ssh root@MachineB 'bash -s' < local_script.sh
...