ฉันจะรับคำสั่ง sudo เพื่อใช้การตั้งค่าใน /root/.bashrc ได้อย่างไร


9

ฉันได้ปรับแต่ง.bashrcด้วยชื่อแทนจำนวนหนึ่งโดยเฉพาะllและexport LS_OPTIONS='--color=auto'

น่าเสียดายที่นี่ใช้งานไม่ได้เมื่อใช้งานด้วยsudoดังนั้นฉันจึงปรับเปลี่ยน/root/.bashrcเช่นกัน แต่ดูเหมือนว่าจะไม่ทำให้เกิดความแตกต่าง

sudo envการแสดงHOME=/rootและSHELL=/bin/bash

ฉันจะsudoรับคำสั่งให้ใช้การตั้งค่าได้/root/.bashrcอย่างไร?

ฉันเข้าใจว่าสิ่งนี้จะเกิดขึ้นก็ต่อเมื่อbashดำเนินการแบบโต้ตอบเท่านั้นดังนั้นฉันจึงเปิดรับข้อเสนอแนะอื่น ๆ เกี่ยวกับวิธีปรับแต่ง


@ daniel-ก่อเจล - ฉันรู้สึกเสมอเช่น Q ปัญหานี้เป็นปัญหา XY - การmeta.stackexchange.com/questions/66377/what-is-the-xy-problem ชื่อหมายถึงพวกเขาต้องการอะไรจาก/root/.bashrcแต่จริงๆสิ่งที่ถามคือหลังจากที่เป็นชื่อแทนจากไฟล์นี้ - นี้เป็นไปไม่ได้ต่อนี้ - unix.stackexchange.com/questions/1496/...
slm

@slm สิ่งที่ฉันหลังจากที่มีการเพิ่มวิธีการ bashrc - เท่าที่ฉันเคยทำในไฟล์ .bashrc ส่วนตัวของฉันเช่นเดียวกับไฟล์ .bashrc สำหรับราก "ปิดที่" -rตัวเลือกสำหรับการ:crontab crontab () { [[ $@ =~ -[iel]*r ]] && echo '"r" not allowed' || command crontab "$@" ;}มันใช้งานได้เมื่อเข้าสู่ระบบในฐานะผู้ใช้อย่างใดอย่างหนึ่ง แต่เมื่อฉันรันsudo crontab -rก็ยังคงดำเนินการ
Daniel Gelling

@DanielGelling - ดูว่าคำตอบของฉันเหมาะกับคุณหรือไม่
slm

คำตอบ:


6

sudoรันไฟล์เรียกทำงานไม่ใช่คำสั่งเชลล์ ดังนั้นจึงไม่ทราบชื่อแทน หากคุณทำงานsudo lsที่ชอบsudo /bin/lsก็ไม่ได้ใช้lsนามแฝงว่าคุณอาจมี

คุณสามารถsudo lsขยายชื่อแทนได้โดยใส่สิ่งต่อไปนี้ใน.bashrc:

alias sudo='sudo '

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

นอกจากนี้ sudo ยังลบตัวแปรส่วนใหญ่ออกจากสภาพแวดล้อม นี้จะไม่ส่งผลกระทบต่อนามแฝงเช่นalias ls='ls $LS_OPTIONS'เนื่องจากว่าเป็นตัวแปรเปลือกที่ใช้โดยเปลือกในขณะที่มันขยายคำสั่ง (และการส่งออกได้จาก.bashrcจุดมุ่งหมายไม่ได้) LS_COLORSแต่มันจะส่งผลกระทบต่อตัวแปรที่ใช้โดยคำสั่งเช่น คุณสามารถกำหนดค่า sudo เพื่อให้ตัวแปรสภาพแวดล้อมบางอย่างโดยแก้ไขการกำหนดค่าของ: เรียกใช้visudoและเพิ่มบรรทัด

Defaults env_keep += "LS_COLORS"

ด้วยการตั้งค่าเหล่านี้sudo llจะให้สีที่คุณคุ้นเคย

sudo -sหรือคุณสามารถเรียกใช้เปลือกรากด้วย เชลล์นี้จะโหลดไฟล์กำหนดค่า ( ~/.bashrcสำหรับ bash) ขึ้นอยู่กับว่า sudo มีการกำหนดค่านี้อาจให้ชุดไปยังไดเรกทอรีบ้านของคุณหรือเปลี่ยนไปHOME /rootคุณสามารถบังคับไดเรกทอรีบ้านที่จะตั้งรากกับsudo -Hs; sudo env HOME="$HOME" bashตรงกันข้ามเพื่อให้ไดเรกทอรีบ้านเดิมเรียก


