ฉันจะปิดเซิร์ฟเวอร์ Linux หลังจากทำงานเป็นเวลา 60 นาทีได้อย่างไร


18

ฉันมีเซิร์ฟเวอร์ที่ปกติแล้วจะปิดเพื่อเหตุผลด้านความปลอดภัย เมื่อฉันต้องการที่จะทำงานกับมันฉันเปิดเครื่องทำงานของฉันและปิดมันอีกครั้ง งานของฉันมักจะใช้เวลาไม่เกิน 15 นาที ฉันต้องการใช้กลไกเพื่อปิดเครื่องโดยอัตโนมัติหลังจาก 60 นาที

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

ฉันจะใช้งานสิ่งนี้ได้อย่างไร


4
ดูที่at(การดำเนินการเพียงครั้งเดียว)
dirkt

14
ฉันยังไม่ได้ทำสิ่งนี้ แต่สคริปต์การเข้าสู่ระบบของคุณสามารถเริ่มได้sudo shutdown -h +60ซึ่งจะเริ่มนับถอยหลัง 60 นาทีสำหรับกระบวนการปิด (-halt) หากคุณต้องการที่จะยกเลิกคุณสามารถsudo shutdown -c (นี้ไม่ได้ใช้ cron แม้ว่า)
guiverc

7
ขึ้นอยู่กับลักษณะของงานของคุณอาจจะคุ้มค่าที่จะใช้งานมันในคอนเทนเนอร์ของนักเทียบท่าดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับการปิดเซิร์ฟเวอร์ คอนเทนเนอร์ถูกสร้างขึ้นมันจะทำงานของคุณและมันจะถูกทำลายหลังจากนั้น
Vicente Olivert Riera

6
อย่าคาดหวังว่าจะได้รับประโยชน์ด้านความปลอดภัยที่แท้จริงจากสิ่งนี้ ช่องโหว่ส่วนใหญ่สามารถถูกโจมตีในเวลาน้อยกว่าหนึ่งวินาทีดังนั้นการปิดเครื่องหลังจากผ่านไปหนึ่งชั่วโมงจะไม่เป็นการป้องกันการถูกแสวงประโยชน์ และผู้โจมตีที่พบช่องโหว่สามารถรอให้คุณเปิดเครื่องเพื่อทำการโจมตี
kasperd

2
Re: @kasperd แสดงความคิดเห็นฉันจะใช้ถ้อยคำใหม่โดยบอกว่าคุณต้องการความปลอดภัยในปริมาณที่เท่ากันบนเซิร์ฟเวอร์ของคุณโดยไม่คำนึงว่าจะออนไลน์น้อยหรือมากเพียงใด หมายเหตุมันเป็นเซิร์ฟเวอร์ดังนั้นจึงเชื่อมต่อกับบางสิ่งบางอย่างและนั่นหมายความว่าบางสิ่งจะรู้เมื่อเปิดใช้งาน - การกวาดอัตโนมัติโดยอัตโนมัติไม่ใช่สิ่งที่คุณกังวลการเชื่อมต่อทุกชนิดและคุณไม่สามารถหลีกเลี่ยงความปลอดภัยสูงสุดได้ตลอดเวลา วิธีเดียว
StephenG

คำตอบ:


23

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

echo "sudo shutdown -P +60" >> ~/.profile

11
เวลาอยู่ในหน่วยนาทีไม่ใช่วินาที ลองshutdown -k -P 3600vs shutdown -k -P 60( -kพิมพ์ข้อความบนผนัง แต่ไม่มีเอฟเฟกต์อื่น ๆ )
sebasth

12
แต่ลองใช้คำสั่งเพียงครั้งเดียวก่อนคุณไม่ต้องการให้การปิดระบบทันทีไปยังโปรไฟล์ของคุณ!
Fabian Röling

17
ฉันจินตนาการว่าการเข้าสู่ระบบทุกครั้งจะทำให้มีการปิดการโทรใหม่ เคาน์เตอร์จะรีเซ็ตหรือไม่
JoL

4
อาจเป็นการดีที่จะกล่าวถึงว่าการเข้าสู่ระบบจะไม่ได้รับอนุญาตใน 5 นาทีที่ผ่านมาดังที่ได้กล่าวไว้ใน manpage การปิดระบบ
JoL

