วิธีการเรียกใช้โปรแกรมในสภาพแวดล้อมที่สะอาดในทุบตี?


114

ฉันต้องการเรียกใช้โปรแกรมในสภาพแวดล้อมที่ว่างเปล่า (เช่นไม่มีการตั้งค่าสภาพแวดล้อม) วิธีการทำเช่นนี้ในทุบตี?


คำตอบ:


127

คุณสามารถทำได้ด้วยenv:

env -i your_command

ตรงกันข้ามกับความคิดเห็นด้านล่างสิ่งนี้จะทำให้สภาพแวดล้อมชัดเจน แต่ก็ไม่ได้ป้องกันyour_commandการตั้งค่าตัวแปรใหม่ โดยเฉพาะการใช้งานเชลล์จะทำให้การ/etc/profileรันและเชลล์อาจมีการตั้งค่าบางอย่างในตัว

คุณสามารถตรวจสอบกับ:

env -i env

เช่นเช็ดสภาพแวดล้อมแล้วพิมพ์ ผลลัพธ์จะว่างเปล่า


4
มันไม่สมบูรณ์ชัดเจนจากสภาพแวดล้อม: พิมพ์echo 'echo $PATH' > test.sh && chmod u+x test.sh && env -i test.sh /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
l0b0

2
แต่ดูเหมือนว่านี่คือที่อยู่ใกล้คุณจะได้รับ - ดูเหมือนว่าตัวแปรเช่นPATH, PWDและSHLVLมีการตั้งค่าโดยอัตโนมัติโดยการทุบตี +1
l0b0

3
@ I0b0: ดูการแก้ไขของฉัน
ams

3
ตัวแปร PATH ในสคริปต์ของนักวิจารณ์คนแรกไม่ได้อยู่ในสภาพแวดล้อมดังนั้นจึงไม่ใช่ตัวแปรสภาพแวดล้อม ทุบตีเห็นได้ชัดว่าชุดของตัวเองตัวแปรเปลือกปกติเส้นทางที่เรียกว่าถ้ามีไม่ได้เป็นหนึ่งส่งออกสำหรับมัน จะช่วยให้env -i bash --norc -c "declare -p PATH" declare -- PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."หมายเหตุ "-x" สำหรับการส่งออก (และเป็นส่วนหนึ่งของสภาพแวดล้อม) หากคุณส่งออกด้วยตัวคุณเอง: env -i bash --norc -c "export PATH; declare -p PATH"ให้declare -x PATH="/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
Binary Phile

34

bashอาจมีสภาพแวดล้อม"สะอาด"

$ env -i bash --noprofile --norc
  • env -iคำสั่งรันคำสั่งที่กำหนดให้ไว้ในบรรทัดคำสั่งโดยไม่มีการโอนใด ๆ ของตัวแปรสภาพแวดล้อมของการส่งออกของสภาพแวดล้อมเปลือกเก่ากับสภาพแวดล้อมของโปรแกรมดำเนินการที่

  • --noprofileตัวเลือกหยุดbashจากการอ่านสคริปต์เริ่มต้นทั้งระบบหรือเปลือกส่วนบุคคลที่มิฉะนั้นจะอ่านสำหรับเปลือกเข้าสู่ระบบ

  • --norcตัวเลือกหยุดbashจากการอ่านสคริปต์เริ่มต้นเปลือกส่วนบุคคลที่มิฉะนั้นจะอ่านสำหรับเปลือกโต้ตอบ


env ของฉันไม่รู้จักตัวเลือกเหล่านั้น
เปาโล Carvalho

@PauloCarvalho ระบบของคุณไม่รองรับenv -i? คุณใช้ระบบอะไร
Kusalananda

ขออภัยมันใช้งานได้ในเปลือก ฉันพยายามใส่มันลงในสคริปต์และมันก็โยนข้อผิดพลาด
เปาโล Carvalho

@PauloCarvalho ขออภัยฉันไม่เห็นคำสั่งที่คุณพิมพ์หรือข้อผิดพลาดที่คุณได้รับ
Kusalananda

ยอดเยี่ยม - สิ่งที่ฉันกำลังมองหา envเพื่อทำความสะอาดสภาพแวดล้อมของฉันและ--noprofileเพื่อหลีกเลี่ยงการจัดหา / etc / โปรไฟล์และเพื่อน ๆ และ--norcเพื่อหลีกเลี่ยงการจัดหา ~ / .bashrc และเพื่อน ๆ
เฟลิเป้อัลวาเรซ

28

env -i somecommandรันคำสั่งในสภาพแวดล้อมที่ว่างเปล่าเป็นams ได้กล่าวแล้ว

โปรแกรมจำนวนมากอาศัยตัวแปรสภาพแวดล้อมที่สำคัญบางอย่างดังนั้นคุณอาจต้องการเก็บรักษาไว้:

env -i HOME="$HOME" LC_CTYPE="${LC_ALL:-${LC_CTYPE:-$LANG}}" PATH="$PATH" USER="$USER" somecommand

