ฉันจะเรียกใช้ในฐานะผู้ใช้รายอื่นได้อย่างไร


20

นี่คือรหัสทุบตีที่ควรถูกเรียกใช้ ดังนั้นก่อนอื่นทดแทนผู้ใช้เพื่อ openproject และกว่ารันโค้ดทั้งหมด:

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

ฉันได้ลอง chnaging สคริปต์ด้านบนนี้:

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"

แต่สิ่งนี้ทำงานไม่ถูกต้องและทุกขั้นตอนจะขอรหัสผ่าน สคริปต์ที่แปลแล้วจะได้รับการปรับปรุงให้ดีขึ้นอย่างไร

อัปเดต 1:

หลังจากได้รับ sugestions เกี่ยวกับเรื่องนี้ฉันเป็นจุดที่มีการปรับเปลี่ยนรหัสเป็น:

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

ผลลัพธ์ก็โอเคจนถึงบรรทัดที่ระบุดังนั้นในรหัส จากนั้นฉันได้รับข้อผิดพลาด 4 ครั้ง

sudo: bundle: ไม่พบคำสั่ง

อัปเดต 2:

หลังจากลองคำแนะนำจาก Dmitry Vasilyanov ฉันพบว่าถ้าฉันใส่ -i มันจะเป็นการจำลองการเข้าสู่ระบบของผู้ใช้ อย่างไรก็ตามนี่ไม่ใช่วิธีสุดท้ายที่จะทำ

ถ้าฉันทำงานecho $PATHหลังจากเข้าสู่ระบบในฐานะ openproject ouput คือ/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/openproject/.rvm/bin

ถ้าฉันวิ่งecho $PATHหลังจากsu openproject -c "bash -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


คุณต้องการไม่ได้sudo su
dawud

คุณยังไม่สามารถ (อย่างมีความหมาย) sudo cdได้เพราะมันเป็นเชลล์ในตัว
MadHatter สนับสนุน Monica

แต่ sudo ไม่ยอมให้รูตหรือ? ฉันรูทและต้องการเรียกใช้สคริปต์ในฐานะผู้ใช้ openproject โดยมีเอฟเฟกต์ที่แน่นอนราวกับว่าฉันจะเข้าสู่ระบบในฐานะผู้ใช้ openproject และเริ่มจากคำสั่งที่สอง (cd ~ / openproject)

1
ไม่sudoถูกใช้เพื่อเรียกใช้ในฐานะผู้ใช้อื่นเป็นrootค่าเริ่มต้นหากไม่มีการระบุอะไรเลยคุณสามารถดำเนินการได้อย่างสมบูรณ์แบบsudo -u openproject bundle installเริ่มต้นถ้าไม่มีอะไรจะระบุที่ดีที่สุดที่คุณสามารถดำเนินการ
dawud

ฉันเดาว่าคุณได้รับbundle: command not foundข้อผิดพลาดเพราะคุณตั้งค่าPATHหรือGEM_PATHในของคุณ.bash_profileหรือ.bashrcพวกเขาจะไม่ถูกดำเนินการในเชลล์ที่ไม่ใช่การเข้าสู่ระบบ / ไม่โต้ตอบดังนั้นคุณต้องผ่าน-iไปsudoยังจำลองการเข้าสู่ระบบเช่นนี้:sudo -iu openproject bundle install
Dmitry Vasilyanov

คำตอบ:


19

ทำไมคุณไม่สร้างเชลล์สคริปต์และทำ

su - openproject -c "your_shell_script"

ระวังตัวก่อน - openproject ที่จะตั้งค่าตัวแปรสภาพแวดล้อมของ openproject แทนตัวแปรสภาพแวดล้อมผู้ใช้ของคุณ


ฉันต้องเพิ่มsudoเมื่อเริ่มต้นไม่เช่นนั้นจะขอรหัสผ่านของฉัน
IanVaughan

sudoจะขอรหัสผ่านในครั้งแรกที่คุณเรียกใช้ดังนั้นคำแนะนำในการวางข้อมูลของคุณลงในเชลล์สคริปต์และเรียกใช้ด้วยsusudo
YoMismo

8

ถ้าคุณใช้ bash คุณสามารถทำได้ที่นี่ -doc

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

ด้วยวิธีนี้คุณสามารถรันคำสั่งจำนวนมากและรักษาสถานะไว้ในสคริปต์

เช่นเดียวกันกับ sudo

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

ไม่เหมาะกับฉัน คุณสามารถส่งคำสั่งจาก stdin ไปยัง su / sudo ได้จริงหรือไม่?
Sparhawk

1
@Sparhawk ขอบคุณสำหรับการตรวจสอบ ในตัวอย่างที่สองฉันลืมเพิ่ม "bash" (อัปเดตตัวอย่างแล้ว) - ใช้งานได้ ตัวอย่างแรกทำงานไม่สมบูรณ์อย่างที่คุณพูดฉันพิมพ์จากแคชระยะยาวดังนั้นฉันอาจทำผิดพลาดได้ แต่แน่นอนฉันทำงานกับ stdin (ฉันใช้ java เพื่อเรียกใช้ subprocess สำหรับงานนั้น) ฉันจะพยายาม ทดสอบให้มากขึ้นเพื่อหาวิธีที่ถูกต้อง
spinus

1
ฉันต้องการสร้างคำสั่งขึ้นอยู่กับตัวแปรต่างๆและเรียกใช้ในฐานะผู้ใช้รายอื่น ดังนั้นคำแนะนำจาก YoMismo จึงไม่ใช่ตัวเลือกในกรณีของฉัน ฉันต่อสู้กับสิ่งนี้เป็นเวลาหนึ่งชั่วโมงสิ่งเดียวที่ฉันคิดว่าทำงานคือแนวทาง EOF (ตัวอย่างที่สอง) ขอบคุณ!
Jette
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.