ชักนำให้เกิดการเข้าสู่ระบบกราฟิก Mac จาก SSH


16

ฉันจะชักนำให้เกิดการเข้าสู่ระบบกราฟิก Mac จาก SSH ได้อย่างไร มีวิธีที่จะทำให้loginwindowกระบวนการเริ่มเซสชันผู้ใช้ด้วยการรันคำสั่งเมื่อล็อกอินจากระยะไกลผ่าน SSH ในฐานะผู้ดูแลระบบบน Mac OS X หรือไม่

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

โซลูชันที่ไม่เกี่ยวข้องกับการเขียนสคริปต์ GUI เป็นที่ต้องการอย่างมาก แต่หน้า Apple KB นี้อาจเป็นที่สนใจสำหรับผู้ที่ไปเส้นทางนั้น

คำตอบ:


4

ไม่ทราบว่ารหัสผ่านทำให้สิ่งต่าง ๆ ซับซ้อน แต่อาจเป็นวิธีแก้ปัญหา: เป็นไปได้หรือไม่ที่จะลบรหัสผ่านของผู้ใช้ชั่วคราว (และหลังจากนั้นก็รีเซ็ตเป็นสิ่งที่เคยเป็นมาก่อน)

เป็นการเริ่มต้น:

ก่อนอื่นรับหน้าต่างเข้าสู่ระบบเพื่อแสดง เพียงออกจากระบบผู้ใช้ปัจจุบันใช้การสลับผู้ใช้อย่างรวดเร็วหรือใช้ SSH:

cd "/ ระบบ / Library / CoreServices / เมนูพิเศษ / User.menu / เนื้อหา / ทรัพยากร /"
sudo ./CGSession -suspend

หรือเพื่อสลับไปยังผู้ใช้เฉพาะทันทีซึ่งอาจจะแสดงหน้าต่างเข้าสู่ระบบ (ซึ่งไม่สามารถใช้งาน 10.5 Leopard ของฉันได้อีกต่อไป):

sudo ./CGSession -switchToUserID 501

สิ่งที่แสดงในขณะนี้ขึ้นอยู่กับการตั้งค่าระบบเล็กน้อย แต่สมมติว่าเป็นไอคอนของผู้ใช้และชื่อของพวกเขา ในการเปิดใช้งานชื่อเราจะต้องพิมพ์ตัวอักษรตัวแรก จากนั้นหลังจากกลับมาพรอมต์รหัสผ่านจะปรากฏขึ้น อีกทางเลือกหนึ่งที่สามารถเลือกใด ๆชื่อ (เช่นโดยการกดลูกศรลง) และกดตัวเลือกกลับไปรับแจ้งสำหรับทั้งชื่อผู้ใช้และรหัสผ่านของ ฉันไม่รู้ว่าจะบอกได้อย่างไรว่าหน้าจอใดบ้างที่จะแสดง แต่ขอบันทึกไว้เพื่อใช้ภายหลัง

ดังนั้นในการเลือกชื่อผู้ใช้ (สุ่ม) ชื่อแรกและกด Option-Return ให้พิมพ์ชื่อผู้ใช้เฉพาะกดปุ่ม Return และพิมพ์รหัสผ่าน:

sudo osascript -e 'บอกแอพ "เหตุการณ์ของระบบ"
  รหัสคีย์ 125
  การกดแป้นพิมพ์กลับมาโดยใช้ตัวเลือกลง
  การกดแป้น "ชื่อผู้ใช้"
  หน่วงเวลา 1.0
  การกดแป้นกลับมา
  หน่วงเวลา 1.0
  การกดแป้น "รหัสผ่าน"
  หน่วงเวลา 1.0
  การกดแป้นกลับมา
จบบอก '

ข้างต้นแสดงข้อผิดพลาดบางอย่างซึ่งเท่าที่ฉันสามารถบอกได้ไม่ จำกัด การใช้งาน:

osascript [285]: 3891612: (connectAndCheck) แอปที่ไม่น่าเชื่อถือไม่ใช่ 
    อนุญาตให้เชื่อมต่อหรือเรียกใช้ Window Server ก่อนเข้าสู่ระบบ
_RegisterApplication () ล้มเหลวในการสร้างการเชื่อมต่อเริ่มต้นไปที่
    WindowServer, _CGSDefaultConnection () คือ NULL

หรือใช้สคริปต์เฉพาะภาษาจาก " Script the Login window ผ่าน Apple Remote Desktop " (บางทีวันหนึ่งความคิดเห็นที่ไซต์นั้นจะแสดงทางออกที่ดีกว่า):

บอกกระบวนการ "SecurityAgent"
  กำหนดค่าของฟิลด์ข้อความ 1 ของกลุ่ม 1 ของหน้าต่าง 1 เป็น "ชื่อผู้ใช้"
  กำหนดค่าของฟิลด์ข้อความ 2 ของกลุ่ม 1 ของหน้าต่าง 1 เป็น "รหัสผ่าน"
จบบอก
คลิกปุ่ม "เข้าสู่ระบบ" ของหน้าต่าง 1 ของกระบวนการสมัคร "SecurityAgent"

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

  • เป็นไปได้หรือไม่ที่จะลบรหัสผ่านของผู้ใช้เป็นการชั่วคราวเพื่อให้สามารถเริ่มต้น (หรือกลับมาทำงานต่อ) เซสชันโดยไม่ทราบรหัสผ่านนั้น ...

  • หนึ่งสามารถทำให้ข้อผิดพลาด AppleScript หลักฐาน? ชอบ:

    • จะทราบได้อย่างไรว่าหน้าต่างการเข้าสู่ระบบปรากฏหรือไม่ (อาจstat -f%Su /dev/consoleช่วยได้เนื่องจากจะให้ผลrootในขณะที่หน้าต่างการเข้าสู่ระบบปรากฏขึ้น)
    • วิธีการบอกที่หน้าต่างเข้าสู่ระบบจะแสดง? (ถูกใจ: มีไอคอนหนึ่งชื่อแสดงชื่อล็อกอินหรือรายการดรอปดาวน์หรืออาจเป็นเพียงการแจ้งรหัสผ่านหากมีคนเลือกที่จะเปลี่ยนไปใช้ผู้ใช้บางคน?)
    • กำจัดความล่าช้า
    • สิ่งที่เกี่ยวกับข้อผิดพลาดที่?

(หมายเหตุสำหรับการทดสอบ: เมื่อใช้การแชร์หน้าจอดูเหมือนว่าการตั้งค่ากำหนดเมื่อควบคุมคอมพิวเตอร์: เข้ารหัสรหัสผ่านและการกดแป้นก็ยังคงรักษาการเชื่อมต่อเมื่อหน้าต่างล็อกอินปรากฏขึ้นหรือหลังจากผู้ใช้เข้าสู่ระบบเรียบร้อยแล้วเมื่อใช้เข้ารหัสเครือข่ายทั้งหมด ข้อมูลจากนั้น Mac ของฉันจะต้องสร้างการเชื่อมต่อการแชร์หน้าจอใหม่ทุกครั้งที่มีการแสดงการเข้าสู่ระบบหรือมีการสลับผู้ใช้)


นี่เป็นการเริ่มต้นที่ดี แต่มันมีสองปัญหา ก่อนอื่นมันไม่ทำงานหากคุณอยู่ที่หน้าต่างเข้าสู่ระบบซึ่งเป็นสิ่งที่ฉันต้องการและขอรหัสผ่านซึ่งฉันไม่ต้องการ เนื่องจากเป็น root จึงควรสามารถสลับผู้ใช้โดยไม่มีรหัสผ่าน
Sophie Alpert