3

ขอขอบคุณผู้ที่ตอบว่าให้ฉันอ่านman sudoอย่างละเอียดมากขึ้น

sudo -s หากไม่ได้ระบุคำสั่งเชลล์เชิงโต้ตอบจะถูกดำเนินการ

เชลล์แบบโต้ตอบนี้ใช้/root/.bashrcและรวมถึงการปรับแต่งของฉัน

มันไม่จำเป็นต้องป้อนคำสั่งแยกต่างหาก แต่ก็โอเค


2

พื้นหลัง

ฉันรู้สึกเสมอเช่นคำถามนี้เป็นปัญหา XY ชื่อเรื่องบอกเป็นนัยว่าพวกเขาต้องการอะไรก็ตาม/root/.bashrcแต่จริงๆแล้วคำถามก็คือชื่อแทนจากไฟล์นี้ - เชื่อกันอย่างกว้างขวางว่าเป็นไปไม่ได้สำหรับเรื่องนี้ - ทำไมสคริปต์ Bash ของฉันไม่รู้จักชื่อแทน? .

โดยพื้นฐานแล้วการออกแบบที่นามแฝงของคุณจะไม่ถูกหยิบขึ้นมาsudoและในที่อื่น ๆ เพราะมันไม่ได้พกพาได้และนี่ก็เป็นความเห็นของฉันที่มีต่อพวกเขาเช่นกัน

สิ่งใดก็ตามที่อยู่ในสภาพแวดล้อมของผู้ใช้ไม่ควรสันนิษฐานโดยสคริปต์และซอฟต์แวร์ใด ๆ ที่อาจทำงานในกล่องที่กำหนด แต่ฉันรู้ว่ามีสถานการณ์ที่อาจมีชื่อแทนบางอย่างในบัญชีผู้ใช้$HOME/.bashrcที่ระบุว่าคนอื่น ๆ อาจต้องการใช้ประโยชน์ในสถานการณ์แบบโต้ตอบ

sudoไปสิ้นสุดที่คุณก็สามารถบอกล่ามทุบตีเพื่อขยายนามแฝงที่พบในช่วงนอกกระบวนการเข้าสู่ระบบของพฤติกรรมเปลือกปกติที่คุณเมื่อใช้งาน

ตัวอย่าง

ติดตั้ง

ในการตั้งค่าฉันได้เพิ่มนามแฝงต่อไปนี้ตัวแปรสภาพแวดล้อมและฟังก์ชั่นให้กับผู้ใช้รูท/root/.bashrcและ/root/.bash_profileไฟล์ของฉัน

$ grep smurf ~/.bashrc
alias brc_smurf='echo "ran alias from /root/.bashrc"'
export brc_smurf_env='var from /root/.bashrc'
bpf_smurf_func() { echo 'ran func from /root/.bash_profile'; }

$ grep smurf ~/.bash_profile
alias bpf_smurf='echo "ran alias from /root/.bash_profile"'
export bpf_smurf_env='var from /root/.bash_profile'
brc_smurf_func() { echo 'ran func from /root/.bashrc'; }

โดยไม่ต้องทำอะไรไม่ได้ผลงานเหล่านี้ (ไม่น่าประหลาดใจ):

$ sudo brc_smurf
sudo: brc_smurf: command not found

$ sudo bpf_smurf
sudo: bpf_smurf: command not found

เราเห็นว่าaliasคำสั่งไม่แสดงชื่อแทนเมื่อทำงานในsudo:

$ sudo alias
$

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

ขั้นตอนที่ 1 - นามแฝงที่มองเห็นได้

ถ้าเราวิ่งbash -ciเราสามารถชักจูงให้ Bash อ่านอย่างน้อยของเรา$HOME/.bashrc:

$ sudo bash -ci 'alias' | grep smurf
alias brc_smurf='echo "ran alias from /root/.bashrc"'

เยี่ยมเลยบางทีเราสามารถเรียกใช้

$ sudo bash -ci 'alias; brc_smurf'
bash: alias; brc_smurf: No such file or directory

ขั้นตอนที่ 2 - shopt -s expand_aliases

