ฉันจะป้องกัน XWin Server ของ Cygwin โดยเริ่มต้น xterm ได้อย่างไร


12

เมื่อใดก็ตามที่ฉันเริ่มต้นเซิร์ฟเวอร์ X ของ Cygwin โดยใช้ลิงก์ "เซิร์ฟเวอร์ XWin" ในเมนูเริ่มของฉันหรือโดยการเรียกใช้startxwinจากเชลล์ Cygwin ฉันจะได้รับหน้าต่าง xterm ปรากฏขึ้นโดยอัตโนมัติซึ่งฉันไม่ต้องการหรือไม่ต้องการ

ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร

(คำถามที่ได้รับแรงบันดาลใจจากความคิดเห็นนี้โดยStijn Vanpouckeบน Stack Overflow)

คำตอบ:


5

ดูเหมือนว่าพฤติกรรมของ startxwin นั้นเปลี่ยนไปตั้งแต่ @me_and ตอบคำถามแล้วดังนั้นเพียงแค่สร้าง. startxwinrc ที่ว่างเปล่าในโฮมไดเร็กตอรี่ของคุณจะไม่ทำงานอีกต่อไป

ผมพบคำตอบที่นี่ ในสาระสำคัญเมื่อคำสั่งสุดท้ายใน. startxwinrc ออกจากเซิร์ฟเวอร์จะออก หากคุณต้องการป้องกันไม่ให้คุณสามารถใส่สิ่งนี้เป็นบรรทัดสุดท้ายใน. startxwinrc ของคุณ:

sleep inf

สิ่งนี้จะไม่เริ่มโปรแกรมไคลเอนต์ใด ๆ แต่จะป้องกันไม่ให้. startxwinrc ออกจากการทำงาน


1
ด้วยเหตุผลบางอย่างมันไม่ทำงานสำหรับฉัน ฉันต้องพิมพ์: exec sleep infinityตามที่แสดงไว้ที่นี่: x.cygwin.com/docs/faq/cygwin-x-faq.html#q-startxwinrc-exit
enricoferrero

17

UPDATE : คำตอบนี้ล้าสมัยแล้ว สำหรับคำตอบ up-to-date, ดูคำตอบ user551570 ด้านล่าง

จากman startxwin:

หากไม่มีการระบุโปรแกรมไคลเอนต์เฉพาะในบรรทัดคำสั่งstartxwinจะค้นหาไฟล์ในโฮมไดเร็กตอรี่ของผู้ใช้ที่เรียก.startxwinrcใช้เป็นเชลล์สคริปต์เพื่อเริ่มโปรแกรมไคลเอนต์ หากไม่มีไฟล์ดังกล่าวอยู่startxwinจะใช้สิ่งต่อไปนี้เป็นค่าเริ่มต้น:

xterm  -geometry  +1+1  -n  login  -display  :0

ดังนั้นเพื่อหลีกเลี่ยงไม่ให้โปรแกรมใด ๆ เริ่มทำงานเมื่อคุณเริ่ม X Server คุณต้องการ.startxwinrcไฟล์เปล่า เพียงเรียกใช้สิ่งต่อไปนี้จากพรอมต์ Cygwin:

touch ~/.startxwinrc

