การเข้าถึงรหัสออกนอก su -m $ USER -c“ <cmd>”


8

คำสั่งด้านล่างพิมพ์ "0" หรือ "1" ถูกต้องขึ้นอยู่กับความล้มเหลวหรือไม่เพราะฉันใส่ $? ภายในคำสั่ง "su"

sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"

อย่างไรก็ตามถ้าฉันทำสิ่งนี้:

sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?

มันจะพิมพ์ "0" เสมอเพราะ "su" จริงจะประสบความสำเร็จเสมอแม้ว่าส่วนคำสั่งจะล้มเหลว

มีความคิดใดที่ฉันสามารถเรียกรหัสออกจาก subshell

คำตอบ:


7

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

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

su <user_x> -c '<bunch_of_commands>; exit $?'

ในกรณีที่ sudo ไม่เล่นดีคำสั่งทั้งหมดควรเป็นแบบนี้ (ฉันจะตรวจสอบเรื่องนี้ให้คุณ แต่ฉันไม่ได้ติดตั้ง sudo)

sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'

คอยดูรังของราคาและให้แน่ใจว่า $? ไม่ได้ขยายดังนั้นจึงไม่มีเครื่องหมายคำพูดคู่


2

echo ค่าส่งคืนภายในคำสั่งและเข้าถึงภายนอกโดยการกำหนดคำสั่งทั้งหมดให้กับตัวแปร (โดยใช้ subshell)

RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL

0

คุณสามารถใช้ไฟล์ tmp ได้ตลอดเวลา:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code

ใช่นี่คือสิ่งที่ฉันกำลังทำอยู่ตอนนี้ แต่ฉันหวังว่าจะไม่ใช้ไฟล์ tmp
นิค

0

ใช้งานได้ในเปลือก Zsh / Bash / Bourne:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"
$ echo $?

ฉันไม่แน่ใจว่าทำไมรหัสส่งคืนจึงไม่สามารถใช้งานได้เมื่อคุณขอในสายการบินเดียว แต่จะสามารถใช้ได้เมื่อคุณใช้มากกว่าหนึ่งบรรทัดเพื่อทำสิ่งเดียวกัน


สิ่งนี้ไม่ถูกต้อง สิ่งนี้จะส่งกลับศูนย์เสมอเพราะ "su -m $ USER -c <cmd>" จะประสบความสำเร็จเสมอแม้ว่าคำสั่งจริงที่อยู่ภายในจะไม่
นิค

1
@Nick - ทำงานได้ที่นี่ ผลลัพธ์ของคุณคืออะไร ลองsudo su -m zero2cx -c "/bin/false &> /dev/null"ด้วยชื่อผู้ใช้ระบบของคุณ $?ควรเป็น '1'
zero2cx

ใช่ด้วยชื่อผู้ใช้ของฉันมันจะส่งกลับ "1" ตามที่คาดไว้ แต่ฉันพยายามใช้สิ่งนี้เพื่อเรียกใช้แอปผ่านผู้ใช้ของตัวเองไม่ใช่ผู้ใช้รูทหรือผู้ใช้รายอื่น
นิค

@Nick - ควรทำงานกับ$ USER=appusernameชุดตามที่คุณต้องการ อย่าใช้ชื่อผู้ใช้จริง insread appusernameวัตถุประสงค์ของการใช้ มันควรจะทำงานมันทำเพื่อฉัน
zero2cx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.