следующая проблема. У меня есть сценарий оболочки:
#!/bin/sh
# Provide log for debugging
if [ ! -f /home/some-user/port-control.log ]; then
touch /home/some-user/port-control.log
chown some-user /home/some-user/port-control.log
fi
# Load environment variables for authentication
source /home/some-user/.openstack/nova-openrc.sh
# Open ports at login
if [ "$PAM_TYPE" = "open_session" ] && [ "$PAM_USER" = "some-user" ]; then
echo "Opening ports ... Nova response:" >> /home/some-user/port-control.log
nova --debug add-secgroup some-server some-secgroup &>> /home/some-user/port-control.log
fi
# Close ports at logout
if [ "$PAM_TYPE" = "close_session" ] && [ "$PAM_USER" = "some-user" ]; then
echo "Closing ports ... Nova response:" >> /home/some-user/port-control.log
nova --debug remove-secgroup some-server some-secgroup &>> /home/some-user/port-control.log
fi
Я использую этот сценарий для открытия / закрытия некоторых портов в моем брандмауэре при подключении / отключении через ssh путем динамического добавления уже настроенной secgroup на мой сервер - по крайней мере, это идея. К сожалению, команды nova почему-то вообще не выполняются, в моем журнале ничего не отображается. Теперь, когда у меня нет stderr, отладка довольно сложна. Что я делаю не так?
Когда я получаю учетные данные nova и выполняю команды nova вручную вне сценария, все работает отлично.
Кстати: если это поможет: я запускаю все это внутри контейнера докеров на основе образа Ubuntu: 14.04. Да, я знаю: Если вы используете sshd внутри контейнера докеров, вы делаете это неправильно. В этом случае для sshd есть причина;)
Как-то просто, но наконец я нашел ответ. Вот что я сделал:
С помощью ответ на другой вопрос в StackOverflow Я перенаправил весь вывод скрипта в файл и понял, что переменные среды для аутентификации не были получены. Почему: потому что оболочка не знала source
команда. Зачем? Потому что я был достаточно глуп, чтобы не проверять ведьмовскую оболочку, которую использовал.
Проблема была решена просто изменением #/bin/sh
к #!/bin/bash
. Тада!