Не отвечаю на это. Но кому-то это может понадобиться (, потому что эта страница показывается в поиске):
должно быть
[Service]
Restart=always
RestartSec=3
https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/
Вы можете взять подсказку из аналогичного вопроса на StackOverflow и использовать bash Вот документ:
ssh root@host 'bash -s' << EOF
command1
command2
command3
EOF
Вы можете использовать cat
, чтобы объединить все файлы, а затем передать их в ssh
.
cat command1 command2 command3 | ssh root@host 'bash -s'
В дополнение кControlPath
иControlPersist
правильному пути, предложенному ответом муру , я хотел бы представить альтернативу:
Создайте fifo, который вы будете использовать для выходных данных ssh
Вы должны создать этот файл по пути, в котором вы уверены
mkfifo $HOME/sshfifo
Запуск длинная -рабочая команда:
exec 8> >(exec ssh user@host /bin/bash >$HOME/sshfifo
exec 9<$HOME/sshfifo
Теперь вам больше не нужен fifo
rm $HOME/sshfifo
Теперь вы готовы отправлять и получать команды через ваше соединение:
echo >&8 uptime
while read -t.002 -r -u 9 answer;do echo "$answer";done
Nota:0.002 seconds
может быть недостаточно при плохом интернет-соединении... Время ожидания может быть бесполезным в зависимости от типа запросов. Вообще это может быть адаптировано к тому, какой диалог присутствует.
И так далее...
myremote() {
echo "$@" >&8
while IFS= read -t.02 -r -u 9 answer;do
echo "$answer"
done
}
Это останется до тех пор, пока вы явно не закроете это соединение:
exec 8>&-
exec 9<&-
Это не идеально.Вы можете
Привязать STDERR тоже со вторым fifo
mkfifo $HOME/sshfifo{out,err}
exec 8> >(exec ssh user@host /bin/bash >$HOME/sshfifoout 2>$HOME/sshfifoerr)
exec 9<$HOME/sshfifoout
exec 10<$HOME/sshfifoerr
rm $HOME/sshfifo{out,err}
Используйте интерактивный bash, затем уменьшите время ожидания
mkfifo $HOME/sshfifo{out,err}
exec 8> >(exec ssh -tT user@host /bin/bash -i >$HOME/sshfifoout 2>$HOME/sshfifoerr)
exec 9<$HOME/sshfifoout
exec 10<$HOME/sshfifoerr
rm $HOME/sshfifo{out,err}
echo >&8 'set -i;PS1="ReAdY aS BoUnD\\n"'
while IFS= read -d '' -rn 1 -t.02 -u 9 foo;do echo -n "$foo";done
while IFS= read -d '' -rn 1 -t.02 -u 10 foo;do echo -n "$foo";done
... затем наблюдая за /^ReAdY aS BoUnD$/
из fd/10
в качестве маркера для конца выполнения последней команды , вы можете избежать таймаута для STDERR (-u 10
), затем уменьшить таймаут для STDOUT(-u 9 -t.002
).
Можно даже открыть несколько соединений для совместного использования
mkfifo $HOME/sshfifo
exec 8> >(exec ssh user1@hostA /bin/bash >$HOME/sshfifo 2>&1)
exec 9<$HOME/sshfifo
rm $HOME/sshfifo
mkfifo $HOME/sshfifo
exec 11> >(exec ssh user2@hostB /bin/bash >$HOME/sshfifo 2>&1)
exec 12<$HOME/sshfifo
rm $HOME/sshfifo
Потом
tee <<<uptime /dev/fd/8 >&11
read -u 9 -t.02 ansA
read -u 12 -t.02 ansB
для отправки одной и той же команды одновременно на оба конца...
Вы можете использовать сценарий expect
. Он может автоматизировать ssh-соединение и запускать команды на удаленной машине. Этот код должен пролить свет на автоматизацию соединения ssh.
вы ищете что-то подобное. сохраните следующий код в файлеfoo.expect
#login to the remote machine
spawn ssh username@hostname
expect "?assword" { send "yourpassword\r"}
#execute the required commands; following demonstration uses echo command
expect "$ " {send "echo The falcon has landed\r"}
expect "$ " {send "echo The falcons have landed\r"}
expect "$ " {send "echo Will the BFR? land? \r"}
#exit from the remote machine
expect "$ " {send "exit\r"}
запустить какexpect foo.expect
Вы должны ожидать, что приложение запустит этот скрипт. Его можно установить командойapt-get install expect
Эта книга поможет вам изучить сценарий ожидания. Удачного написания сценариев!