Эти типы вызовов всегда сложны, потому что вы должны убедиться, что все оценивается в правильном месте. Т.е. добавьте правильное количество обратных косых черт.
Если да
script="sh -c \"nohup sh -c '$SCRIPT1' > /dev/null 2>&1 & \""
sshpass -e ssh -n -o StrictHostKeyChecking=no -l $targets_username $IP "$script"
он должен делать то, что вы хотите (обратите внимание на -n
чтобы stdin оставался закрытым ). Вы можете убедиться, что соединение ssh действительно закрывается, добавив time
перед командой sshpass или запустив netstat
в $SCRIPT1
и проверив открытые соединения.
Вы должны убедиться, что все stdin, stdout и stderr закрыты, иначе ssh
будет ждать, пока они не закроются, даже если процесс находится в фоновом режиме.
Если описанное выше не работает, может потребоваться дополнительная оценка аргументов командной строки с помощью sshpass
. Кроме того, использование одинарных кавычек вокруг $SCRIPT1
задерживает расширение, например. переменные оболочки внутри $SCRIPT1
до удаленной стороны.
Теперь, несмотря на то, что вы можете выполнить задачу с помощью этого подхода, я бы рекомендовал вам использовать инструмент, предназначенный для такого рода автоматизации, например. Ансибл(https://docs.ansible.com/ansible/latest/index.html). При фоновом подходе вам придется вручную (или с помощью другого разработанного инструмента )проверять, была ли команда выполнена успешно или нет, или завершено ли ее выполнение.
Поскольку вы используете Debian, вы можете установитьbinfmt-support
и зарегистрировать расширение, используяupdate-binfmts
:
sudo update-binfmts --install golang /tmp/test --extension go --credentials yes
Если это сработает, вы можете сохранить спецификацию binfmt_misc
в файле под /usr/share/binfmts
, что обеспечит ее загрузку при каждой загрузке системы:
cat <<EOF | sudo tee /usr/share/binfmts/golang
package <local>
interpreter /tmp/test
extension go
credentials yes
EOF
Чтобы проверить вышеуказанные работы, запустите
sudo update-binfmts --import golang
Кроме того, вы можете использовать поддержку systemd дляbinfmt_misc
:
echo ':golang:E::go::/tmp/test:OC' | sudo tee /etc/binfmt.d/golang.conf
Это будет загружено при загрузке systemd-binfmt.service
.