รันเชลล์สคริปต์ในฐานะผู้ใช้อื่น


42

เป็นวิธีที่ดีในการใช้งานเชลล์สคริปต์ในฐานะผู้ใช้อื่น ฉันใช้ Debian etch และฉันรู้ว่าฉันต้องการเลียนแบบผู้ใช้คนใด

ถ้าฉันทำด้วยตนเองฉันจะทำ:

su postgres
./backup_db.sh /tmp/test
exit

เนื่องจากฉันต้องการทำให้กระบวนการเป็นแบบอัตโนมัติฉันต้องการวิธีเรียกใช้ backup_db.sh ในฐานะ postgres (สืบทอดสภาพแวดล้อม ฯลฯ )

ขอบคุณ!

คำตอบ:


67

หากต้องการเรียกใช้สคริปต์ของคุณในฐานะผู้ใช้รายอื่นให้ใช้คำสั่งเดียวให้เรียกใช้:

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

ฉันขอแนะนำให้ใช้เส้นทางแบบเต็มในสคริปต์เช่นนี้ - คุณไม่สามารถรับประกันได้เสมอว่าคุณจะอยู่ในไดเรกทอรีที่ถูกต้องเมื่อคุณ su (อาจมีคนเปลี่ยน homedir ให้คุณใครจะรู้) ฉันมักจะใช้เส้นทางแบบเต็มเพื่อ su (/ bin / su) เพราะฉันหวาดระแวง เป็นไปได้ที่ใครบางคนสามารถแก้ไขเส้นทางของคุณและทำให้คุณใช้เวอร์ชั่น su ที่ถูกบุกรุก


มันจะต้องให้ฉันพิมพ์รหัสผ่านเสมอ? จะรับรอบได้อย่างไร
zjffdu

2
มันจะต้องให้คุณพิมพ์รหัสผ่านเสมอหากคุณใช้คำสั่งในฐานะผู้ใช้ที่ไม่ใช่รูท หากคุณต้องการหลีกเลี่ยงรหัสผ่านคุณสามารถกำหนดค่า sudo เพื่อให้อนุญาตได้ HOWEVER - การกำหนดค่า sudo เพื่อให้ผู้ใช้เรียกใช้ su อนุญาตให้พวกเขากลายเป็นผู้ใช้ใด ๆ ฉันขอแนะนำให้สร้างสคริปต์สำหรับคำสั่งของคุณตั้งค่าสิทธิ์สคริปต์เป็น 700 และเป็นเจ้าของโดย root จากนั้นกำหนดค่า sudo เพื่อให้ผู้ใช้เรียกใช้สคริปต์เดียวนั้น
Baumgart

ฉันเชื่อว่า - แม้ว่าคำตอบนี้อาจใช้ได้กับ OP แต่ก็ไม่ถูกต้องทั้งหมด ตามความรู้ของฉันการใช้ทั้ง-(หรือ--login) พร้อมกับ--command, -cไม่เริ่มเซสชันการเข้าสู่ระบบจริงเพราะ-cบังคับให้เชลล์ที่ไม่ใช่การเข้าสู่ระบบเสมอ
JeanMertz

1
หมายเหตุ: สำหรับการพกพา- postgressควรปรากฏที่ส่วนท้ายของคำสั่ง จากหน้าชายคนนั้น:When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
จอนนี่


9

เพื่อให้สิ่งนี้เป็นไปโดยอัตโนมัติตามกำหนดเวลาคุณสามารถวางไว้ใน crontab ของผู้ใช้ งาน Cron จะไม่ได้รับสภาพแวดล้อมที่สมบูรณ์แม้ว่าจะเป็นการดีกว่าถ้าคุณใส่ตัวแปร env ทั้งหมดที่คุณต้องการในสคริปต์เอง

ในการแก้ไข crontab ของผู้ใช้:

sudo crontab -u postgres -e

คุณช่วยอธิบายเพิ่มเติมได้ไหม
saravanakumar

3

นี่ควรเป็นข้อมูลการอ่าน - setuid บนเชลล์สคริปต์

หากคุณเรียกใช้suพร้อม- usernameลำดับอาร์กิวเมนต์ "" มันจะทำให้เชลล์ล็อกอินสำหรับผู้ใช้เพื่อให้สภาพแวดล้อมเดียวกับผู้ใช้ โดยปกติแล้วจะใช้สคริปต์ของคุณกับสภาพแวดล้อมภายในบ้านอย่างรวดเร็วจากการลงชื่อเข้าใช้ที่แตกต่างกัน


สิ่งนี้มีประโยชน์หากคุณจำเป็นต้องดำเนินการหลายอย่าง แต่โปรดจำไว้ว่าบัญชีบริการระบบส่วนใหญ่ไม่ควรมีพา ธ และเชลล์ในบ้านที่ถูกต้อง
Dan Carley

2

ลอง manpage su:

su -c script_run_as_postgres.sh - postgres

ถ้าอย่างนั้นคุณสามารถใช้ sudo เพื่อให้คุณสามารถเรียกใช้คอมมอนนั้นเป็น postgres โดยไม่มีรหัสผ่าน แม้ว่าจะใช้การตั้งค่าบางอย่างใน / etc / sudoers ของคุณ


2

วิธี "su -c ... " ที่โพสต์โดยคนอื่นเป็นวิธีที่ดี สำหรับระบบอัตโนมัติคุณสามารถเพิ่มสคริปต์ลงใน crontab ของผู้ใช้ที่คุณต้องการเพื่อเรียกใช้งาน


1

หากผู้ใช้มีรายการไปยัง sudo แล้วและคุณไม่ทราบรหัสผ่านของผู้ใช้ขั้นสูงคุณสามารถลองทำสิ่งต่อไปนี้: สิ่งนี้เริ่มต้นใหม่ postgres ที่เริ่มต้นที่ /data/my-db/pgsql/9.6/data

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.