ป้องกันเครื่องไม่ให้ทำงานเมื่อการเชื่อมต่อ SSH เปิดอยู่


13

ฉันพยายามประหยัดพลังงานด้วยการสลับเดสก์ท็อปไปที่โหมด Suspend เมื่อไม่ได้ใช้งาน แต่เจ้าของเดสก์ท็อปจำนวนมากเข้าถึงได้ผ่าน SSH มีวิธีแก้ไขปัญหา wakeonlan เพื่อให้เจ้าของสามารถเปิดเครื่องได้ แต่ปัญหาคือเครื่องจะหยุดการทำงานอัตโนมัติอีกครั้งใน 10 นาทีแม้ว่าการเชื่อมต่อ SSH จะเปิดอยู่

สิ่งที่ฉันพยายามทำคือการรวมเซสชัน SSH ที่ใช้งานอยู่ในคำจำกัดความ "กิจกรรม"

คำถามนั้นสามารถทำได้ผ่านการตั้งค่ากฎ polkit? มันสามารถทำได้ผ่านการวางสคริปต์ที่ทำงานก่อนที่จะระงับจริงและยกเลิกถ้าพบเซสชัน SSH? ฉันต้องการวิธีที่ถูกต้องในการทำสิ่งนี้ ถ้าไม่เช่นนั้นวิธีแฮ็กก็ยินดีต้อนรับ

โซลูชันแฮ็คที่ไร้เดียงสาปัจจุบัน: แก้ไข/usr/sbin/pm-suspend:

#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
    echo "SSH session(s) are on. Not suspending."
    exit 1
fi

สิ่งนี้มีวัตถุประสงค์ แต่ฉันไม่รู้ว่าการอัปเดตจะเขียนทับไฟล์/usr/sbin/pm-suspendหรือไม่ ฉันยังไม่รู้ด้วยซ้ำว่าวิธีนี้จะทำงานกับการหยุดใช้งานชั่วคราวอื่น ๆ เช่น tuxonice ได้อย่างไร


2
ฉันขอแนะนำให้ใช้grep -cv :0แทนที่จะผ่านได้wcไหม
terdon

1
อีกแนวคิดสำหรับความสง่างามมากขึ้น: คุณสามารถยกเลิกคำขอร้องของ[ถ้าคุณเขียนif who | grep -qv :0; then(สมมติว่าคุณมี POSIX สอดคล้องgrepเช่น GNU grep)
David Foerster

คำตอบ:


19

จนกระทั่ง Ubuntu 14.10 (เริ่มต้นทันที)

ลองดูpm-action(8)และค้นหา/etc/pm/sleep.dในส่วน“ ไฟล์” หากหนึ่งในสคริปต์เหล่านี้กลับมาพร้อมกับสถานะออกที่ไม่เป็นศูนย์การระงับจะถูกป้องกัน

อัปเดตคำแนะนำเพื่อความชัดเจนแล้ว:

  1. /etc/pm/sleep.d/05_ssh_keepawakeดังนั้นสร้างไฟล์

  2. ใส่Shebang ( #!/bin/sh) และรหัสที่กล่าวถึงในคำถามในไฟล์นี้

  3. ตั้งค่าการอนุญาตให้ดำเนินการ:

    chmod +x /etc/pm/sleep.d/05_ssh_keepawake
    

ตั้งแต่ Ubuntu 15.04 (ขึ้นอยู่กับ systemd)

systemdไม่ได้ใช้pm-utilsเพื่อจัดการ hooks สถานะพลังงาน แต่มีโครงสร้างพื้นฐานของตัวเองไปยังจุดสิ้นสุดเดียวกัน ตัวตรวจสอบตัวยับยั้งการนอนหลับจะไม่ถูกเรียกใช้งานในโหมดสลีปอีกต่อไป แต่ต้องถูกตั้งค่าโดยการกระทำที่ยับยั้งการนอนหลับ (ดู1 )

เช่นนี้คุณจะต้องเพิ่มคำสั่งในการเข้าสู่ระบบเซสชัน SSH และออกจากระบบที่ลงทะเบียนตัวยับยั้งการนอนหลับด้วย systemd (เช่นผ่านsystemd-inhibit(1)) และเผยแพร่ตัวยับยั้ง หากใครบางคนรู้วิธีขอเข้าสู่การเข้าสู่ระบบและออกจากระบบ SSH ฉันยินดีรับความคิดเห็นหรือแก้ไขเพื่อให้เราสามารถดำเนินการตามขั้นตอนและคำสั่งที่เกี่ยวข้อง

หัวข้อต่อไปนี้ใช้งานได้ - ใช้งานเมื่อคุณรู้ว่าคุณกำลังทำอะไร!

คุณอาจจะสามารถเขียน systemd unit /etc/systemd/system/ssh-inhibt-sleep.serviceที่ทำให้ตัวมันเองพึ่งพาการsleep.targetใช้RequiredByตัวเลือก หากหน่วยใหม่ของคุณล้มเหลว (ด้วยสถานะทางออกที่ไม่เป็นศูนย์จากกระบวนการที่เรียกใช้) หน่วยจะดำเนินการsleep.targetและทำให้การดำเนินการสลีปตามมา

[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv :0'`

[Install]
RequiredBy=sleep.target

เช่นเคยคุณต้องเปิดใช้งาน systemd units เพื่อให้มีผล:

sudo systemctl enable ssh-inhibt-sleep.service

สำหรับข้อมูลเพิ่มเติมโปรดดูที่และsystemd.unit(5)systemd.service(5)


ดูเหมือนจะไม่ทำงานใน 18.04 นี่ไม่ใช่วิธีการแก้ปัญหาอีกต่อไปหรือไม่
Michael Jarret

1
@MichaelJarret: แน่นอน ฉันอัปเดตคำถามพร้อมข้อมูลเกี่ยวกับสถานการณ์ด้วย systemd
David Foerster

ฉันพบสิ่งต่อไปนี้ในขณะที่พยายามเรียงลำดับเมื่อวานนี้ แต่ไม่สามารถแก้ไขสคริปต์ก่อนหน้าเพื่อทำงานที่นี่ได้
Michael Jarret

ฉันไม่สามารถแก้ไขความคิดเห็นของฉัน แต่สิ่งนี้ดูเหมือนจะเกี่ยวข้อง
Michael Jarret

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