6
โปรดทราบว่า 60 นาทีหลังจากเข้าสู่ระบบไม่เหมือนกับ 60 นาทีหลังจากบูต ถ้าคุณบูทเครื่องแล้วลืมล็อกอิน?
Hagen von Eitzen

69

มีหลายตัวเลือก

  • ให้เวลาโดยตรงกับshutdown -P:

    shutdown -P +60
    

    โปรดทราบว่าshutdown หน้าคนยังชี้ให้เห็น:

    หากใช้อาร์กิวเมนต์เวลา 5 นาทีก่อนที่ระบบจะลงไฟล์ / run / nologin จะถูกสร้างขึ้นเพื่อให้แน่ใจว่าจะไม่อนุญาตให้มีการลงชื่อเข้าใช้เพิ่มเติม

  • ใช้atคำสั่ง

  • สร้างไฟล์หน่วย systemdหรือสคริปต์shutdown -P 60เริ่มต้นที่ทำงานเมื่อเริ่มต้น

  • ใช้ cron's @rebootเพื่อรันคำสั่งหลังจากบู๊ต

    เพิ่มไปที่ (root) crontab:

    @reboot shutdown -P +60
    

สำหรับสองวิธีสุดท้ายคุณสามารถใช้sleep 3600 && shutdown -P nowแทนการใช้อาร์กิวเมนต์เวลาshutdownเพื่อหน่วงเวลาการปิดระบบเป็นเวลา 60 นาที วิธีนี้เป็นไปได้ในการเข้าสู่ระบบในช่วงเวลาสุดท้ายก่อนที่จะปิดตัวลง


2
ฉันคิดว่าด้วยsleepคำสั่งคุณยังต้องระบุเวลาshutdown- เราต้องการใช้nowสำหรับอาร์กิวเมนต์นั้นถ้าเราทำการรออยู่แล้ว (แต่โปรดทราบว่าคุณจะไม่ได้รับคำเตือนมากนักในการบันทึกงานของคุณไว้ก่อนหน้านี้ หายไปจากใต้คุณ!)
Toby Speight

1
แม้ว่าจะใช้shutdown -P 60งานได้ไม่ใช่วิธีที่คำสั่งควรเรียกใช้ shutdown -P +60ตามหน้าคนที่คุณควรใช้ --- การปิดระบบโดยไม่มีการโต้แย้งเวลา (ในตัวอย่างsleep 3600 && shutdown -P) จะล่าช้าหนึ่งนาที (เช่นshutdown -P +1) ในฐานะที่เป็น Toby Speight shutdown -P nowเขียนคุณอาจจะต้องการที่จะใช้
pabouk

33

ลักษณะนี้เช่นปัญหา XY

งานของฉันมักจะใช้เวลาไม่เกิน 15 นาที ฉันต้องการใช้กลไกในการปิดเครื่องโดยอัตโนมัติหลังจาก 60 นาที

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

หากภารกิจไม่ใช่ภารกิจแบบโต้ตอบ แต่เป็นภารกิจแบบสคริปต์ที่ถูกทริกเกอร์จากเครื่องอื่นโดยอัตโนมัติ @sdkks ให้ทางออกที่ยอดเยี่ยมสำหรับสิ่งนั้น คุณควรมอบหมายให้เครื่องรัน poweroff ทันทีที่สคริปต์และงานทั้งหมดเสร็จสิ้น

อย่างไรก็ตามหากงานของคุณเป็นงานแบบโต้ตอบฉันขอแนะนำให้ทำการตรวจจับที่ไม่ได้ใช้งานแทน

หากคุณทำงานของคุณใน GUI (X11) คุณสามารถตรวจจับเซสชันว่างของ GUI โดยใช้วิธีที่อธิบายไว้ที่นี่: เรียกใช้คำสั่งเมื่อระบบไม่ได้ใช้งานและเมื่อใช้งานอีกครั้ง

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

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


2
นี่เป็นจุดสำคัญมาก ไม่ว่าคุณจะทำอะไรก็ตาม - คุณสนใจที่จะทำให้แน่ใจว่าคุณสามารถยกเลิกการปิดระบบได้
Shadow