1
โซลูชันนี้ใช้งานได้ดีนาน แต่ตอนนี้มีการอัปเดตครั้งล่าสุดไม่ใช่ การใช้.startxwinrcผลลัพธ์ว่างเปล่าในการหายไปของเซิร์ฟเวอร์ X ทันที :-(
Notinlist

1
@Notinlist ดังนั้นมันจึงเป็นเช่นนั้น มันช่างน่าเศร้า ฉันจะพยายามตรวจสอบและหาวิธีแก้ปัญหาใหม่ ดูเหมือนว่าระบบมีความซับซ้อนมากขึ้นในขณะนี้และฉันไม่สามารถหาวิธีที่มันควรจะทำงาน ...
me_and

3

ในฐานะของพฤศจิกายน 2014 , รุ่นล่าสุดของstartxwinการใช้งานxinitที่จะเริ่มต้น Cygwin / XWin.exeเซิร์ฟเวอร์เอ็กซ์ซึ่งเรียกว่าจริง กระบวนการดังกล่าวเป็นเช่นนี้:

  1. คุณโทรมา startxwin
  2. startxwinสร้าง.Xauthorityไฟล์ใหม่และหนึ่งไฟล์ที่เรียกว่า.serverauth.1234(โดยที่1234การเปลี่ยนแปลงแต่ละครั้งที่คุณเริ่ม X)
  3. startxwin ตั้งค่าพารามิเตอร์ไคลเอ็นต์และเซิร์ฟเวอร์บางอย่าง
  4. startxwinเรียกใช้xinitด้วยพารามิเตอร์ไคลเอนต์และเซิร์ฟเวอร์รวมถึงเชลล์สคริปต์เผื่อเลือกและการอ้างอิงไปยังไฟล์รับรองความถูกต้อง
  5. xinit สตาร์ทเซิร์ฟเวอร์ X รันสคริปต์ rc บางตัว
  6. xinitสตาร์ทไคลเอ็นต์ (โดยปกติxterm) หรือสคริปต์ rc ของไคลเอ็นต์ เราต้องการหลีกเลี่ยงสิ่งนี้
  7. เมื่อคุณปิดไคลเอนต์หรือสคริปต์ rc ไคลเอ็นต์เสร็จสิ้นให้xinitปิดเซิร์ฟเวอร์ X หากเราหลีกเลี่ยงขั้นตอนที่ 6 เราก็ต้องหลีกเลี่ยงสิ่งนี้เช่นกัน

มันเป็นไปได้ที่จะเรียกใช้XWin.exeโดยตรงจากภายในเปลือกเข้าสู่ระบบทุบตีโดยไม่ต้องงานรอบที่startxwinและxinitดำเนินการ ข้อได้เปรียบหลักของสิ่งนี้คือมันทำงานเหมือนที่เราต้องการ: เซิร์ฟเวอร์ X เริ่มทำงานและยังคงทำงานอยู่ น่าเสียดายเนื่องจากไม่มี.Xauthorityไฟล์ที่ถูกส่งระหว่างการเริ่มต้นเซิร์ฟเวอร์ X ของคุณจะอนุญาตให้กระบวนการในท้องถิ่นใด ๆ เชื่อมต่อกับมันซึ่งไม่ปลอดภัย

โชคดีที่มันxinitทำสิ่งที่เราไม่ต้องการมากที่สุด มีแฮ็คด่วนที่ข้ามxinitแต่เก็บองค์ประกอบที่เหลือของstartxwinที่เกี่ยวข้องกับเซิร์ฟเวอร์เอง

TL; DR:ในstartxwinมีเส้นอยู่ด้านล่างที่อ่านไปนี้:

eval xinit \"$client\" $clientargs -- \"$server\" $display $serverargs

เปลี่ยนบรรทัดนั้นเป็น:

eval \"$server\" $display $serverargs

จากนี้ไปstartxwinสคริปต์จะเรียกโดยตรงมากกว่าการโทรXWin.exe xinitเห็นได้ชัดว่านี่จะปิดการใช้งานสคริปต์ลูกค้า rc แต่เราไม่ต้องการให้สคริปต์เหล่านั้นมาตั้งแต่แรก นอกจากนี้ยังหมายความว่า X จะยังคงทำงานต่อไปโดยไม่จำเป็นต้องมีกระบวนการไคลเอนต์เพื่อทำให้มันมีชีวิตอยู่ (เช่นป้องกันการxinitฆ่ามัน)


0

ฉันสร้างนิสัยให้เริ่มต้น Cygwin X ด้วย startxwin (.exe) ไฟล์. startxwinrc ของฉันอ่านเป็นดังนี้:

X :0 -rootless mrxvt  -geometry  +1+1  -n  login  -display  :0 -tt ImTabbed

จนถึงตอนนี้มันได้ผลแล้ว ข้อผิดพลาดเดียวที่ฉันได้รับเกี่ยวกับการแสดงยังคงเป็น "เปิด" โดยกระบวนการ X อื่น ข้อผิดพลาดนี้ระบุไฟล์บางอย่างที่เซิร์ฟเวอร์ X สร้างขึ้นตามค่าเริ่มต้นสำหรับทุกเซสชัน กลุ่ม Cygwin ทราบว่าจะไม่ถูกลบเมื่อสิ้นสุดเซสชัน

ดังนั้นฉันจึงเขียนนามแฝงเพื่อ "รักษา" ที่:

alias freex='rm /tmp/.X0-lock'

ฉันใส่บรรทัดเดียวกัน - ส่วนที่อยู่ระหว่างเครื่องหมายคำพูดในอัตราใด ๆ - ในไฟล์. bashrc และ. bash_profile ของฉันในกรณีที่ฉันควรลืมที่จะทำเอง

HTH

BZT


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