วิธีกำหนดค่า D-Bus และ SSH X-Forwarding เพื่อป้องกัน SSH ไม่ให้แขวนเมื่อออก


19

ฉันพยายามเรียกใช้แอปพลิเคชัน Gnome ต่างๆผ่าน X11 Forwarding และ SSH แอปพลิเคชั่นบางตัวจะทำให้แอปพลิเคชัน 'dbus-launch' ถูกวางก่อน ปัญหาคือการเปิดตัว dbus ไม่ปิดเมื่อออกจากแอปพลิเคชัน X ดังนั้นจึงต้องถูกฆ่าก่อนที่จะปิดเซสชัน SSH อย่างถูกต้อง

ฉันถือว่าปัญหาคือแอปพลิเคชั่น X / Gnome ไม่สามารถเชื่อมต่อกับ daemon บัสข้อความหลักและดังนั้นจึงต้องเปิดตัวสำเนาของตัวเอง? ฉันจะแก้ไขสิ่งนี้ได้อย่างไร หรือฉันหายไปอะไร

นี่คือตัวอย่าง ฉันเปิดใช้งานการส่งต่อ X11 ดูเหมือนว่าทั้งหมดจะทำงานได้ดี

[me@host ~]$ gnome-calculator &
[1] 4803

(ที่นี่โปรแกรม gcalctool เปิดตัวและจะปรากฏขึ้นเพื่อลบ X server ของฉัน (Xming))

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4803 pts/0    00:00:00 gnome-calculator
 4807 pts/0    00:00:00 dbus-launch
 4870 pts/0    00:00:00 ps

(ตอนนี้หลังจากปิดแอป gcalctool ในเซสชันระยะไกล)

[me@host ~]$ ps
  PID TTY          TIME CMD
 4706 pts/0    00:00:00 bash
 4807 pts/0    00:00:00 dbus-launch
 4898 pts/0    00:00:00 ps

โปรดทราบว่า dbus-launch ยังคงทำงานอยู่ และส่วนที่แย่ที่สุดก็คือการปิดการเชื่อมต่อ SSH อย่างถูกต้องจนกว่ามันจะถูกฆ่า

โปรดทราบว่า daemon ข้อความของระบบกำลังทำงานอยู่ดังที่เห็นได้ที่นี่:

[me@host ~]$ ps ax
 4696 ?     Ssl   0:00 dbus-daemon --system

สิ่งที่ฉันหายไปที่นี่? ฉันไม่เคยเห็นพฤติกรรมนี้มาก่อน ฉันเคยเห็นแอปพลิเคชั่นที่สามารถเชื่อมต่อกับ daemon บัสข้อความได้หรือไม่ ฉันค้นหา / etc / dbus-1 เพื่อหาคำตอบ แต่ไม่รู้ว่าจะหาอะไร

ขอบคุณล่วงหน้าสำหรับความช่วยเหลือ

[แก้ไข]

ตกลงฉันตระหนักว่าฉันกำลังประสบปัญหาทั่วไป ดูเหมือนว่านี่เป็นพฤติกรรมปกติ แต่ไม่มีวิธีแก้ปัญหาที่ดี ฉันกำลังประสบปัญหา SSH หยุดทำงานเนื่องจากการเปิดตัว dbus ยังคงทำงานอยู่ใน tty แต่ดูเหมือนจะไม่มีวิธีที่ดีในการทำให้ dbus-launch เกิดขึ้นอย่างเงียบ ๆ

การดูที่ /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh ให้เบาะแสเกี่ยวกับสิ่งที่ควรจะเกิดขึ้นกับเซสชัน X "ปกติ" แน่นอนว่านี่ไม่ทำงานเมื่อเรียกใช้แอปพลิเคชัน X ไปยังเซิร์ฟเวอร์ X ระยะไกล

เพื่อเป็นการแก้ปัญหาชั่วคราวฉันได้เพิ่มสิ่งนี้ลงใน. bash_logout ของฉัน:

# ~/.bash_logout
pkill -u $USER -t `tty | cut -d '/' -f 3,4` dbus-launch

สิ่งนี้จะช่วยให้การปิดเซสชัน SSH แต่รู้สึก kludgy มีวิธีแก้ปัญหาที่ดีกว่านี้อีกไหม? วิธีที่เหมาะสมในการใช้งานแอปพลิเคชั่น X11 ระยะไกลโดยไม่ต้องใช้ dbus เข้าทางคืออะไร?

คำตอบ:


15

ต่อ dbus-launch (1):

หากไม่ได้ตั้งค่า DBUS_SESSION_BUS_ADDRESS สำหรับกระบวนการที่พยายามใช้ D-Bus โดยค่าเริ่มต้นกระบวนการจะเรียกใช้ dbus-launch ด้วยตัวเลือก --autolaunch เพื่อเริ่มเซสชันบัสใหม่หรือค้นหาที่อยู่บัสที่มีอยู่บนจอ X หรือในไฟล์ใน ~ / .dbus / session-bus /

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

มีสาเหตุที่พบบ่อยสองประการสำหรับการเปิดใช้อัตโนมัติ หนึ่งคือ ssh ไปยังเครื่องระยะไกล

ดังนั้นจึงดูเหมือนว่ากลอุบายคือการเริ่มต้น dbus-daemon ไว้ล่วงหน้าในลักษณะที่โปรแกรมสามารถค้นหาได้ ฉันใช้:

[me@host ~]$ dbus-launch --exit-with-session gnome-terminal

ซึ่งนอกเหนือจากการ gnome-terminal, เริ่ม dbus-ภูตและชุด $ DBUS_SESSION_BUS_ADDRESS ภายใน gnome-ขั้ว