1
มีบางอย่างผิดพลาดถ้ามันยังคงทำงานที่ 60m ดังนั้นอาจเพิ่งเริ่มต้นอีกครั้ง สิ่งนี้มีราคาแพงมากเมฆฉลาด ไม่แน่ใจว่าการปิดเครื่องในครั้งเดียวทำให้ฉันกลับมามากกว่า $ 4,000
mckenzm

8

แม้ว่าคำตอบก่อนหน้านี้ที่นี่ทั้งหมดตอบสนองความต้องการเพื่อความสมบูรณ์แบบคุณยังสามารถปิดเครื่องของคุณทันทีที่เสร็จงาน

bashสคริปต์สามารถเป็นtrapped, หมายถึงสัญญาณบางอย่างสามารถถูกดักและงานบางอย่างสามารถดำเนินการเมื่อจำเป็น EXITเป็นหนึ่งในสัญญาณที่สามารถดักจับได้

คุณจะสามารถ:

  1. ตั้งค่าtrapสำหรับEXITเชลล์สคริปต์อัตโนมัติของคุณหมายถึงการยกเลิกงานอัตโนมัติของคุณ
  2. ตั้งค่าtrapสำหรับ.bashrc EXITความหมายของคุณเมื่อใดก็ตามที่คุณออกจากระบบของเครื่องปิดเครื่อง

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

ตัวเลือก # 2 จะครอบคลุมกรณีที่คุณลืมที่จะออกจากเครื่องโดยไม่ต้องปิดเครื่อง มีข้อแม้ว่า; หากคุณมีเทอร์มินัลหลายเครื่องที่เปิดอยู่และคุณออกจากหนึ่งในนั้นมันจะยังคงปิดเครื่องเหมือนเดิมทั้งหมด (สามารถเขียนสคริปต์เพื่อหลีกเลี่ยงปัญหานี้ แต่ฉันจะไม่แก้ปัญหาให้ซับซ้อน)

cleanup(){
    # Do some tasks before terminating
    echo oh la la, cleaning is so nice
    echo "See you later, world"
    sudo poweroff & # finally shutdown
}
trap cleanup EXIT

นี่อาจเป็น.bashrcตัวเลือก # 2 ท้ายของสคริปต์สำหรับตัวเลือก # 1

ทำไมไม่ใช้poweroffตอนท้ายสคริปต์?

ฉันชอบที่จะใช้set -eo pipefailที่ด้านบนของสคริปต์ของฉัน หากมีข้อผิดพลาดเกิดขึ้นมันจะไม่ล้มเหลวในทันที มันจะหยุดดำเนินการคำสั่งเพิ่มเติม trapของEXITสัญญาณควรจะครอบคลุมกรณีที่สคริปต์ยุติก่อนกำหนดเนื่องจากข้อผิดพลาด

อย่างไรก็ตามสำหรับงานของคุณนี่อาจหมายความว่าเครื่องจะปิดก่อนที่จะเสร็จสมบูรณ์

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


เห็นด้วยและเพื่อให้แน่ใจว่าอาจเป็นเวลาของวันปิดจาก cron นี่คือเบรคของคนตาย
mckenzm

@Abigail สำหรับสคริปต์มันต้องเหนือกว่าเพราะ.bashrcฉันต้องการจุดต่ำสุดในกรณีที่มีสิ่งอื่นเขียนทับมัน ความกังวลของคุณไม่ชัดเจนคุณสามารถแบ่งปันตัวอย่างข้อมูลบน repl.it ได้ไหม
sdkks

@ mckenzm ฉันไม่เข้าใจ คุณสามารถแบ่งปันรหัสตัวอย่างหรือคำอธิบายเพิ่มเติมได้ไหม
sdkks

5

โดยละเอียดเกี่ยวกับความคิดเห็น @dirkt คุณสามารถแทรกatคำสั่งลงใน.bashrcหรือ.profileหรือไฟล์ใดก็ตามที่เชลล์ของคุณใช้ในการเข้าสู่ระบบเพื่อกำหนดเวลาการปิดเครื่องอัตโนมัติ 60 นาทีหลังจากเข้าสู่ระบบของคุณ

สิ่งที่ต้องการ:

