Процесс все время зависает - PullRequest
0 голосов
/ 11 июля 2020

Вот мой сценарий:

mogo()  
{  
sshpass -p 'abc123' ssh -tt -q -o StrictHostKeyChecking=no admin@192.168.10.145 <<'SSH_EOF'  
sudo docker exec -it $(sudo docker ps --filter name=mongo --format "{{.Names}}") bash -c "mongodump -d saas -u abc -p abc123 -o md1/"  
logout  
SSH_EOF  

touch /home/admin/11jul20  
}

Я вызываю указанный выше сценарий, используя cronjob для создания резервной копии.

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

Ручной обходной путь: Если я завершу процесс вручную с помощью команды kill. Команда touch запущена, и был создан файл 11jul20.

Если я удалю одинарные кавычки от '' до 'SSH_EOF' sudo docker команда не выполняет резервное копирование, но команда touch выполняется.

Пожалуйста, помогите мне понять, что не так.

1 Ответ

0 голосов
/ 11 июля 2020

Я подозреваю, что ваша проблема связана с запросом пароля от sudo, идущим на псевдотерминал, указанный вашим ssh -tt (который не является настоящим терминалом). Я избегаю sshpass и никогда не устанавливаю его (это угроза безопасности), поэтому я не могу протестировать ваш скрипт.
Однако следующее будет работать.

  1. Сделайте вашу учетную запись s sh частью группы docker
sudo usermod -a -G admin docker

Кстати, вместо использования учетной записи «admin» было бы намного безопаснее создать специальную учетную запись для входа (обслуживание) на вашем linux ящик, который может выполнять только необходимые административные задачи.

Используйте следующий скрипт
mogo()  
{  
ssh -T -q -o StrictHostKeyChecking=no admin@192.168.10.145 <<SSH_EOF
docker exec -it \$(docker ps --filter name=mongo --format "{{.Names}}") bash -c "mongodump -d saas -u $MGO_USER -p $MGO_PWD -o md1/"  
logout  
SSH_EOF  

touch /home/admin/11jul20  
}

Обратите внимание, что нет необходимости в псевдотерминале, поэтому мы отключим его (-T). Я бы также посмотрел, чтобы не отключать StrictHostKeyChecking.

3. Задайте env.
Храните пароли и другие секреты как переменные среды ( 12 факторов ), никогда в ваших сценариях. Это минимум.
Например, в ваш скрипт heredo c будет вставлено следующее:
ВАЖНО убедитесь, что вы не используете одинарные кавычки вокруг SSH_EOF, иначе var замена не производится.

export MGO_USER=abc
export MGO_PWD=abc123

Docker также имеет секреты хранилище и другие хранилища с открытым исходным кодом доступны, но с большей сложностью.

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