Nope อีกครั้งโดยการออกแบบเรากำลังทำสิ่งที่เราไม่ควรจะทำดังนั้นจึงมี "ตู้นิรภัย" จำนวนหนึ่งที่เราต้องปิดการใช้งาน "ความปลอดภัย" อื่น ๆ คือ Bash

$ sudo bash -ci 'shopt -s expand_aliases; alias; brc_smurf'
alias brc_smurf='echo "ran alias from /root/.bashrc"'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
ran alias from /root/.bashrc

ที่นี่เราสามารถเห็นข้อความของเราจาก/root/.bashrcเราได้ดำเนินการนามแฝงของผู้ใช้รูทbrc_smurfเรียบร้อยแล้ว

ขั้นตอนที่ # 3 - สิ่งที่เกี่ยวกับ env vars?

หากคุณใช้วิธีการที่แสดงด้านบนสิ่งเหล่านี้ควรจะใช้ได้เช่นกัน

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env'
ran alias from /root/.bashrc
var from /root/.bashrc

ขั้นตอนที่ # 4 - สิ่งที่เกี่ยวกับฟังก์ชั่น?

ใช้งานได้ตามที่คาดไว้:

$ sudo bash -ci 'shopt -s expand_aliases; brc_smurf; echo $brc_smurf_env;brc_smurf_func'
ran alias from /root/.bashrc
var from /root/.bashrc
ran func from /root/.bashrc

TLDR;

คุณสามารถทำได้เพื่อเข้าถึงตัวแปรสภาพแวดล้อม + นามแฝงจาก/root/.bashrc:

$ sudo bash -ci 'shopt -s expand_aliases; <cmds>'

ใช้สิ่งที่ได้

วิธีการนี้จะช่วยให้เนื้อหาของมันไม่ได้รับเนื้อหาของ/root/.bashrc/root/.bash_profile

อ้างอิง


ใช่แม้ว่าจะมีความแตกต่างกันเล็กน้อยระหว่างกัน แต่อย่าไปลงรายละเอียดที่นี่ ;-) อย่างไรก็ตามคุณสามารถช่วยฉันด้วยสถานการณ์ที่ฉันระบุไว้ในความคิดเห็นของคำถาม: การใช้ฟังก์ชั่นใน.bashrcกับ sudo; โดยเฉพาะการเอา-rตัวเลือกจากcrontab?
Daniel Gelling

โอเค แต่นี่หมายความว่าฉันต้องวิ่ง: sudo bash -ci 'alias; shopt -s expand_aliases; echo $brc_smurf_env'แทนที่จะเป็นแบบง่าย ๆsudo echo $brc_smurf_envเหรอ?
Daniel Gelling

คุณสามารถลบสิ่งนั้นออกมาaliasเพื่อแสดงให้เห็นว่าคุณต้องทำsudo bash -ci 'shopt -s expand_aliases; <cmds>'
slm

นั่นจะเป็นการพิมพ์จำนวนมากเพียงเพื่อแก้ไข crontab ของฉันสำหรับรูต ขอผมสร้างนามแฝงแทน :-P
Daniel Gelling

@DanielGelling - yup ยินดีต้อนรับสู่ความสนุกทั้งหมดลงไปในลำไส้
slm

0

มีการตั้งค่ามากมายในไฟล์ / etc / sudoers โดยเฉพาะหรือการตั้งค่าสภาพแวดล้อมเมื่อคำสั่ง sudo รัน (เช่นต้องแน่ใจว่า PATH นั้นมีที่ตั้งที่เชื่อถือได้เท่านั้น) แต่ขึ้นอยู่กับสิ่งที่คุณคาดหวังจากสิ่งนี้ คุณอาจไม่สามารถทำสิ่งที่คุณต้องการได้หากมันเกี่ยวข้องกับการรันคำสั่งจริงในเชลล์เพื่อตั้งค่าสภาพแวดล้อม Sudoing ไม่ได้ให้เชลล์ล็อกอินรูทให้คุณดังนั้นมันจะไม่ตั้งโปรไฟล์ปกติให้คุณ


0

ให้บอกว่าเราแก้ไข /root/.bashrc เป็น:

$ sudo su -
Password: ******
# cat ~/.bashrc

echo "root bashrc file was read"
PATH=~/bin:$PATH
echo "$PATH"
export USERVAR=set
echo "$USERVAR"

umask 022
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

