
次の問題が発生しました。次のシェル スクリプトを取得しました:
#!/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
私はこのスクリプトを使用して、既に構成されている secgroup をサーバーに動的に追加することで、ssh 経由で接続/切断するときにファイアウォールのいくつかのポートを開いたり閉じたりしています。少なくとも、それがアイデアです。残念ながら、nova コマンドはどういうわけかまったく実行されないようで、ログには何も表示されません。現在、stderr がないため、デバッグが少し困難です。何が間違っているのでしょうか?
nova ログイン資格情報を取得し、スクリプト外で nova コマンドを手動で実行すると、すべて正常に動作します。
ところで、役に立つかどうかはわかりませんが、私はこれらすべてを Ubuntu:14.04 イメージに基づく Docker コンテナ内で実行しています。ええ、わかっています。docker コンテナ内で sshd を使用している場合は、やり方が間違っています。この場合、sshd を使用する理由があります ;)
答え1
どういうわけか単純ですが、ついに私は答えを見つけました。
の助けを借りてStackOverflowの別の質問への回答スクリプトの出力全体をファイルにリダイレクトしたところ、認証用の環境変数が取得されていないことに気付きました。理由: シェルがコマンドを認識しなかったためですsource
。理由? 使用しているシェルを確認しなかったのは愚かだったからです。
#/bin/sh
に変更するだけで問題は解決しました#!/bin/bash
。