เป็นไปได้หรือไม่ที่จะมีเชลล์ล็อกอินที่ไม่ทำงาน?


11

ในการตีความผังงานนี้

ป้อนคำอธิบายรูปภาพที่นี่

ฉันพบว่าในคนทุบตี:

เมื่อ bash ถูกเรียกใช้เป็นเชลล์ล็อกอินแบบโต้ตอบหรือเป็นเชลล์แบบไม่โต้ตอบที่มีตัวเลือก --login มันจะอ่านและเรียกใช้คำสั่งจากไฟล์ / etc / profile ก่อนหากไฟล์นั้นมีอยู่

ระบุว่าเชลล์ล็อกอินแบบโต้ตอบอ่าน/etc/profile(โดยไม่มี --noprofile)

นอกจากนี้เชลล์ที่ไม่มีการโต้ตอบพร้อมตัวเลือกการ--loginอ่าน/etc/profile

ที่ดูเหมือนว่าจะปล่อยให้บางอย่างที่เป็นไปได้เข้าสู่ระบบเปลือกหอย (ซึ่ง$0เริ่มต้นด้วย-) ที่ถูกไม่โต้ตอบ (เรียกใช้สคริปต์ที่อาจจะเป็นง่ายๆเป็นdate) อาจจะไม่อ่าน /etc/profile(ที่มา)

หากต้องการยืนยันหรือปฏิเสธแนวคิดนี้:

ก่อนอื่นฉันพยายามใช้su -l -ซึ่งเริ่มต้นเชลล์การเข้าสู่ระบบด้วย-อักขระตัวแรก แต่ฉันไม่สามารถทำให้มันเป็นแบบไม่โต้ตอบ (และสามารถแสดงการทดสอบเพื่อตรวจสอบได้)

เรียกสิ่งที่ชอบ

$ bash -c 'date' -bash

ไม่รายงานว่าเป็นเชลล์ล็อกอิน (แม้ว่าอักขระตัวแรกคือ-)

ลองใช้วิธีนี้เพื่อเปิดเผยรายละเอียด:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

$0มี-เป็นตัวอักษรตัวแรกไม่มีi(interactive) ในมูลค่าของ$-แต่มันก็ไม่ได้รายงานเป็นlogin_shell(-u) ที่ ในกรณีนี้ไม่ได้อ่าน / etc / profile แต่ฉันไม่แน่ใจว่านี่เป็นการทดสอบที่ถูกต้อง


นอกจากนี้ยังมีการกล่าวถึง "เชลล์การเข้าสู่ระบบแบบไม่โต้ตอบที่หายาก" ในคำตอบนี้โดยไม่เจาะจงเพียงพอสำหรับคำถามนี้


ข้อสรุปของผู้ชายคนนี้คือการที่/etc/profileจะอ่านเสมอ

อ่านตารางสรุป: อ่านเชลล์ล็อกอินทั้งแบบโต้ตอบและไม่โต้ตอบ /etc/profile


และหากตัวอย่างจากหน้านี้ถูกต้อง:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh bob@example.com      # interactive login shell, `~/.profile`
$ ssh bob@example.com env  # non-interactive non-login shell, `~/.bashrc`

การทดสอบexec su - bob -c 'env'รายงานที่/etc/profileอ่าน


ในระยะสั้น:

เป็นไปได้หรือไม่ที่จะมีเชลล์ล็อกอินแบบไม่โต้ตอบ (ไม่ถูกเรียกด้วย --login หรือ -l)?

และถ้าเป็นจริงมันอ่าน/etc/profileไฟล์หรือไม่

หากข้างต้นเป็นจริงเราต้องสรุปว่าALL login shells [แบบโต้ตอบ (หรือไม่)] อ่าน / etc / profile (ไม่มี--noprofileตัวเลือก)

หมายเหตุ: เพื่อตรวจสอบว่า / etc / profile กำลังอ่านอยู่ให้เพิ่มที่จุดเริ่มต้นของไฟล์ที่คำสั่งนี้:

echo "'/etc/profile' is being read"

