Cara menjalankan perintah sebagai root pada git post-accept hook


12

Saya baru-baru ini membuat repo git jarak jauh pada server untuk aplikasi web yang berjalan sebagai layanan pemula. Saya ingin menggunakan kait pasca-terima untuk memicu tindakan yang diperlukan untuk memperbarui kode aplikasi dan berhenti kemudian mulai ulang layanan pemula. Ini adalah file repo.git / hooks / post-accept saya:

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

Berdasarkan info yang saya baca di sini: askUbuntu.com , cara untuk mendapatkan perintah pemula untuk dieksekusi sebagai root adalah dengan mengedit file visudo saya. Berikut cuplikan yang relevan:

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

Tetapi ketika saya git mendorong ke remote, saya mendapatkan output seperti:

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

Saya telah memeriksa bahwa pengguna yang benar sedang menjalankan skrip pasca-terima (admin, seperti yang digaungkan di atas).

Dapatkah seseorang membantu saya berhenti dan kemudian memulai pekerjaan pemula dalam skrip kait pasca-terima git? Skrip javascript Python, PHP, atau node.js juga akan dapat diterima jika mereka dapat mengeksekusi perintah pemula lebih mudah daripada bash (Saya pemula bash)

Saya melihat log auth dan inilah yang saya miliki:

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

Usus besar terlihat salah setelah NOPASSWD. Juga, sudahkah Anda memeriksa log? "/var/log/auth.log"
Elliott Frisch

Jawaban:


6

Anda perlu memisahkan perintah dalam file sudoers Anda menggunakan koma. Sekarang, Anda mengizinkan satu perintah: /sbin/start myapp-service /sbin/stop myapp-service.

Anda perlu menulis admin ALL=(ALL:ALL) NOPASSWD: /sbin/start myapp-service, /sbin/stop myapp-service.


Terima kasih atas tipnya. Saya akan coba ini hari ini. Jika berhasil, saya akan menerima jawaban Anda, bukan jawaban saya di atas.
djheru

Terima kasih, itu berhasil. Saya pikir saya masih akan pergi dengan rute skrip terpisah alih-alih mengotorisasi beberapa perintah.
djheru

5

Ok, saya sudah menemukan jawabannya. Saya harus membuat skrip terpisah yang hanya berisi perintah yang ingin saya jalankan sebagai root.

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

Kemudian, dalam skrip pasca-terima saya lakukan:

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

Dan akhirnya di visudo saya:

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

Semoga ini bisa membantu orang lain


Saya yakin saya akan menemukan ini berguna suatu hari nanti
jbo5112

1

Saya memiliki file di dalamnya /etc/sudoers.d/root_groupyang hanya berisi baris %root ALL=(ALL) NOPASSWD: ALL, dan saya menambahkan akun ke root grup untuk memungkinkan mereka menggunakan sudotanpa kata sandi.

Saya yakin ada implikasi keamanan untuk izin file yang tidak menganggap akun pengguna berada di grup "root", tetapi jika Anda khawatir, grup lain dapat digunakan. Cukup ganti baris %my_new_group ALL=(ALL) NOPASSWD: ALLdan tambahkan akun yang relevan ke my_new_group.


Terima kasih, tetapi saya mencoba mengaturnya sehingga satu-satunya perintah yang dapat dijalankan tanpa kata sandi adalah berhenti pemula dan memulai panggilan dalam skrip.
djheru
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.