at now + 60 minutes -f /sbin/halt

งานนี้อยู่ในatซอย คุณสามารถดูatงานใน/var/spool/
sdkks

5
ฉันอยากจะแนะนำให้ใช้atในบริบทนี้เพราะมันยังคงมีชีวิตเรียบ หาก OP ต้องเข้าสู่ระบบปิดเครื่องด้วยตนเองจากนั้นเข้าสู่ระบบอีกครั้งในช่วงเวลาหนึ่งชั่วโมงเขาจะถูกเตะออกก่อนชั่วโมงผ่านไปหลังจากเข้าสู่ระบบครั้งสุดท้ายของเขาเมื่อ proc ปิดที่กำหนดไว้ครั้งแรก
Aaron

@Aaron นั่นจริง ไม่คิดอย่างนั้น การคงอยู่ของ Boot เป็นข้อแม้สำหรับการแก้ปัญหานี้
sdkks

5

การทำงานต่อไปนี้commandมีพารามิเตอร์และหากทำสำเร็จจะปิดกล่องทันทีสมมติว่าผู้ใช้สามารถทำงานpoweroffได้ sudo poweroffมันอาจต้องใช้

command --parameters && poweroff

ในขณะที่หนึ่งต่อไปนี้จะทำงานpoweroffทันทีเมื่อคำสั่งยุติ:

command --parameters ; poweroff

หากคุณคิดว่าคำสั่งต้องการเวลาพักผ่อนหลังจากเสร็จสิ้นให้เรียกใช้

command --parameters ; sleep 3600 ; poweroff

หากคุณคิดว่าคำสั่งอาจทำงานล่วงเวลาคุณสามารถ จำกัด เวลาไว้ได้หนึ่งชั่วโมง:

timeout 1h command --parameters ; poweroff

timeoutเป็นส่วนหนึ่งของcoreutilsแพ็คเกจดังนั้นคุณอาจมีอยู่แล้ว


3

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


2
ระบบไฟล์เสียหาย?
Xen2050

@ Xen2050 ไม่ใช่ปัญหากับระบบไฟล์ที่ทันสมัย ​​(การทำเจอร์นัล)
Tom

1
@Tom คุณมีแหล่งที่มาสำหรับ umounts บังคับจะไม่ทำให้เกิดความเสียหายของระบบไฟล์หากมีการ journaling? ฟังดูใหม่สำหรับฉันฉันต้องการอ่านมัน อย่างน้อยที่สุดมันจะต้องทำเครื่องหมายระบบไฟล์ว่าสกปรกบังคับ fsck ใช่ไหม?
Xen2050

1
ในกรณีส่วนใหญ่มันควรเล่นซ้ำบันทึกและทำกับมัน Powerdown ไม่ควรทำให้ระบบไฟล์เกิดความเสียหายบนระบบไฟล์ที่เจอร์นัลแม้ว่าจะไม่มีการรับประกันเว้นแต่คุณจะใช้ระบบไฟล์เช่น ZFS ซึ่งออกแบบมาสำหรับกรณีนี้โดยเฉพาะ
Tom

1
การเล่นซ้ำในวารสารอาจล้มเหลว - ฉันมีเซสชัน fsck ที่ยากมากสองสามสัปดาห์ที่ผ่านมาหลังจากการตัดไฟ second วินาทีไปยังเครื่องที่ไม่มี UPS นั่นคือการใช้ ext4 กับวารสาร มันไม่ได้อยู่ยงคงกระพันอย่างสมบูรณ์!
Toby Speight

2

หากคุณอยู่ในsystemdเครื่องคุณสามารถใช้ตัวจับเวลาแบบโมโนโทนิกได้

หน่วยจับเวลา /etc/systemd/system/shutdown_after_an_hour.timer

[Unit]
Description=shutdown after an hour

[Timer]
OnBootSec=1h

[Install]
WantedBy=timers.target

หน่วยจับเวลา/etc/systemd/system/shutdown_after_an_hour.service:

[Unit]
Description=shutdown after an hour

[Service]
ExecStart=/sbin/poweroff --force --no-wall
Type=oneshot

มันเปิดใช้งานผ่าน

# systemctl enable shutdown_after_an_hour.timer