คำตอบ:


2

เชลล์ล็อกอินที่ไม่โต้ตอบนั้นผิดปกติ แต่เป็นไปได้ หากคุณเริ่มเชลล์ด้วยอาร์กิวเมนต์ zeroth (ซึ่งโดยปกติจะเป็นชื่อของไฟล์เรียกทำงาน) ที่ตั้งค่าให้เป็นสตริงที่ขึ้นต้นด้วย a -มันเป็นเชลล์ล็อกอินไม่ว่าจะเป็นแบบโต้ตอบหรือไม่

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

ความพยายามของคุณbash -c date -bashไม่ได้ทำงานเพราะที่ไม่ได้บอกเปลือกจะเป็นเปลือกเข้าสู่ระบบ: โต้แย้งข้อที่ศูนย์คือไม่bash -bashหลังจาก bash เริ่มต้นแล้วมันจะตั้งค่าตัวแปร$0เป็น-bashแทนอาร์กิวเมนต์ zeroth แต่อาร์กิวเมนต์ zeroth นั้นสำคัญ

คุณสามารถเรียกใช้เชลล์ล็อกอินแบบไม่มีการโต้ตอบด้วยsu -lหรือsu -แต่คุณต้องจัดเตรียมอินพุตมาตรฐานไม่ให้เป็นเทอร์มินัลในขณะที่ยังสามารถได้รับอนุญาต (โดยไม่ต้องพิมพ์รหัสผ่านหรือจัดการรหัสผ่านของคุณให้เป็นจุดเริ่มต้น การป้อนข้อมูล) มันอาจจะง่ายขึ้นด้วย sudo: ทำงานจะได้รับการรับรองการปรากฏตัวแล้วในขณะที่ข้อมูลประจำตัวยังคงวิ่งที่ถูกต้องsudo trueecho 'shopt -p login_shell; echo $-' | sudo -i

ดูความแตกต่างระหว่างล็อกอินเชลล์และเชลล์ที่ไม่ใช่ล็อกอิน?


4

ฉันเห็นสภาพแวดล้อมการเข้าสู่ระบบแบบกราฟิกที่ทำ:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

หรือเทียบเท่า:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

เพื่อให้ไฟล์การเริ่มต้นเซสชัน (เช่น~/.profileเชลล์คล้ายบอร์น (และเชลล์ที่เกี่ยวข้อง/etcสำหรับบางรายการ)) ถูกอ่านและนำไปใช้

คนแรกไม่สามารถใช้งานได้กับกระสุนทั้งหมด -lได้รับการสนับสนุนจากกระสุนจำนวนมาก แต่ไม่ใช่ทั้งหมดและในบางอย่างเช่นcsh/ tcshไม่สามารถใช้กับ-cได้ ตัวอักษรตัวแรกของargv[0]ความเป็นอยู่-เป็นที่เข้าใจกันโดยเปลือกหอยทั้งหมด แต่เป็นว่าสิ่งที่loginใช้ในการบอกเปลือกหอยเปลือกหอยพวกเขาจะเข้าสู่ระบบ

ในกรณีที่สอง stdin ของเชลล์นั้นเป็นttyอุปกรณ์อื่นนอกเหนือจากอุปกรณ์ ( <<ถูกใช้งานโดยไฟล์ปกติชั่วคราวหรือไพพ์ขึ้นอยู่กับเชลล์) ดังนั้นเชลล์จึงไม่ได้เป็นแบบโต้ตอบ (นิยามของการโต้ตอบเมื่อมนุษย์โต้ตอบ กับมัน)


คนแรกใช้--loginตัวเลือก สำหรับอันที่สองถ้าฉันจะexec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"ได้รับ (เข้ารหัสใน C qoutes) $'/etc/profile read\nshopt -s login_shell\nbash himBH'ดังนั้นมันคือการเข้าสู่ระบบ แต่มันเป็นแบบโต้ตอบ เราจำเป็นต้องเข้าสู่ระบบและไม่โต้ตอบ อะไรที่ฉันขาดหายไป

