ความสามารถในการพกพาแบบโลแคล UTF-8 (และ ssh)


9

ฉันใช้เวลาส่วนใหญ่sshกับเครื่องต่าง ๆ ซึ่งทั้งหมดนี้แตกต่างกันไป (บางอันฝังอยู่ใช้งานกับ Linux บางตัวใช้งาน BSD และ c) บนเครื่องของฉันเองฉันใช้ OS X ซึ่งแน่นอนว่ามี userland ที่ใช้ BSD ภาษาของฉันบนเครื่องเหล่านั้นถูกตั้งค่าเป็น en_GB.UTF-8 ซึ่งเป็นหนึ่งในตัวเลือกที่ใช้ได้:

% echo `sw_vers`
ProductName: Mac OS X ProductVersion: 10.8.2 BuildVersion: 12C60
% locale -a | grep -i 'en_gb.utf'
en_GB.UTF-8

ระบบ Linux ที่มีความสามารถมากกว่าที่ฉันใช้ดูเหมือนจะมีตัวเลือกที่เทียบเท่า แต่ฉันทราบว่าบน Linux ชื่อนั้นแตกต่างกันเล็กน้อย:

% lsb_release -d
Description: Debian GNU/Linux 6.0.3 (squeeze)
% locale -a | grep -i 'en_gb.utf' 
en_GB.utf8

นี่ทำให้ฉันประหลาดใจ: เมื่อฉันsshเข้าสู่เครื่อง Linux จาก Mac ของฉันและส่งต่อLC_*ตัวแปรทั้งหมดของฉันด้วยคำต่อท้าย 'UTF-8' เครื่อง Linux นั้นเข้าใจสิ่งที่ถูกถามหรือไม่ หรือเป็นเพียงแค่การย้อนกลับไปยังสถานที่อื่น ๆ ?

แก้ไข:นี่คือตัวอย่างของสิ่งที่ฉันหมายถึง:

% ssh -v odin
...
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LC_ALL = en_GB.UTF-8
debug1: Sending env LC_COLLATE = en_GB.UTF-8
debug1: Sending env LC_CTYPE = en_GB.UTF-8
debug1: Sending env LC_MESSAGES = en_GB.UTF-8
debug1: Sending env LC_MONETARY = en_GB.UTF-8
debug1: Sending env LC_NUMERIC = en_GB.UTF-8
debug1: Sending env LC_TIME = en_GB.UTF-8
debug1: Sending env LANG = en_GB.UTF-8
odin:~ % locale | tail -1  # locale is set to .UTF-8 without error...
LC_ALL=en_GB.UTF-8
odin:~ % locale -a | grep 'en_GB.UTF-8'  # ... even though .UTF-8 isn't an option
odin:~ % 

ไม่ว่าในกรณีใดกลไกหลังพฤติกรรมของมันคืออะไรและมันขึ้นอยู่กับการตั้งค่าใด ๆ (เช่นฉันจะเห็นพฤติกรรมแบบเดียวกันในระบบที่ใช้ BusyBox เหมือนกับบน GNU หรือไม่)


คำอธิบายที่นั่น: superuser.com/questions/999133/… (คำตอบจาก grawity) ดังนั้นจาก BSD ถึง Linux ก็ไม่มีปัญหา จาก Linux (ถ้ากำหนด utf8 แทน UTF-8) เป็น BSD อาจมีปัญหา
AB

คำตอบ:


0

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

เช่น

geee: ~
$ echo `locale | grep LANG` ::` date '
LANG = en_US.UTF-8 :: จันทร์ 3 ธันวาคม 07:04:00 น. CET 2012

$ ssh flode
flode: ~
$ echo `locale | grep LANG` ::` date '
LANG = nb_NO.UTF-8 LANGUAGE = nb_NO.UTF-8 :: ma 03. เด 06:59:33 +0100 2012

เพื่อสาธิตสิ่งนี้ฉันตั้งค่าโลแคลบนรีโมตเชลล์สำหรับภาษานอร์เวย์โดยเพิ่มบรรทัดต่อไปนี้ไปยังไฟล์ ~ / .bash_profile:

export     LANG=nb_NO.UTF-8
export LANGUAGE=nb_NO.UTF-8
export   LC_ALL=nb_NO.UTF-8

ในทำนองเดียวกันคุณจะต้องตั้งค่าสภาพแวดล้อมบนเปลือกระยะไกลให้ทำเช่นเดียวกัน แน่นอนเชลล์อื่นอ่านไฟล์เริ่มต้นที่แตกต่างกันเช่น ~ / .zprofile สำหรับ Z เชลล์

ความเข้าใจผิดที่ฉันสงสัยว่าเกิดจากการที่ตัวแปรท้องถิ่น (การตั้งค่า) ไม่มีการส่งต่อ เปลือกระยะไกลมีการตั้งค่าของตัวเอง ในการแสดงรายการภาษาที่มีอยู่บนรีโมตโฮสต์ไม่ว่าจะเป็นเชลล์ BusyBox ที่เรียบง่ายหรือ GNU OS แบบเต็มเป่าให้ใช้localeคำสั่งพร้อม-aสวิตช์ (ดังที่ระบุไว้ในคำถาม) บรรทัดที่พิมพ์ใด ๆ อาจถูกใช้เป็นการตั้งค่าโลแคลสำหรับสภาพแวดล้อมนั้น