เอเอชเอ ฉันไม่รู้ด้วยซ้ำว่าจะเข้าสู่ระบบในฐานะผู้ใช้รายอื่นเมื่อนั่งอยู่ที่คอมพิวเตอร์ของตัวเองsudo osascript -e 'tell app "System Events" to keystroke "password" & return'ได้อย่างไร เมื่อหน้าจอถูกล็อคการป้อนชื่อผู้ใช้การจัดการและรหัสผ่านจะดำเนินการต่อเซสชันของผู้ใช้รายอื่น แต่จะเริ่มเซสชันสำหรับผู้ใช้ใด ๆ โดยไม่ต้องรู้รหัสผ่านได้อย่างไร (เพื่อให้แน่ใจว่าถ้าคุณรู้รหัสผ่าน: วิธีแก้ปัญหาอื่นอาจเป็นการแชร์หน้าจอซึ่งใช้งานได้กับหน้าจอเข้าสู่ระบบคุณจะต้องเชื่อมต่อการแชร์หน้าจออีกครั้งหลังจากที่เซสชันผู้ใช้เริ่มต้นหรือกลับมาทำงานอีกครั้ง)
Arjan

ดีจัง. ฉันชอบวิธีการแก้ปัญหาโดยไม่ต้องจำลองการกดแป้นพิมพ์ด้วยตนเอง
Sophie Alpert

2
ฉันสงสัยว่าใครรู้วิธีเริ่มเซสชันสำหรับคนอื่น ดังนั้นโดยไม่คำนึงถึงคำตอบข้างต้นเพียงแค่ใช้ Mac OS X ทุกวัน: ผู้ดูแลระบบสามารถลงชื่อเข้าใช้ในฐานะผู้ใช้รายอื่นโดยไม่ต้องรู้รหัสผ่านของผู้ใช้รายนั้นได้หรือไม่ (เช่นเดียวกับsuคำสั่งพรอมต์ แต่แล้วสำหรับช่วง GUI หรือเช่นเดียวกับเมื่อหน้าจอถูกล็อคที่ป้อนชื่อผู้ใช้และรหัสผ่านของผู้ดูแลระบบ. ดำเนินการต่อเซสชั่นการใช้งานอื่น ๆ .)
Arjan

บางทีมันเป็นไปไม่ได้ที่จะทำโดยไม่มีการกดปุ่ม AppleScript: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/ …
Sophie Alpert

1

ฉันได้ตรวจสอบเรื่องนี้เมื่อเร็ว ๆ นี้

วางสิ่งนี้ไว้ใน PAM ของแอปของคุณหรือทดสอบด้วย sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

นั่นจะเป็นการเพิ่มเซสชั่นกราฟิกให้คุณซึ่งอยู่ใกล้กับเซสชั่นผู้ใช้ที่ถูกสับเปลี่ยนไป โดยเฉพาะอย่างยิ่งมันอยู่ใน bootstrap namespace ที่ถูกต้องและมีพอร์ต bootstrap ที่ถูกต้อง (ฉันคิดว่า) คุณสามารถตรวจสอบแหล่งที่มาสำหรับสิ่งที่ pam_launchd ทำ กำลังใช้ไลบรารี่ส่วนตัวที่ดูสมเหตุสมผล (ฟังก์ชัน vproc_priv.h ใน libvprop) เพื่อเรียกรูทีนมัคสำหรับตั้งค่าพอร์ตและเนมสเปซ มันตรงกับเอกสารทั้งหมด (จำนวน จำกัด ) ที่ Apple เตรียมไว้ให้กับ syscalls ที่ได้จากมัค

ถัดไปคุณต้องตั้งค่ารหัสผู้ใช้การตรวจสอบของคุณให้เป็นของผู้ใช้ด้วย BSM API ไม่เช่นนั้นการเข้าสู่ระบบจะไม่พูดกับคุณใน Lion