ให้ออกจากระบบและเข้าสู่ระบบอีกครั้งเพื่อให้ทุบตีอ่านไฟล์:

# exit
$ sudo su -
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@here:~# alias l
alias l='ls $LS_OPTIONS -lA'
root@here:~# 

อย่างที่คุณเห็นไฟล์ถูกอ่าน PATH ถูกเปลี่ยนและตั้งชื่อแทนแล้ว ทั้งหมดทำงานตามที่คุณร้องขอ

อย่างไรก็ตาม sudo ยังคงไม่ทำงานตามที่คุณคาดหวัง

root@here:~# exit
$ sudo env | grep USERVAR              # no output 
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

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

ดังนั้นเพียงเข้าสู่ระบบ.bashrcไฟล์จะถูกโหลดอัตโนมัติและทำงานได้

คุณอาจเริ่มทุบตีเช่นนี้

$ sudo bash
root bashrc file was read
/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set
root@mail:/home/isaac/me/temp/clocks-master#

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

$ sudo su -

หากคำสั่งนั้นยาวเกินไปที่จะพิมพ์ให้สร้างนามแฝงหรือฟังก์ชั่นในผู้ใช้ (ไม่ใช่รูท) โดยที่คำสั่งนั้นจะถูกใช้สิ่งที่ต้องการ:

$ alias mysu='sudo su -'
$ mysu
# 

0

TL; DR: คุณสามารถใช้sudo -iเพื่อเรียกใช้ฟังก์ชันที่กำหนดไว้/root/.bashrc(แต่ไม่ใช่นามแฝง) และมีการเข้าถึงตัวแปรที่ส่งออกจากไฟล์นั้น:

อาร์กิวเมนต์คำสั่ง sudo -i 

นามแฝงไม่ได้ทำงานที่นั่นว่า sudo -iแต่คุณสามารถแปลงให้เป็นฟังก์ชั่นหากคุณต้องการที่จะทำให้พวกเขามีให้

อ่านต่อไปเพื่อการวิเคราะห์ที่สมบูรณ์และรายละเอียดเพิ่มเติม


มีปัญหาเล็กน้อยที่นี่บางอย่างเกี่ยวกับวิธีการทำงานของ sudo และบางวิธีในการทุบตีทำงาน ...

ตามค่าเริ่มต้นsudoจะค้นหาเฉพาะคำสั่งและจะข้ามเชลล์ดังนั้นการเรียกใช้sudo llจะใช้งานได้ก็ต่อเมื่อมีllไฟล์ปฏิบัติการในไดเรกทอรีใดไดเรกทอรี$PATHหนึ่ง ดังนั้นเพื่อที่จะใช้นามแฝง (หรือฟังก์ชั่น) คุณจะต้องตรวจสอบให้แน่ใจว่าเชลล์ถูกเรียกใช้เป็นส่วนหนึ่งของกระบวนการ

วิธีหนึ่งที่จะใช้งานบางอย่างเช่นsudo shหรือsudo bashทันสมัยsudo(ฉันกำลังทดสอบนี้ใน sudo 1.8.19p1) มีตัวเลือก-sและ-iเพื่อจุดประสงค์นั้น

ดังนั้นหนึ่งลองจะเป็นสิ่งที่ชอบsudo -s ll(ซึ่งเทียบเท่ากับsudo bash -c 'll'สมมติว่าคุณ$SHELLเป็นทุบตีซึ่งดูเหมือนจะเป็นกรณีตามที่rcfileคุณกล่าวถึง) แต่นั่นก็ไม่ได้ผลเช่นกันเพราะมันเริ่มเปลือกในแบบไม่โต้ตอบ โหมดที่ไม่ใช่การเข้าสู่ระบบซึ่งไม่ได้อ่านไฟล์เริ่มต้นใด ๆ มันเหมือนกับว่าคุณเขียนเชลล์สคริปและใช้#!/bin/bashเพื่อรันมัน นามแฝง (และฟังก์ชั่น) ที่คุณมีในตัวคุณ~/.bashrcจะไม่สามารถเข้าถึงได้จากสคริปต์นั้น ...

ดังนั้นถัดไปคือ-iตัวเลือกซึ่งสร้างเชลล์การเข้าสู่ระบบ มันมีแนวโน้มมากกว่าเพราะมันจะอ่านไฟล์เริ่มต้นของคุณ! และยังsudo -i ll(เทียบเท่าsudo bash -l -c 'll') จะยังไม่ทำงาน ดังนั้นเป็นไปได้อย่างไรเพราะมันได้อ่านคำจำกัดความของllนามแฝง?

