Làm thế nào tôi có thể chạy như một người dùng khác?


18

Đây là mã bash nên được chạy. Vì vậy, trước tiên, nó thay thế người dùng thành openproject và chạy tất cả mã

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

Tôi đã cố gắng viết kịch bản trên vào đây:

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"

nhưng điều này không chạy đúng và ở mỗi bước yêu cầu mật khẩu. Làm thế nào kịch bản dịch có thể được cải thiện để nó hoạt động?

CẬP NHẬT 1:

Sau khi nhận được các thông tin về điều này, tôi là điểm mà mã đã được sửa đổi thành:

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

Đầu ra là ok cho đến khi dòng trạng thái vào mã. Từ đó tôi nhận được 4 lỗi.

sudo: bundle: lệnh không tìm thấy

CẬP NHẬT 2:

Sau khi thử gợi ý từ Dmitry Vasilyanov, tôi thấy rằng nếu tôi chèn -i, nó sẽ mô phỏng như đăng nhập của người dùng. Tuy nhiên đây không phải là cách cuối cùng để làm điều đó.

Nếu tôi chạy echo $PATHsau khi đăng nhập như openproject thì ouput là/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

Nếu tôi chạy echo $PATHsau khi su openproject -c "bash -l"đầu ra là/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


Bạn muốn sudo, không phải su.
dawud

Bạn cũng không thể (một cách có ý nghĩa) sudo cd, vì nó là một vỏ được tích hợp sẵn.
MadHatter hỗ trợ Monica

Nhưng sudo không đăng ký cho root? Tôi là root và muốn chạy script với tư cách là người dùng openproject, với các hiệu ứng chính xác như thể tôi sẽ đăng nhập với tư cách là người dùng openproject và bắt đầu từ lệnh thứ hai (cd ~ / openproject)

1
Không, sudođược sử dụng để chạy như một người dùng khác, là rootmặc định nếu không có gì được chỉ định, bạn hoàn toàn có thể thực thi sudo -u openproject bundle install.
dawud

Tôi đoán bạn đang nhận được bundle: command not foundlỗi vì bạn thiết lập PATHhoặc GEM_PATHtrong bạn .bash_profilehay .bashrc, họ không được thực hiện trong vỏ phi đăng nhập / không tương tác, vì vậy bạn cần phải vượt qua -iđể sudođến đăng nhập mô phỏng, như thế này:sudo -iu openproject bundle install
Dmitry Vasilyanov

Câu trả lời:


19

Tại sao bạn không tạo tập lệnh shell và thực hiện

su - openproject -c "your_shell_script"

Hãy nhận biết - trước khi mở. Điều đó sẽ đặt các biến môi trường của openproject thay vì các biến môi trường người dùng của bạn.


Tôi cần phải thêm sudovào lúc bắt đầu nếu không nó hỏi tôi mật khẩu của tôi.
IanVaughan 20/07/2015

sudocũng sẽ hỏi mật khẩu ngay lần đầu tiên bạn chạy nó, do đó lời khuyên về việc đưa nội dung của bạn vào tập lệnh shell và chạy nó với suhoặcsudo
YoMismo

7

Nếu bạn sử dụng bash, bạn có thể làm ở đây-doc

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

Bằng cách đó bạn có thể thực thi nhiều lệnh và giữ trạng thái bên trong một tập lệnh.

Tương tự với sudo

sudo -u user bash <<EOF
your
script
here
EOF

Không làm việc cho tôi. Bạn thực sự có thể chuyển các lệnh từ stdin sang su / sudo không?
Sparhawk

1
@Sparhawk, cảm ơn bạn đã kiểm tra. Trong ví dụ thứ hai, tôi quên thêm "bash" (đã cập nhật ví dụ) - hoạt động. Ví dụ đầu tiên không hoạt động đầy đủ như bạn đã đề cập, tôi đã gõ từ bộ đệm dài hạn để tôi có thể mắc lỗi, nhưng chắc chắn tôi đã làm việc với stdin (Tôi đang sử dụng java để chạy quy trình con cho tác vụ đó) Tôi sẽ cố gắng kiểm tra nó nhiều hơn để tìm cách chính xác.
spinus
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.