หรือมิฉะนั้นคุณสามารถเข้าสู่ระบบในสภาพแวดล้อมที่เล็กเวลาเข้าสู่ระบบ

ssh localhost somecommand

1
ทำงานเมื่อรันคำสั่งบน cmdline ฉันจะใส่สิ่งนี้ลงใน shebang ได้อย่างไรดูเหมือนจะไม่ทำงาน !
balki

แปลกของฉันenvไม่สนับสนุน--การปักปันเขตและการทำความพยายามที่จะเรียกใช้คำสั่งที่มีชื่อว่าenv -i FOO=bar -- env --
antak

@antak env -i -- FOO=bar envจริง ๆ แล้วควรจะเป็น ความผิดฉันเอง. ไม่ว่าจะเป็นประโยชน์ตั้งแต่สิ่งต่อไปนี้มันไม่ได้เริ่มต้นด้วย-- -
Gilles

ไม่ทราบว่าคุณสามารถเข้าสู่ localhost ได้เสมอนั่นเป็นเรื่องแปลก กรณีการใช้งานที่นั่นคืออะไร
Edgar Aroutiounian

@EdgarAroutiounian คุณสามารถ SSH ไปยัง localhost ถ้ามันใช้เซิร์ฟเวอร์ SSH ทำไมโปรแกรมเมอร์ถึงต้องใช้ความพยายามในการห้ามมัน?
Gilles

4

ในขณะที่คำตอบที่ยอมรับนั้นถูกต้องสิ่งที่คุณต้องการทำคือ:

env -i bash -l -c "printenv; and any other commands"

สิ่งนี้จะช่วยให้คุณสามารถทุบตีได้ แต่ใช้งานได้ (เหมือนกับเมื่อคุณลงชื่อเข้าใช้ในโหมดที่ไม่ต้องมีการโต้ตอบ) ตัวอย่างนี้ใช้กำหนดภาษาเขตเวลาบ้านและอื่น ๆ


มันไม่ได้ผลนักเพราะenv -iเคลียร์HOMEซึ่งหมายความว่าbash -lหาของคุณไม่เจอ.bash_profileถ้าคุณต้องการเชลล์ที่เหมือนกับสิ่งที่คุณจะได้รับเมื่อเข้าสู่ระบบใหม่คุณต้องมีการตั้งค่าทางอ้อมเพิ่มเติมHOMEก่อน
Elliott Slaughter


1

ปัญหาเกี่ยวกับคำตอบส่วนใหญ่ที่นี่คือenv -iเคลียร์HOMEดังนั้นแม้ว่าคุณจะเรียกใช้bash -lภายในก็จะไม่อ่าน.bash_profileฯลฯของคุณหากสิ่งที่คุณกำลังมองหาคือเปลือกที่ทำหน้าที่ราวกับว่าคุณเพิ่งเข้าสู่ระบบใหม่คุณ ต้องการสิ่งนี้แทน:

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
โปรดทราบว่าการเข้าสู่ระบบbashเปลือกจะทำงานหรือ.bash_login .bash_profileในการรับสภาพแวดล้อมที่สะอาดให้ใช้--noprofileหรือตั้งค่าHOMEเป็นไดเรกทอรีที่ไม่มีไฟล์เหล่านั้น ฉันคิดว่ามันขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "สะอาด"
Kusalananda

1
env -i bash -c ...ใช่ถ้าคุณต้องการเปลือกตัวอักษรอะไรในนั้นเพียงทำตามคำตอบเดิมและทำ คำตอบนี้เฉพาะเมื่อคุณต้องการเชลล์ที่ดูเหมือนว่าคุณเพิ่งทำการล็อกอินใหม่บนเครื่อง
Elliott Slaughter

0

หากต้องการตอบความคิดเห็นของ balki (และตอบคำถามของฉันเองในกระบวนการ :-):

% echo Environment in calling shell: vars: $(env |wc -l); echo; ./du; echo; cat du
Environment in calling shell: vars: 43

==> This is the environment: vars: 5
PATH="$PATH"
PWD=/Users/nick
SHLVL=1
SOMETHING_TO_KEEP="$USER"
_=/usr/bin/env
==> The end.

#!/usr/bin/env -i SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh

echo "==> This is the environment: vars:" $(/usr/bin/env | /usr/bin/wc -l)
/usr/bin/env
echo "==> The end."

เมื่อฉันลองในบรรทัด Shebang ของฉันใน CentOS 7.6 ฉันได้รับข้อผิดพลาดนี้จาก env:/usr/bin/env: invalid option -- ' ' Try '/usr/bin/env --help' for more information.
ScottJ

ถ้าฉันเปลี่ยนสคริปต์เพื่อใช้อาร์กิวเมนต์ยาว--ignore-environmentฉันจะได้รับ:/usr/bin/env: unrecognized option '--ignore-environment SOMETHING_TO_KEEP="$USER" PATH="$PATH" /bin/sh' Try '/usr/bin/env --help' for more information.
ScottJ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.