คำอธิบายต่อไปของที่นี่คือโดยค่าเริ่มต้นแล้วทุบตีจะไม่ขยายนามแฝงยกเว้นเมื่อเปลือกเป็นแบบโต้ตอบ ... เปลือกนี้เริ่มต้นด้วยsudo -i(หรือbash -l) เป็นเปลือกเข้าสู่ระบบแต่ยังไม่โต้ตอบ

ดังนั้นขั้นตอนต่อไปคือการได้รับshell แบบโต้ตอบซึ่งใช้งานได้ :

sudo bash -i -c 'll'

(การมีทั้งล็อกอินและอินเทอร์แอคทีฟก็bash -l -i -c ...ใช้ได้เช่นกัน)

อีกทางเลือกหนึ่งคือการใช้งานเชลล์การเข้าสู่ระบบ (ไม่ใช่แบบโต้ตอบ) แต่ขอให้ขยายนามแฝงอย่างชัดเจนดังนั้นสิ่งนี้จะได้ผล:

sudo bash -l -O expand_aliases -c 'll'

(กรณีที่ bash เป็นแบบอินเทอร์แอคทีฟไม่จำเป็นต้องมีเชลล์การเข้าสู่ระบบเนื่องจากนั่นเพียงพอที่จะอ่านไฟล์การกำหนดค่าเริ่มต้นได้ แต่สิ่งนี้จำเป็นต้อง-lอ่านไฟล์เหล่านั้น)

นี่เป็นบรรทัดคำสั่งที่ค่อนข้างยาว ... และพวกเขายังต้องการให้คุณอ้างอิงคำสั่งเชลล์ทั้งหมดดังนั้นหากคุณกำลังเรียกนามแฝงที่มีข้อโต้แย้งคุณจะต้องเปลี่ยนสิ่งนั้นให้เป็นสตริง ... ดังนั้นมันจึงเป็น เงอะงะที่จะใช้ ...

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

ดังนั้นหากคุณกำหนดllเป็นฟังก์ชั่นแทนนามแฝงคุณจะสามารถใช้งานได้โดยตรงด้วย-iทางลัดของ sudo :

sudo -i ll

และถ้าคุณมีบรรทัดคำสั่งที่ยาวกว่าพร้อมด้วยอาร์กิวเมนต์คุณสามารถส่งต่อได้โดยตรงที่นี่เช่นกัน:

sudo -i ll -C -R /etc

(เปรียบเทียบกับsudo bash -i -c 'll -C -R /etc'.)

ฟังก์ชั่นยังมีความยืดหยุ่นมากกว่าและง่ายต่อการบำรุงรักษา ... โดยทั่วไปแล้วมันง่ายที่จะเปลี่ยนนามแฝงเป็นฟังก์ชั่นคำเตือนเพียงอย่างเดียวก็คือใช้ใน"$@"ที่ที่คุณคาดหวังว่าจะมีการโต้แย้งพิเศษเพิ่มเติม นามแฝง.)

ตัวอย่างเช่นนามแฝงนี้:

alias ll='ls $LS_OPTIONS -l'

สามารถเปลี่ยนเป็นฟังก์ชั่นนี้ได้:

ll () {
    ls $LS_OPTIONS -l "$@"
}

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

ฉันหวังว่าคุณจะพบคำตอบและคำอธิบายนี้เป็นประโยชน์!


DV - ฉันไม่รู้สึกว่านี่เป็นการปรับปรุงสถานการณ์อีกต่อไปมากกว่าสิ่งที่มีอยู่แล้วที่นี่
slm

1
@slm ฉันคิดว่าคำตอบของฉันเพิ่มบางอย่างเนื่องจากไม่มีคำตอบก่อนหน้านี้ที่กล่าวถึงแบบฟอร์มsudo -i command argumentsเพื่อให้สามารถเรียกใช้ฟังก์ชันจาก/root/.bashrcและมีตัวแปรที่ส่งออกได้ แต่ฉันเห็นว่าคำตอบของฉันอาจยาวเกินไปและข้อมูลนั้นถูกฝังอยู่ในนั้น ... ฉันจึงเพิ่ม TL; DR เพื่อสรุปมัน
filbranden
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.