मैं अब तक इस है, लेकिन मैं के एक जोड़े याद कर रहा हूँ क्रॉन नौकरी स्क्रिप्ट की तरह चीजें।
if ! sudo crontab -l | grep certbot; then
echo "15 3 * * * /usr/bin/certbot renew --quiet" | sudo tee -a /var/spool/cron/crontabs/root >/dev/null
fi
यहाँ है एक और तरीका है मैं पसंद है क्योंकि यह crontabs के रास्ते में पता करने की जरूरत नहीं है:
if ! sudo crontab -l | grep certbot; then
sudo crontab -l | { cat; echo "15 3 * * * /usr/bin/certbot renew --quiet"; } | sudo crontab -
fi
यहाँ पूरा करने के लिए एक ही रास्ता (और सही) आप क्या शुरू कर दिया
मुझे कुछ याद आ रही है यह है कि सर्टिफिकेट फ़ाइल /etc/letsencrypt/live/$domain/fullchain.pem
कैसे बनाई जाती है। क्या आप इसे अन्य माध्यमों से प्रदान करते हैं, या क्या आपको उस हिस्से के साथ मदद चाहिए?
इसे रूट के रूप में नहीं करना चाहते हैं।
चरणों में से अधिकांश apt-get
, चल शामिल है और उस के लिए आप पहले से ही जड़ आवश्यकता होती है। शायद आप का मतलब है कि आप रूट का उपयोग करके नवीनीकरण नहीं करना चाहते हैं। कुछ सेवाएं रूट के बजाय समर्पित उपयोगकर्ता के रूप में काम करती हैं, लेकिन documentation of certbot के माध्यम से देखकर मैंने ऐसा कुछ नहीं देखा है। तो रूट, के साथ नवीकरण करने के लिए यह एक सामान्य प्रथा प्रतीत होता है, इसलिए रूट के क्रोंटब में नवीनीकरण कमांड जोड़ने से मुझे ठीक लगता है।
मैं स्क्रिप्ट में चीजों के एक जोड़े में सुधार होगा यह और अधिक मजबूत बनाने के लिए:
स्थितीय मापदंडों $1
, $2
और इतने पर चारों ओर बिखरे हुए, का ट्रैक खो करने के लिए आसान कर रहे हैं जो त्रुटियों का कारण बन सकता । मैं उन्हें उचित नाम दूंगा।
कमांड लाइन तर्क सत्यापन if [ -z "$3" ]
कमजोर है, मैं इसे if [ $# != 3 ]
के रूप में अधिक सख्त बना दूंगा।
रिमोट स्क्रिप्ट उत्पन्न होने के बाद, आप इसे bash -e
के साथ कॉल करते हैं, जो सुरक्षा के लिए अच्छा है। लेकिन अगर -e
के बिना किसी और चीज द्वारा स्क्रिप्ट को बुलाया जाता है, तो सुरक्षा वहां नहीं होगी। set -e
के साथ स्क्रिप्ट में स्वयं को सुरक्षित रखना बेहतर होगा। मैं आगे जाऊंगा और set -euo pipefail
का उपयोग करूंगा जो कि और भी सख्त है। और मैं इसे बाहरी लिपि में भी डाल दूंगा।
रिमोट स्क्रिप्ट में अधिकांश आदेशों को sudo
की आवश्यकता होती है। एक चीज के लिए जो लिखने के लिए कठिन है। दूसरे के लिए, यदि एक कमांड लंबे समय तक समाप्त होता है तो sudo
सत्र समाप्त हो जाता है, तो आपको दूसरी बार रूट पासवर्ड दोबारा करना पड़ सकता है, जो परेशान होगा, खासकर यदि आप कॉफी ब्रेक के लिए बाहर निकलते हैं। निष्पादन उपयोगकर्ता के यूआईडी पर चेक जोड़कर हमेशा रूट के रूप में चलाने की आवश्यकता होगी।
जब से तुम bash -x ~/wks ...
के बजाय सिर्फ ~/wks
के साथ दूरदराज के स्क्रिप्ट चलाने, वहाँ है, यह chmod
के साथ निष्पादन योग्य बनाने के लिए इतना है कि कदम छोड़ा जा सकता है आवश्यकता नहीं है।
एक साथ (और फिर कुछ) लाना ऊपर, मैं इस तरह लिखना होगा:
#!/bin/bash
set -euo pipefail
if [ $# != 3 ]; then
echo "Usage: $0 <server-ssh-address> <ssl-admin-email> <ssl-domain>"
echo "Example: singledomaincertnginx.sh [email protected] [email protected] some-sub-domain.mydomain.com"
exit 1
fi
remote=$1
email=$2
domain=$3
remote_script_path=./wks
ssh $remote "cat > $remote_script_path" << 'EOF'
#!/bin/bash
set -euo pipefail
if [[ "$(id -u)" != 0 ]]; then
echo "This script must be run as root. (sudo $0)"
exit 1
fi
email=$1
domain=$2
echo email: $email
echo domain: $domain
add-apt-repository -y ppa:certbot/certbot
apt-get update
apt-get upgrade -y
apt-get install -y software-properties-common
apt-get install -y python-certbot-nginx
apt-get install -y nginx
sed -i "s/server_name .*;/server_name $domain;/" /etc/nginx/sites-available/default
systemctl restart nginx.service
#service nginx restart
if [[ -e /etc/letsencrypt/live/$domain/fullchain.pem ]]; then
certbot -n --nginx --agree-tos -m $email -d $domain
fi
if ! crontab -l | grep -q certbot; then
crontab -l | {
cat
echo
echo "15 3 * * * /usr/bin/certbot renew --quiet"
echo
} | crontab -
fi
EOF
ssh -t $remote "sudo bash -x $remote_script_path $email $domain"
Ansible का उपयोग क्यों नहीं? –
ठीक लग रहा है, समस्या कहां है? – aggsol
यहां-डॉक के अंदर 'फाई' गायब होने के अलावा, अच्छा लग रहा है। हो सकता है कि आपके $ 1 "$ 1" के डीबीएल-उद्धरण के अनुरूप हो? वास्तव में बुलेट प्रूफ होने के लिए, शायद कुछ डीबीएल-जांच जोड़ें कि प्रत्येक चरण काम किया जाता है। आप सभी 'एपीटी-गेट' को '&& '(वास्तव में सभी चरणों) (हां, पागल) और/या लॉग फाइलों की जांच कर सकते हैं जो वास्तव में हुआ है, या Std-err को कैप्चर करें और सुनिश्चित करें कि खाली है, आदि। या आप इसे चीजों के "समाप्त अंत" से देख सकते हैं और एक परीक्षण जोड़ सकते हैं जो आपके "एसएसएल के साथ nginx उदाहरण" साबित करता है। (उपरोक्त सभी मान्य क्यू)। सौभाग्य! – shellter