@sorontar พร้อมด้วย<<<"$-"ที่$-ถูกขยายโดยการเรียกเชลล์เนื่องจากอัญประกาศคู่ เชลล์ที่ถูกเรียกไม่ใช่แบบโต้ตอบเนื่องจาก stdin นั้นไม่ใช่ tty
Stéphane Chazelas

อ๋อใช่คุณถูกต้องครับ อย่างไรก็ตามการแก้ไขความผิดพลาดที่เราสามารถทำสิ่งนี้exec -a "-bash" "bash" <<\EOF shopt -p login_shell; echo $0 $- EOFที่จะได้รับการยืนยันนี้ดังนั้นใช่เปลือกเข้าสู่ระบบที่ไม่ใช่แบบโต้ตอบเป็นไปได้และมันจะยังคงอ่าน$'/etc/profile read stdin: is not a tty shopt -s login_shell -bash hB' /etc/profileเราควรสรุปว่าเชลล์ล็อกอินทั้งหมดอ่าน/etc/profileหรือไม่

ksh ทำให้ชัดเจนว่าเป็นเชลล์ล็อกอินที่ไม่ต้องมีการโต้ตอบลองexec -a "-ksh" "ksh" <<\EOF echo $0; set -o EOF:)

1
@sorontar ฉันคิดว่าคุณสามารถคาดหวังว่าการใช้งานเชลล์ส่วนใหญ่เพื่ออ่านไฟล์การเริ่มต้นเซสชันของพวกเขาเมื่อเรียกว่าเป็นเชลล์การเข้าสู่ระบบ สิ่งที่พวกเขาจะขึ้นอยู่กับการใช้งานเปลือกและรุ่น ในกรณีของbashการจัดการไฟล์เริ่มต้นนั้นค่อนข้างยุ่งเหยิง IMO คุณจะพบว่าบางระบบได้ทำการปะแก้เพื่อให้มีพฤติกรรมที่เหมาะสมยิ่งขึ้นและเพิ่มความหลากหลายมากขึ้น
Stéphane Chazelas

3

ใช่สามารถเข้าสู่ระบบเชลล์แบบไม่โต้ตอบได้

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

su -c 'echo hello' -นั่นคือที่คล้ายกันนี้ง่าย: ซึ่งในการทดสอบสิ่งที่เราต้องการควรจะเขียนเป็น: su -c 'echo $0 $-; shopt -p login_shell' -จะได้รับนี้คำตอบยืนยัน (เข้ารหัสในคำพูด $'/etc/profile read \n -su hBc \n shopt -s login_shell'C): นั่นเป็นการยืนยันว่าล็อกอินเชลล์ที่ไม่มีการโต้ตอบนั้นถูกสร้างขึ้นมาและได้อ่าน / etc / profile ในกระบวนการ ขอบคุณ

0

เป็นไปได้หรือไม่ที่จะมีเชลล์ล็อกอินแบบไม่โต้ตอบ (ไม่ถูกเรียกด้วย --login หรือ -l)?

ใช่.

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

อย่างไรก็ตามโปรดทราบว่า/etc/profileจะไม่ถูกใช้สำหรับล็อกอินเชลล์ที่ไม่ต้องมีการโต้ตอบเว้นแต่--loginจะได้รับอาร์กิวเมนต์

สำนวนทั่วไปที่เรียกใช้ล็อกอินเชลล์แบบไม่โต้ตอบคือ:

$ su - someuser -c somecommand

แต่นี่เป็นความจริงที่/etc/profileไม่ได้ถูกดำเนินการ

เป็นไปได้ที่จะเปลี่ยนพฤติกรรมนี้ แต่เกี่ยวข้องกับการปรับแต่งซอร์สโค้ด Bash ในเวลาคอมไพล์โดยไม่แสดงข้อคิดเห็นตัวเลือกที่พบในconfig-top.h :

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

เมื่อฉันค้นคว้าsuความผิดปกตินี้ฉันพบว่ากระสุนอื่นรวมถึงzshและdashไม่มีความคลาดเคลื่อนนี้

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