สำหรับคำถามแรกโลแคลเริ่มต้นที่เชลล์เริ่มต้นด้วยมักจะถูกกำหนดค่าในตำแหน่งกลางเช่น / etc / profile เชลล์ล็อกอินส่วนใหญ่อ่านไฟล์นี้เมื่อเริ่มต้น


2
สิ่งที่เกิดขึ้นจะถูกส่งต่อไปแน่นอน /etc/ssh_configบนเครื่องที่ฉันเคยมองที่กำหนดว่าทุกLANGและLC_*ถูกส่งไปยังโฮสต์ทั้งหมดโดยค่าเริ่มต้นและเผยให้เห็นหลายสายเช่นssh -v debug1: Sending env LC_ALL = en_GB.UTF-8แน่นอนถ้าโปรไฟล์เชลล์ที่ปลายอีกด้านลบล้างนั่นก็เป็นอีกอย่างหนึ่ง - แต่สำหรับบางเครื่องของฉันนั่นไม่ใช่กรณี
kine

PS: ฉันได้อัปเดตโพสต์ดั้งเดิมของฉันด้วยบางทีภาพประกอบที่ดีขึ้นของสิ่งที่ฉันหมายถึง
kine

เป็นที่ยอมรับฉันไม่เคยเห็นสิ่งนี้ เครื่องที่คุณอ้างถึง Debian? บางทีนี่อาจอธิบายกลไกการส่งต่อของ ssh ฉันยังคงคิดว่าชื่อสถานที่นั้นต้องตรงกันทุกประการเพราะสถานที่นั้นไม่ควรฉลาดพอที่จะเข้าใจสิ่งนี้ เหตุผลที่สตริงแตกต่างกันเนื่องจากไลบรารี C แตกต่างกันสำหรับเครื่องที่ใช้ BSD และ GNU / Linux พวกเขาไม่รู้จักกัน แต่บางทีฉันอาจจะสงสัยเกินไปและโปรแกรมภาษาก็มีวิธีในการปรับโดยอัตโนมัติ
ЯрославРахматуллин

นั่นเป็นส่วนที่ฉันอยากรู้อยากเห็น - sshสิ่งที่ส่งต่อเป็นเรื่องบังเอิญมันเป็นเพียงบริบทว่าทำไมสถานที่ของฉันตั้งอยู่ในแบบที่มันเป็น ฉันไม่ทราบวิธีการกำหนดสิ่งที่เชลล์ที่ปลายอีกด้านกำลังทำอยู่ - ฉันมักจะไม่ได้รับข้อผิดพลาดในการพยายามตั้งค่าภาษา ทำงานได้ตามปกติ (?) แต่สถานที่ที่ฉันใช้อยู่นั้นไม่ชัดเจนในระบบ อุปกรณ์ Linux ส่วนใหญ่ที่ฉันเชื่อมต่ออยู่นั้นใช้ Debian- หรือ Ubuntu เป็นหลักในขณะที่อุปกรณ์อื่น ๆ นั้นใช้ uClibc / BusyBox (อุปกรณ์เครือข่าย & c.)
kine

0

ชื่อของ UTF-8 รองรับแตกต่างกันเล็กน้อยในระบบที่ต่างกันสำหรับคำสั่งต่อไปนี้ด้วยหรือไม่?

LC_ALL='' locale charmap  # UTF-8 (on Mac OS X 10.6.8)

หากคุณพบปัญหาเกี่ยวกับสถานที่แปลก ๆ อาจช่วยให้ลูกค้า SSH ไม่ส่งLC_*ตัวแปรเหล่านั้นด้วยการใส่ความคิดเห็นSendEnv LANG LC_*ใน/etc/ssh_config(ดูตัวอย่างการแก้ไขปัญหา SSH UTF-8 ของ Mac OS X LionและTerminal ใน OS X Lion: สามารถ ไม่เขียนåäöบนเครื่องระยะไกล )

แนวทางแก้ไขปัญหาอื่นคือ:

# from: http://mod16.org/hurfdurf/?p=189
tjac wrote:
Actually the real problem that's causing this is that Mac OS 10.7 sets totally 
non-standard locale values, at least when you tweak some of the formats in
SysPrefs/Language&Text as I did.

If you type "locale" on your Mac terminal you should see pretty much the same as on 
other Unices (e.g. lots of en_US.UTF-8s if you prefer US English), but you don't. 
If these garbled settings get transferred to other Unix hosts by the SendEnv option 
they naturally do not know what's going on.

So if you want to fix it cleanly to allow for sshing to all kinds of remote hosts,
including those with older character sets, put the following lines in your 
~/.bash_profile on your Mac client machine.

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

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