โปรแกรม X ใด ๆ ที่รันจาก gnome-terminal นั้นจะทำงานได้เป็นอย่างดีและ dbus-launch จะล้างข้อมูลหลังจากตัวมันเองเมื่อ gnome-terminal ออก


ฉันทำเครื่องหมายคำตอบนี้เป็นคำตอบฉันชอบคำตอบของคุณที่นี่ ขอขอบคุณ. การเรียกใช้ gnome-terminal ก่อนจากนั้นจึงเปิดโปรแกรมเพิ่มเติมจากดูเหมือนว่าจะแก้ไขปัญหาของฉันได้ นี่เป็นพฤติกรรมใหม่หรือไม่? ฉันดูเหมือนจำได้ว่าสามารถเปิดใช้ Windows ที่ส่งต่อ X จำนวนมากโดยไม่มีปัญหานี้ บางทีโปรแกรม Gnome ที่ใหม่กว่ากำลังใช้ Dbus อยู่ตอนนี้ดังนั้นฉันจึงยังไม่เห็นสิ่งนี้ใช่หรือไม่
taftster

2

ฉันสงสัยว่าปัญหาไม่ได้เกิดขึ้นเนื่องจากเซสชัน dbus ที่ไม่รู้จักหรือไม่เหมาะสม

แน่นอนเมื่อเปิดเซสชัน SSH จะไม่เปิดเซสชัน dbus บางโปรแกรมอาจเปิดใช้งานได้ แต่จากนั้นเซสชั่นไม่ทราบเกี่ยวกับมัน (จึงไม่สามารถปิดได้)

การไม่ทราบเกี่ยวกับเซสชัน dbus ยังหมายความว่าโปรแกรมที่ใช้ dbus แต่ไม่เปิดตัวเองจะมีปัญหา

ส่วน dbus ต่อเครื่องและต่อการแสดง X11 ข้อมูลของพวกเขาจะถูกเก็บไว้ใน $ HOME / .dbus / session-bus / - อย่างไรก็ตามกระบวนการที่อ้างถึงอาจถูกปิดดังนั้นจึงจำเป็นต้องมีการตรวจสอบเพิ่มเติมเพื่อพิจารณาว่าจำเป็นต้องมีการเปิดตัว dbus หรือไม่ จากนั้นตัวแปรจะต้องส่งออกไปยังเซสชัน

จากนั้นก็ใช้งานได้เหมือนมีเสน่ห์ :)

ฉันใส่สิ่งต่อไปนี้ในไฟล์. bash_profile ของฉัน:

# set dbus for remote SSH connections
if [ -n "$SSH_CLIENT" -a -n "$DISPLAY" ]; then
    machine_id=$(LANGUAGE=C hostnamectl|grep 'Machine ID:'| sed 's/^.*: //')
    x_display=$(echo $DISPLAY|sed 's/^.*:\([0-9]\+\)\(\.[0-9]\+\)*$/\1/')
    dbus_session_file="$HOME/.dbus/session-bus/${machine_id}-${x_display}"
    if [ -r "$dbus_session_file" ]; then
            export $(grep '^DBUS.*=' "$dbus_session_file")
            # check if PID still running, if not launch dbus
            ps $DBUS_SESSION_BUS_PID | tail -1 | grep dbus-daemon >& /dev/null
            [ "$?" != "0" ] && export $(dbus-launch) >& /dev/null
    else
            export $(dbus-launch) >& /dev/null
    fi
fi

หมายเหตุ: hostnamectl เป็นส่วนหนึ่งของ systemd และอนุญาตให้เรียกใช้เครื่องรหัสที่ dbus-launch แสดงตัวแปรที่เราต้องการ โดยการใช้export $(dbus-launch)เราดึงเอาท์พุทของ dbus-launch และส่งออกตัวแปร

ถ้าคุณต้องการที่จะทำใน sessio ที่ไม่ใช่แบบโต้ตอบ (เช่นเมื่อเรียกใช้คำสั่งจาก ssh) ลองวางไว้ใน. bashrc แทน (แต่ระวังว่า bashrc นั้นถูกเรียกใช้งานที่ EVEERY open shell)


1

ฉันมีปัญหาเดียวกันเมื่อพยายามเรียกใช้คำสั่งระยะไกล X และสร้างการออกจากเซสชันหลังจากเครื่องมือ X ออกจากแล้ว

ฉันก็เลยอยากวิ่ง

ssh -X user@remotehost "firefox -no-remote"

แต่ต้องใช้:

ssh -X user@remotehost 'export \`dbus-launch\`; dbus-launch firefox -no-remote; kill -TERM $DBUS_SESSION_BUS_PID'

หลังจากปิด Firefox นี้จะเป็นการปิดเซสชัน ssh

อัปเดต :

ดูเหมือนว่าจะปล่อยให้โหลดของกระบวนการ dbus-daemon ที่ทำงานบนเซิร์ฟเวอร์ดังนั้นจึงไม่เหมาะสมการเพิ่ม - ออกจากเซสชันกับบัญชีทั้งสองไม่ได้ช่วยเพราะสิ่งนี้จะเปลี่ยนพฤติกรรมเดิม

อัปเดต 2 : ใช้งานได้เมื่อฉันใช้เครื่องหมายคำพูดเดี่ยว (ตามที่แนะนำโดย @lobo) และเพิ่มkill -TERM $DBUS_SESSION_BUS_PIDเพื่อฆ่ากระบวนการ dbus-daemon ที่เหลือตามที่Holgr Jouklเสนอจากhttps://blog.dhampir.no/content/how- to-ป้องกัน -ssh-x-from-hanging-on-exit-when-dbus-is )


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