Làm thế nào để thực thi các lệnh như root trong git post-receive hook


12

Gần đây tôi mới thiết lập repo git từ xa trên máy chủ cho một ứng dụng web chạy dưới dạng dịch vụ Upstart. Tôi muốn sử dụng hook sau nhận để kích hoạt các hành động được yêu cầu để cập nhật mã ứng dụng và dừng sau đó khởi động lại dịch vụ khởi động. Đây là tập tin repo.git / hook / post-receive của tôi:

#!/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

Dựa trên thông tin tôi đọc ở đây: askUbfox.com , cách để có được các lệnh khởi động để thực thi với quyền root là chỉnh sửa tệp visudo của tôi. Đây là đoạn trích có liên quan:

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

Nhưng khi tôi git đẩy đến điều khiển từ xa, tôi nhận được đầu ra như:

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

Tôi đã kiểm tra rằng người dùng chính xác đang thực thi tập lệnh nhận (quản trị viên, như đã lặp lại ở trên).

Ai đó có thể giúp tôi dừng lại và sau đó bắt đầu công việc Upstart trong một kịch bản hook sau nhận git không? Các tập lệnh javascript của Python, PHP hoặc node.js cũng có thể được chấp nhận nếu chúng có thể thực thi lệnh khởi động dễ dàng hơn bash (Tôi là một người mới chơi bash)

Tôi đã xem trong nhật ký xác thực của mình và đây là những gì tôi có:

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

Đại tràng có vẻ sai sau NOPASSWD. Ngoài ra, bạn đã kiểm tra các bản ghi? "/var/log/auth.log"
Elliott Frisch

Câu trả lời:


6

Bạn cần tách các lệnh trong tệp sudoers của bạn bằng dấu phẩy. Ngay bây giờ, bạn đang ủy quyền cho một lệnh duy nhất : /sbin/start myapp-service /sbin/stop myapp-service.

Bạn cần viết admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.


Cảm ơn vì tiền hỗ trợ. Tôi sẽ thử điều này sau hôm nay. Nếu nó hoạt động, tôi sẽ chấp nhận câu trả lời của bạn, hơn là của riêng tôi ở trên.
djheru

Cảm ơn đã làm việc. Tôi nghĩ rằng tôi vẫn sẽ đi theo tuyến kịch bản riêng thay vì ủy quyền nhiều lệnh.
djheru

5

Ok, tôi đã tìm ra nó. Tôi đã phải tạo một tập lệnh riêng biệt chỉ chứa các lệnh tôi muốn chạy dưới dạng root.

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

Sau đó, trong kịch bản nhận bài của tôi làm:

#!/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

Và cuối cùng trong visudo của tôi:

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

Hy vọng điều này sẽ giúp người khác


Tôi chắc chắn tôi sẽ tìm thấy điều này hữu ích vào một ngày nào đó
jbo5112

1

Tôi có một tệp trong /etc/sudoers.d/root_groupđó chỉ có dòng %root ALL=(ALL) NOPASSWD: ALLvà tôi thêm tài khoản vào nhóm gốc để cho phép chúng sử dụng sudomà không cần mật khẩu.

Tôi chắc chắn có ý nghĩa bảo mật đối với quyền truy cập tệp không coi tài khoản người dùng nằm trong nhóm "root", nhưng nếu bạn lo ngại, một nhóm khác có thể được sử dụng. Chỉ cần thay đổi dòng %my_new_group ALL=(ALL) NOPASSWD: ALLvà thêm các tài khoản có liên quan vào my_new_group.


Cảm ơn bạn, nhưng tôi đang cố gắng thiết lập nó để các lệnh duy nhất có thể chạy mà không cần mật khẩu là dừng khởi động và bắt đầu các cuộc gọi trong tập lệnh.
djheru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.