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


14

มีวิธีเรียกใช้คำสั่ง "ราวกับว่า" มันอยู่ในเซสชั่นการเข้าสู่ระบบใหม่หรือไม่?

env -iผมได้พยายามแล้ว อย่างไรก็ตามฉันไม่ต้องการจัดการกับตัวแปร ENV ต่างๆที่ฉันต้องตั้งค่าหรือยกเลิกการตั้งค่า

ฉันได้ลองbash -c "some command"แล้วbash -l -c "some commmand"เช่นกัน แต่พวกเขาทั้งหมดคัดลอกสภาพแวดล้อมปัจจุบัน

สิ่งที่ฉันได้มาใกล้ที่สุดคือทางออกสลัม: ssh me@localhost "some command"


ใช้/bin/bash --loginเพื่อให้ได้พฤติกรรมนั้น $PATHฉันจะใช้มันเช่นที่จะได้รับที่เหมาะสม
Daniel Beck

นั่นคือสิ่ง/bin/bash --lที่ฉันได้ลองไปแล้ว มันคัดลอกสภาพแวดล้อมเดิม export SOME_VAL=somethingลองใช้: /bin/bash --loginแล้วก็ env | grep SOME_VALแล้วก็ ค่าจะอยู่ที่นั่น
dgo.a

คำตอบ:


12

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

env -i HOME="$HOME" bash -l -c 'your_command'

ตัวอย่าง:

$ export ABC=123
$ env -i HOME="$HOME" bash -l -c 'env' | grep ABC
$ env HOME="$HOME" bash -l -c 'env' | grep ABC
ABC=123

ทำลายมันลงเพื่ออธิบาย:

  1. env -i HOME="$HOME": ล้างสภาพแวดล้อม -iชุดขึ้นสภาพแวดล้อมที่ว่างเปล่ากับตัวแปรใด ๆ นี่เป็นปัญหาเพราะหมายความว่าถ้าคุณพยายามเรียกใช้อย่างไร้เดียงสาbash -lมันจะไม่โหลด.bash_profileฯลฯ เพราะHOMEไม่ได้ตั้งค่าไว้ เพื่อลดสิ่งนี้เราส่งผ่านอย่างชัดเจนHOME="$HOME"สร้างสภาพแวดล้อมที่มีการตั้งค่าHOME(และเท่านั้นHOME)

  2. bash -l -c ...: รันคำสั่งที่ต้องการในเชลล์ล็อกอิน คุณจะต้องการเชลล์การล็อกอินสำหรับสิ่งนี้เนื่องจากเราเริ่มต้นจากสภาพแวดล้อมที่สะอาดและจำเป็นต้องโหลดทุกอย่างใหม่

สะดุดตา:

  • สิ่งนี้ไม่ต้องใช้สิทธิ์ sudo ( sudoเวอร์ชั่นใช้)
  • สิ่งนี้ไม่จำเป็นต้องพิมพ์รหัสผ่านของผู้ใช้ ( suเวอร์ชั่นใช้)
  • สิ่งนี้ไม่ต้องการการเรียกใช้เซิร์ฟเวอร์ SSH และมีรหัสผ่านที่ไม่ต้องใช้กุญแจซึ่งสามารถใช้ในการล็อกอินกลับเข้าสู่เครื่อง ( sshเวอร์ชั่นใช้)

ขอบคุณเอลเลียต มันดูเรียบง่ายและชัดเจน ... ตอนนี้มันชี้ไปที่ฉันแล้ว
dgo.a

12
su -l $USER

sudo -u $USER -i

สำหรับบางสิ่งที่ยิ่งก้าวร้าวยิ่งกว่าเดิมลองenv -i bashแต่ไม่แน่ใจว่าทุกอย่างรวมถึง $ HOME และ $ TERM


2
ขอบคุณ! คำสั่งที่สองให้สิ่งที่ฉันต้องการอย่างแน่นอน ฉันค้นหามากกว่า 2 ชั่วโมงและไม่พบสิ่งใดที่ใกล้เคียงกับคำตอบของคุณ จากการตอบกลับของคุณฉันกลับไปที่man sudoและพบว่า: "หากผู้ใช้เป้าหมายเหมือนกับผู้ใช้ที่เรียกใช้โดยไม่ต้องใช้รหัสผ่าน" ( suดูเหมือนว่าจะขอรหัสผ่านเสมอ) ฉันเป็นคนโง่ที่มองข้ามสิ่งที่ง่ายในย่อหน้าแรกของmanหน้า :( ฉันหลีกเลี่ยง sudo ในตอนแรกเพราะฉันคิดว่ามันจะถามรหัสผ่านเสมอขอบคุณ อีกครั้ง!
dgo.a

1
เป็นเพียงคำใบ้สำหรับคนอื่น ๆ ... หากคุณเข้าสู่ระบบในขณะที่$USERคุณจะต้องเข้าสู่ระบบในฐานะที่เป็นรากแล้วsudo -u ...เป็นผู้ใช้ของคุณ หากคุณเพียงแค่ทำsudo -uในฐานะผู้ใช้คุณจะได้รับมรดก
Adam Gent

มันไม่ทำงานแน่นอนถ้าคุณไม่sudoสามารถเข้าถึงได้ มีวิธีอื่นที่ไม่ต้องใช้ sudo หรือไม่?
user5359531

@ user5359531: ใช่ su -l $USER-
1686

1
ที่ขอรหัสผ่าน; ฉันลงชื่อเข้าใช้ผ่านการรับรองความถูกต้องของคีย์ ssh ดังนั้นฉันจึงไม่รู้ด้วยซ้ำว่ารหัสผ่านคืออะไร และรหัสผ่านพร้อมท์จะฆ่าความสามารถสคริปต์ จนถึงตอนนี้ดูเหมือนว่าssh $USER@localhost <command>มันจะทำงานได้ดีขึ้น
user5359531
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.