วิธีเรียกใช้งานคำสั่งในฐานะรูทใน git post-receive hook


12

ฉันเพิ่งตั้ง repo git ระยะไกลบนเซิร์ฟเวอร์สำหรับเว็บแอปที่ทำงานเป็นบริการพุ่งพรวด ฉันต้องการใช้ hook post-receive เพื่อเรียกการกระทำที่จำเป็นในการอัปเดตรหัสแอปพลิเคชันและหยุดจากนั้นเริ่มบริการพุ่งพรวดอีกครั้ง นี่คือไฟล์ repo.git / hooks / post-receive ของฉัน:

#!/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วิธีรับคำสั่งพุ่งพรวดเพื่อดำเนินการในฐานะ root คือการแก้ไขไฟล์ visudo ของฉัน นี่คือตัวอย่างที่เกี่ยวข้อง:

%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.

ฉันได้ตรวจสอบแล้วว่าผู้ใช้ที่ถูกต้องกำลังเรียกใช้งานสคริปต์รับโพสต์

มีคนช่วยฉันหยุดแล้วเริ่มงานพุ่งพรวดในสคริปต์เบ็ดได้ สคริปต์จาวาสคริปต์ Python, PHP หรือ node.js ก็เป็นที่ยอมรับเช่นกันหากพวกเขาสามารถดำเนินการคำสั่งพุ่งพรวดได้ง่ายกว่าทุบตี (ฉันเป็นมือใหม่)

ฉันดูในบันทึกการตรวจสอบสิทธิ์ของฉันและนี่คือสิ่งที่ฉันมี:

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 นอกจากนี้คุณได้ตรวจสอบบันทึกหรือไม่ "/var/log/auth.log"
Elliott Frisch

คำตอบ:


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

และในที่สุด visudo ของฉัน:

%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: ALLและเพิ่มบัญชีที่เกี่ยวข้องลงใน my_new_group


ขอบคุณ แต่ฉันพยายามตั้งค่าดังนั้นคำสั่งเดียวที่สามารถรันได้โดยไม่ต้องใช้รหัสผ่านคือการหยุดและเริ่มต้นการโทรในสคริปต์
djheru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.