เซสชั่นนั้นดูใกล้เคียงกับเซสชั่นที่ถูกสับเปลี่ยนตอนนี้หากคุณตรวจสอบ "launchctl blist" และกระบวนการและบริการบางอย่างจะกลับมามีชีวิตอีกครั้งอย่างดี (เช่นกระดาษแข็งและอื่น ๆ ) ในความเป็นจริงทุกอย่างยกเว้นตัวค้นหาและเข้าสู่ระบบหน้าต่างกำลังทำงาน จนกว่า loginwindow จะทำงานแม้ว่าคุณจะไม่สามารถเปิดใช้งานแอปพลิเคชันแบบกราฟิกได้และกระบวนการ loginwindow ต่อเซสชันนั้นจะถูกวางไข่ในฐานะที่เป็นลูกโดยตรงของโกลบอล หนึ่งจะกระตุ้นกระบวนการ loginwindow เพื่อเปิดตัว loginwindow ใหม่ในเซสชั่นสดได้อย่างไร ฉันหาวิธีเอาชิ้นสุดท้ายไม่ได้!

ความช่วยเหลือใด ๆ ในการตอบคำถามนี้ได้รับอย่างสุดซึ้ง


0

การรันคำสั่งด้วย sudo ช่วยให้คุณสามารถตั้งค่าสคริปต์ให้ไม่สามารถอ่านได้โดยผู้ใช้มาตรฐาน มันไม่สมบูรณ์แบบ แต่ถ้าผู้ใช้ผู้ดูแลระบบของคุณถูกบุกรุกอยู่แล้วเกมจะจบลงแล้ว!

chmod ur scriptname

สคริปต์ของฉันมีลักษณะเช่นนี้ทำงานได้จากระยะไกลเมื่อผู้ใช้รายหนึ่งกำลังทำงานอยู่เพื่อเปลี่ยนไปใช้ผู้ใช้คนที่สองผ่าน SSH (ทดสอบกับ Snow Leopard 10.6.3):

#!/bin/bash
#go to login window
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID 503

osascript -e 'tell app "System Events"
keystroke "password"
  delay 1.0
  keystroke return
end tell'

exit

0

ฉันต้องการบันทึกผู้ใช้คนเดียวกันในเวิร์กสเตชัน 25 แห่งเพื่อทำการอัปเดตซอฟต์แวร์ ฉันไม่สามารถเรียกใช้คำสั่ง 'osascript -e ... ' ได้อย่างน่าเชื่อถือจากเซสชัน SSH แม้จะมีสิทธิ์ sudo อย่างไรก็ตามฉันสามารถรันผ่าน Apple Remote Desktop ได้ หากคุณมีรพช.:

  1. เลือกเครื่องของคุณ
  2. ปลุกพวกเขาและออกจากผู้ใช้รายอื่นหากจำเป็น
  3. เลือก "ส่งคำสั่ง UNIX ... " จากเมนู "จัดการ"
  4. วางสคริปต์ของ Arjan (ไม่ต้องใส่คำว่า 'sudo') ลงในกล่องโต้ตอบคำสั่ง
  5. เลือกและป้อน "Run command as: ผู้ใช้: root"

ฉันรู้สึกยินดีที่พบว่าทั้ง 25 Mac Minis ใช้ Finder Finder เป็นผู้ใช้ภายในเวลาไม่ถึงนาที เพียงเพื่อย้ำอีกครั้งกับ ARD คุณไม่จำเป็นต้องพิมพ์รหัสผ่าน sudo บนเครื่องทุกเครื่อง บรรทัดที่คุณต้องการวางลงในกล่องโต้ตอบคำสั่งคือ (แทนชื่อผู้ใช้และรหัสผ่านที่ถูกต้อง):

osascript -e 'tell app "System Events"
  key code 125
  keystroke return using option down
  keystroke "the username"
  delay 1.0
  keystroke return
  delay 1.0
  keystroke "the password"
  delay 1.0
  keystroke return
end tell'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.