ผ่านฟังก์ชั่นไปยังผู้ใช้คนอื่นใน Bash?


11

มีวิธีใดบ้างที่ฉันสามารถส่งผ่าน Function จากผู้ใช้รายหนึ่งไปยังผู้ใช้รายอื่น?

ตัวอย่างเช่นฉันมีสคริปต์ Bash ขนาดเล็กที่ฉันเรียกใช้เป็นรูต:

#!/bin/bash
user_func(){
  whoami
  exit
}
su vagrant -c 'user_func'

อย่างไรก็ตามฟังก์ชั่น user_func ไม่ได้ถูกกำหนดไว้สำหรับผู้ใช้ Vagrant เฉพาะสำหรับรูทและไม่สามารถดำเนินการได้

ตัวเลือกอื่นของฉันจะมีหลายบรรทัด

su vagrant -c 'cmd1' 
su vagrant -c 'cmd2'
, etc 

หรือดำเนินการหลายคำสั่งเช่น: su vagrant -c 'cmd1; cmd2; cmd3;'แต่ฉันไม่ต้องการมีส่วนเกินโดยเฉพาะเมื่อพยายามเรียกใช้คำสั่งมากกว่า 5 คำสั่งในฐานะผู้ใช้ Vagrant

เป็นไปได้ไหมที่จะส่ง Function ให้กับผู้ใช้รายอื่นจากภายในสคริปต์เดียวกัน (เช่นไม่ได้สร้างสคริปต์บนดิสก์ในฐานะผู้ใช้รายอื่นแล้วเรียกใช้งานสคริปต์ที่สร้างขึ้น) หรือมีตัวเลือกอื่นที่ฉันสามารถมองเห็นได้?

คำตอบ:


10

ฟังดูเหมือนคุณจะต้องexportนิยามฟังก์ชั่นนั้นก่อน:

#!/bin/bash
user_func (){
  whoami
  exit
}
export -f user_func
su vagrant -c 'user_func'

ควรทำเคล็ดลับ

-fบอกexportว่านี่คือชื่อฟังก์ชันมากกว่าชื่อตัวแปร ข้อความจากhelp export:

ทำเครื่องหมายแต่ละ NAME สำหรับการส่งออกโดยอัตโนมัติไปยังสภาพแวดล้อมของคำสั่งที่ดำเนินการในภายหลัง ....

ตัวเลือก:

 -f   refer to shell functions

ตามที่ระบุโดย peterph และ Stephane ในความคิดเห็นสิ่งนี้ถือว่าสองสิ่ง:

  1. ว่าsuคำสั่งของคุณจะไม่เขียนทับสภาพแวดล้อมของผู้ใช้
  2. นั่นvagrant's bashเปลือกเข้าสู่ระบบเป็น หากไม่เป็นเช่นนั้นคุณสามารถใช้suบรรทัดคำสั่งสำรองที่จัดทำโดย Stephane:

    su vagrant -c 'bash -c user_func'

นี่คือสิ่งที่ฉันหวังไว้อย่างแท้จริง ฉันไม่ทราบว่าคุณจะสามารถส่งออกฟังก์ชันได้ สิ่งนี้ใช้ได้เหมือนที่ฉันหวังว่าจะแก้ไขหลังจากสคริปต์ตัวอย่าง ขอบคุณ!
gdieckmann

1
ดี แต่จะไม่ทำงานในกรณีที่suแทนที่สภาพแวดล้อม
เตอร์

1
โปรดทราบว่ามันใช้งานได้เฉพาะในกรณีที่เปลือกเข้าสู่ระบบของการมีvagrant bashถ้าไม่ใช่su vagrant -c 'bash -c user_func'
Stéphane Chazelas

6

มันค่อนข้างแฮ็ค แต่คุณสามารถพิมพ์คำจำกัดความของฟังก์ชั่นภายใน sommand ที่ส่งไปยังsuแล้วคุณสามารถใช้มันได้

$ function foo { do_some_stuff_here; }
$ su test -c "$(typeset -f foo); foo"

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


+1 เคล็ดลับเรียบร้อยจริงๆ! แค่คำถามเดียวsuสภาพแวดล้อมของเชลล์สามารถถูกเขียนทับโดยปัจจัยภายนอกได้หรือไม่? ฉันหมายถึงในกรณีนี้คุณสามารถควบคุมsuบรรทัดคำสั่งได้อย่างสมบูรณ์เนื่องจากอยู่ในสคริปต์ สภาพแวดล้อมของเชลล์ใหม่จะถูกเขียนทับได้อย่างไร?
โจเซฟอาร์

ตัวอย่างเช่นเชลล์วางไข่โดยsuอาจทำการเริ่มต้นของสภาพแวดล้อม นอกจากนี้suตัวเองอาจตัดบางส่วนของสภาพแวดล้อมที่โทรมาเพื่อกระชับความปลอดภัยบิต (แม้ว่าเรื่องนี้จะกระทำโดยทางเลือกที่มีประสิทธิภาพมากขึ้นเช่นมักsudo)
เตอร์

0

นั่นไม่ใช่สคริปต์ที่คุณมีมันคือฟังก์ชั่น ดูเหมือนว่าคุณต้องการสคริปต์ สร้างสคริปต์ที่เหมาะสมและวางสคริปต์ตามที่คุณต้องการไม่ว่าจะใน/usr/local/binหรือใน/home/vagrant/binและมากกว่าที่คุณควรจะสามารถเช่นsu vagrant -c '/home/vagrant/bin/myscript.sh'


มันเป็นฟังก์ชั่นภายในสคริปต์ตัวอย่าง ความหวังของฉันคือการรวมทุกสิ่งที่ฉันต้องการทำไว้ในสคริปต์เดียวนี้ (คำสั่งทำงานเป็นรูทและในฐานะผู้ใช้ Vagrant) และไม่จำเป็นต้องมีสคริปต์แยกต่างหากสำหรับผู้ใช้รูทและสคริปต์แยกต่างหากสำหรับผู้ใช้ Vagrant
gdieckmann

0

อีกวิธีหนึ่งที่พกพาได้มากกว่าในการทำสิ่งนี้ (ไม่มีการพึ่งพา bash) คือการให้สคริปต์ของคุณเรียกตนเองและมีการเปลี่ยนแปลงพฤติกรรมตามบริบท (uid) หรือพารามิเตอร์ ตัวอย่างนี้ได้รับในเอกสารsuperที่พวกเขาแสดงสคริปต์ที่ต้องการสิทธิ์รูทเรียกตนเองผ่าน super เมื่อไม่รูต

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