Git पोस्ट-प्राप्त हुक में रूट के रूप में कमांड्स को कैसे निष्पादित करें


12

मैंने अभी हाल ही में एक अपस्टार्ट सेवा के रूप में चल रहे एक वेब ऐप के लिए एक सर्वर पर एक दूरस्थ गिट रेपो स्थापित किया है। मैं एप्लिकेशन कोड को अपडेट करने के लिए आवश्यक गतिविधियों को ट्रिगर करने के लिए पोस्ट-प्राप्त हुक का उपयोग करना चाहता हूं और फिर upstart सेवा को पुनरारंभ करना चाहता हूं। यह मेरी repo.it / हुक / पोस्ट-प्राप्त फ़ाइल है:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
echo "Checking out new files and restarting app"
echo $USER
git checkout -f
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

मेरे द्वारा यहां पढ़ी गई जानकारी के आधार पर: askUbuntu.com , रूटस्टार्ट कमांड को रूट के रूप में निष्पादित करने का तरीका मेरी विडो फ़ाइल को संपादित करना है। यहाँ प्रासंगिक स्निपेट है:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service /sbin/stop myapp-service

लेकिन जब मैं रिमोट को धक्का देता हूं, तो मुझे आउटपुट मिलता है:

$ git commit -am "test" && git push prod master
[master 59ffccd] test
 1 file changed, 1 insertion(+), 1 deletion(-)
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 544 bytes, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Checking out new files on production and restarting app
remote: admin
remote: 
remote: sudo: no tty present and no askpass program specified
remote: Sorry, try again.

मैंने जाँच की है कि सही उपयोगकर्ता पोस्ट-स्क्रिप्ट प्राप्त कर रहा है (व्यवस्थापक, जैसा कि ऊपर गूँज रहा है)।

किसी ने मुझे रोकने में मदद कर सकते हैं और फिर एक गिट पोस्ट प्राप्त हुक स्क्रिप्ट में अपस्टार्ट नौकरी शुरू कर सकते हैं? पायथन, पीएचपी, या नोड.जेएस जावास्क्रिप्ट स्क्रिप्ट भी स्वीकार्य होगी यदि वे अपस्टार्ट कमांड को बैश की तुलना में अधिक आसानी से निष्पादित करने में सक्षम होंगे (मैं बैश नौसिखिया हूँ)

मैंने अपने सामान्य लॉग में देखा और यही मेरे पास है:

Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): conversation failed
Apr 24 19:35:21 myhost01 sudo: pam_unix(sudo:auth): auth could not identify password for [admin]
Apr 24 19:35:21 myhost01 sudo:    admin : 3 incorrect password attempts ; TTY=unknown ; PWD=/home/admin/myapp.git ; USER=root ; COMMAND=/s$
Apr 24 19:35:21 myhost01 sudo: unable to execute /usr/sbin/sendmail: No such file or directory
Apr 24 19:35:21  myhost01 sudo: pam_unix(sudo:auth): conversation failed

NOPASSWD के बाद कोलन गलत दिखता है। इसके अलावा, क्या आपने लॉग की जांच की है? "" अनवर / क्लॉथ / ऑथ.लॉग "
इलियट फ्रिश्च

जवाबों:


6

आपको कॉमा का उपयोग करके अपने sudoers फ़ाइल में कमांड को अलग करना होगा। अभी, आप एक ही कमांड को अधिकृत कर रहे हैं /sbin/start myapp-service /sbin/stop myapp-service:।

आपको लिखना होगा admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service


पारितोषिक के लिए धन्यवाद। मैं आज बाद में यह कोशिश करूँगा। अगर यह काम करता है, तो मैं अपने जवाब को स्वीकार करूंगा, न कि मेरे खुद के ऊपर।
djheru

धन्यवाद कि काम किया। मुझे लगता है कि मैं अभी भी कई कमांडों को अधिकृत करने के बजाय अलग स्क्रिप्ट मार्ग के साथ जा रहा हूं।
djheru

5

ठीक है, मैंने पता लगा लिया। मुझे एक अलग स्क्रिप्ट बनानी थी जिसमें केवल वही कमांड थीं जिन्हें मैं रूट के रूप में चलाना चाहता था।

#!/bin/bash
sudo /sbin/stop myapp-service
sudo /sbin/start myapp-service

फिर, मेरी पोस्ट-स्क्रिप्ट स्क्रिप्ट में:

#!/bin/bash
export GIT_WORK_TREE=/var/www/current/myapp/
set -x
echo "Checking out new files on production and restarting app"
echo $USER
git checkout -f
sudo /home/admin/restart-myapp

और अंत में मेरे दृश्य में:

%sudo   ALL=(ALL:ALL) ALL
admin   ALL=(ALL) NOPASSWD: /home/admin/restart-myapp

मनाइए कि यह किसी और के लिए सहायक हो


मुझे यकीन है कि मुझे किसी दिन यह उपयोगी मिलेगा
jbo5112

1

मेरे पास एक फ़ाइल है /etc/sudoers.d/root_groupजिसमें बस लाइन है %root ALL=(ALL) NOPASSWD: ALL, और मैं उन्हें sudoपासवर्ड के बिना उपयोग करने की अनुमति देने के लिए समूह रूट में खाते जोड़ता हूं ।

मुझे यकीन है कि फ़ाइल अनुमतियों के लिए सुरक्षा निहितार्थ हैं जो उपयोगकर्ता खातों को समूह "रूट" में होने पर विचार नहीं करते थे, लेकिन यदि आप चिंतित हैं, तो एक अलग समूह का उपयोग किया जा सकता है। बस %my_new_group ALL=(ALL) NOPASSWD: ALLmy_new_group के लिए प्रासंगिक खातों को लाइन में जोड़ें और बदलें।


धन्यवाद, लेकिन मैं इसे स्थापित करने की कोशिश कर रहा हूं ताकि केवल कमांड जो कि पासवर्ड के बिना चलाए जा सकते हैं, स्क्रिप्ट में ऊपर की ओर स्टॉप और स्टार्ट कॉल हैं।
djheru
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.