Bagaimana saya bisa berjalan sebagai pengguna lain?

20

Ini adalah kode bash yang harus dijalankan. Jadi pertama-tama ia menggantikan pengguna untuk membuka proyek dan menjalankan semua kode:

su openproject -c "bash -l" 
cd ~/openproject
git checkout Gemfile.lock
git pull

bundle install
RAILS_ENV="production" bundle exec rake db:migrate
RAILS_ENV="production" bundle exec rake db:seed
RAILS_ENV="production" bundle exec rake assets:precompile

Saya telah mencoba mengubah skrip di atas menjadi ini:

su - openproject -c "cd ~openproject/openproject"

su - openproject -c "git checkout stable"

su - openproject -c "git checkout Gemfile.lock"
su - openproject -c "git pull"

su - openproject -c "bundle install"

su - openproject -c "RAILS_ENV="production" bundle exec rake db:migrate"
su - openproject -c "RAILS_ENV="production" bundle exec rake db:seed"
su - openproject -c "RAILS_ENV="production" bundle exec rake assets:precompile"

tetapi ini tidak berjalan dengan baik dan pada setiap langkah meminta kata sandi. Bagaimana skrip yang diterjemahkan ditingkatkan sehingga berfungsi?

PEMBARUAN 1:

Setelah menerima saran tentang ini, saya adalah titik di mana kode telah diubah menjadi:

cd ~openproject/openproject

sudo -u openproject git checkout stable

sudo -u openproject git checkout Gemfile.lock
sudo -u openproject git pull

# the output is good thill here
sudo -u openproject bundle install

sudo -u openproject RAILS_ENV="production" bundle exec rake db:migrate
sudo -u openproject RAILS_ENV="production" bundle exec rake db:seed
sudo -u openproject RAILS_ENV="production" bundle exec rake assets:precompile

Outputnya ok sampai baris yang menyatakan begitu ke dalam kode. Dari sana saya mendapatkan 4 kesalahan

sudo: bundle: perintah tidak ditemukan

PEMBARUAN 2:

Setelah mencoba saran dari Dmitry Vasilyanov saya menemukan bahwa jika saya memasukkan -i itu akan disimulasikan sebagai login pengguna. Namun ini bukan cara terakhir untuk melakukannya.

Jika saya menjalankan echo $PATHsetelah masuk sebagai openproject ouput adalah/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Jika saya menjalankan echo $PATHsetelah su openproject -c "bash -l"output/home/openproject/.rvm/gems/ruby-2.1.0/bin:/home/openproject/.rvm/gems/ruby-2.1.0@global/bin:/home/openproject/.rvm/rubies/ruby-2.1.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

codiac
sumber
Kamu ingin sudo, tidak su.
dawud
Anda juga tidak bisa (bermakna) sudo cd, karena itu adalah shell builtin.
MadHatter mendukung Monica
Tapi sudo tidak menggantikan root? Saya root dan ingin menjalankan skrip sebagai pengguna openproject, dengan efek yang tepat seolah-olah saya akan masuk sebagai pengguna openproject dan mulai dari perintah kedua (cd ~ / openproject)
1
Tidak, sudodigunakan untuk dijalankan sebagai pengguna lain, sebagai rootdefault jika tidak ada yang ditentukan, Anda dapat menjalankannya dengan sempurna sudo -u openproject bundle install.
dawud
Saya kira Anda mendapatkan bundle: command not foundkesalahan karena Anda menetapkan PATHatau GEM_PATHdi Anda .bash_profileatau .bashrc, mereka tidak dieksekusi di non-login / non-interaktif kerang, sehingga Anda harus lulus -iuntuk sudoke masuk simulasi, seperti ini:sudo -iu openproject bundle install
Dmitry Vasilyanov

Jawaban:

19

Mengapa Anda tidak membuat skrip shell dan melakukan

su - openproject -c "your_shell_script"

Waspadai - sebelum proyek terbuka. Itu akan mengatur variabel lingkungan proyek terbuka, bukan variabel lingkungan pengguna Anda.

YoMismo
sumber
Saya perlu menambahkan sudodi awal jika tidak meminta kata sandi saya.
IanVaughan
sudojuga akan meminta kata sandi saat pertama kali Anda menjalankannya, maka disarankan untuk meletakkan barang-barang Anda di skrip shell dan menjalankannya dengan suatausudo
YoMismo
8

Jika Anda menggunakan bash, Anda dapat melakukannya di sini-doc

$ su - user -s/bin/bash -c <<EOF
export X=1
echo $X
EOF

Dengan begitu Anda bisa menjalankan banyak perintah dan menjaga status di dalam skrip.

Sama dengan sudo

sudo -u user bash <<EOF
your
script
here
EOF
spinus
sumber
Tidak ada yang berhasil untuk saya. Bisakah Anda benar-benar meneruskan perintah dari stdin ke su / sudo?
Sparhawk
1
@Sparhawk, terima kasih telah memeriksa. Dalam contoh kedua saya lupa menambahkan "bash" (sudah memperbarui contohnya) - berfungsi. Contoh pertama tidak sepenuhnya berfungsi seperti yang Anda sebutkan, saya mengetik dari cache jangka panjang sehingga saya bisa membuat kesalahan, tapi pasti saya punya su yang bekerja dengan stdin (saya menggunakan java untuk menjalankan subproses untuk tugas itu) saya akan mencoba untuk ujilah lebih lanjut untuk menemukan cara yang benar.
spinus
1
Saya perlu membuat perintah tergantung pada berbagai variabel dan menjalankannya sebagai pengguna lain. Jadi saran dari YoMismo bukan pilihan dalam kasus saya. Saya berjuang ini selama satu jam, satu-satunya hal yang saya temukan bekerja adalah pendekatan EOF (contoh kedua). Terima kasih!
Jette