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
Jawaban:
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
.sumber
Ok, saya sudah menemukan jawabannya. Saya harus membuat skrip terpisah yang hanya berisi perintah yang ingin saya jalankan sebagai root.
Kemudian, dalam skrip pasca-terima saya lakukan:
Dan akhirnya di visudo saya:
Semoga ini bisa membantu orang lain
sumber
Saya memiliki file di dalamnya
/etc/sudoers.d/root_group
yang hanya berisi baris%root ALL=(ALL) NOPASSWD: ALL
, dan saya menambahkan akun ke root grup untuk memungkinkan mereka menggunakansudo
tanpa 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: ALL
dan tambahkan akun yang relevan ke my_new_group.sumber