สถานะของมัน (โดยเฉพาะเวลาที่เหลือก่อนปิดเครื่อง) จะมีให้ผ่าน

# systemctl list-timers shutdown_after_an_hour.timer

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


1

ลองใส่สคริปต์ ( sudo shutdown -P 3600) ใน/etc/init.dไดเรกทอรีเพื่อเรียกใช้โดยอัตโนมัติเมื่อเริ่มต้น

หรือลองใช้โดยanacronเพิ่มคำสั่งใน/etc/anacrontabไฟล์ ฉันยังแนะนำให้ใช้nohupด้านหน้าคำสั่งเพื่อให้แน่ใจว่าคำสั่งยังคงทำงานหลังจากออกจากระบบ


1
ขึ้นอยู่กับ distro มันอาจไม่ถูกดำเนินการโดยเพิ่งอยู่ใน init.d
sdkks

@sdkks คุณพูดถูก Anacron สามารถพิจารณาได้เช่นกัน วางสคริปต์ใน / etc / anacrontab ใช้กับ 'nohup' ในกรณีที่ออกจากระบบ
Saveriofr

1
@Saveriofr คุณสามารถแก้ไขคำตอบของคุณเพื่อปรับปรุงคุณภาพ (ดีกว่าการโพสต์ข้อมูลเพิ่มเติมเป็นความคิดเห็น)
Anthony G - ความยุติธรรมสำหรับโมนิก้า

1

ใช้ประโยชน์จากแฟ้มล็อกเอาต์ของเชลล์

หากคุณต้องการเซิร์ฟเวอร์สำหรับงานแบบโต้ตอบหรือแบบไม่โต้ตอบที่เริ่มต้นโดย UID ของคุณให้ลองวางคำสั่งปิดเครื่องลงในไฟล์~ / .bash_logout ของคุณ คู่มือ GNU ทุบตีพูดว่า:

เมื่อเชลล์ล็อกอินแบบโต้ตอบออกหรือเชลล์ล็อกอินที่ไม่ใช่แบบโต้ตอบเรียกใช้งานคำสั่ง exit builtin Bash จะอ่านและดำเนินการคำสั่งจากไฟล์ ~ / .bash_logout หากมีอยู่

ดังนั้นการเพิ่ม "sudo poweroff" หรือคล้ายกับไฟล์ออกจากระบบของคุณจะปิดเซิร์ฟเวอร์ทันทีที่คุณออกจากระบบexitของเซสชั่นปัจจุบันของคุณหรือเมื่อไม่โต้ตอบทุบตีสายเซสชั่น คุณสามารถเลือกที่จะใช้เวลาหรือผ่านการหน่วงเวลาเพื่อปิดหากคุณต้องการเลื่อนการปิด

สำหรับวิธีการโต้ตอบเพิ่มเติมเกี่ยวกับสิ่งนี้คุณอาจใส่ Bashisms ต่อไปนี้ในไฟล์ล็อกเอาต์ของคุณ:

# Shutdown unless N or n is pressed within 30 seconds.
shopt -s nocasematch
read -t 30 -N 1 -p 'Shutdown now? (Y/n) '
[[ "$REPLY" =~ n ]] || sudo poweroff

คำเตือน

มีข้อควรระวังบางประการที่คุณควรคำนึงถึงเกี่ยวกับโซลูชันนี้:

  • สิ่งนี้อาจทำงานได้แม้อยู่ภายใต้เทอร์มินัลที่เริ่มต้นโดย X Windows แต่อาจไม่สามารถใช้งานกับเซสชัน X11 ที่ไม่ได้เปิดตัวโดยstartxหรือที่คล้ายกัน
  • หากคุณมีสคริปต์ที่ไม่โต้ตอบที่เรียกexitคุณอาจพบการปิดที่คุณไม่คาดหวัง
  • ไฟล์ sudoers ของคุณอาจถามรหัสผ่านหากคุณไม่ได้ระบุNOPASSWDคำสั่งปิดระบบหรือหากคุณไม่ได้โทรsudo -vมาก่อนใช้คำสั่งปิดเครื่อง
  • อาจมีกรณีขอบอื่น ๆ ที่ฉันยังไม่ได้คิด

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

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