UTF-8 लोकेल पोर्टेबिलिटी (और ssh)


9

मैं अपना बहुत सारा समय sshविभिन्न मशीनों में बिताता हूं , जिनमें से सभी अलग-अलग हैं (कुछ एम्बेडेड हैं, कुछ लिनक्स चलाते हैं, कुछ बीएसडी, और सी चलाते हैं)। मेरी अपनी स्थानीय मशीनों पर, हालांकि, मैं ओएस एक्स का उपयोग करता हूं, जो निश्चित रूप से बीएसडी पर आधारित एक उपयोगकर्ताभूमि है। उन मशीनों पर मेरा स्थान 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

मेरे द्वारा उपयोग किए जाने वाले अधिक सक्षम लिनक्स सिस्टम में से कई में एक समान विकल्प दिखाई देता है, लेकिन मैं ध्यान देता हूं कि लिनक्स पर नाम थोड़ा अलग है:

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

यह मुझे आश्चर्यचकित करता है: जब मैं sshअपने मैक से लिनक्स मशीन में आता हूं, और यह मेरे सभी LC_*चर को उस 'UTF-8' प्रत्यय के साथ आगे बढ़ाता है , तो क्या लिनक्स मशीन भी समझती है कि उससे क्या पूछा जा रहा है? या यह सिर्फ कुछ अन्य लोकेल पर वापस गिर रहा है?

संपादित करें: यहाँ एक उदाहरण दिया गया है जिसका मैं उल्लेख कर रहा हूँ:

% 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:~ % 

किसी भी मामले में, उसके व्यवहार के पीछे क्या तंत्र है, और क्या यह किसी विशेष सेट-अप पर निर्भर है (जैसे, क्या मैं एक GNBox-आधारित एक के रूप में एक व्यस्त बॉक्स-आधारित प्रणाली पर समान व्यवहार देखूंगा)?


वहाँ स्पष्टीकरण: superuser.com/questions/999133/… (गुरुत्वाकर्षण से उत्तर)। इसलिए बीएसडी से लेकर लिनक्स तक कोई समस्या नहीं है। लिनक्स से (यदि यह UTF-8 के बजाय utf8 को परिभाषित करता है) BSD को, कोई समस्या हो सकती है।
एबी

जवाबों:


0

यह एक दिलचस्प सवाल है, लेकिन मुझे लगता है कि इसमें गलतफहमी हो सकती है कि चर कैसे स्थापित किए जाते हैं। जब एक सुरक्षित शेल सत्र शुरू किया जाता है ( ssh remotehost), दूसरे छोर पर क्या होता है एक अलग वातावरण के साथ एक नए शेल का एक तात्कालिकता है। यह कहने का एक फैंसी तरीका है कि सर्वर एक ताजा शेल शुरू करता है। वह नया शेल आपके मूल स्थानीय शेल के समान लोकेल के साथ कॉन्फ़िगर किया जा सकता है या नहीं भी हो सकता है।

उदाहरण के लिए

geee: ~
$ इको `लोकेल | ग्रीप लैंग` ::` डेट`
लैंग = en_US.UTF-8 :: सोम दिसंबर 3 07:04:00 सीईटी 2012

$ ssh फ्लोड
फ्लोड: ~
$ इको `लोकेल | ग्रीप लैंग` ::` डेट`
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

इसी तरह, आपको ऐसा करने के लिए दूरस्थ शेल पर वातावरण सेट करना होगा। बेशक, अन्य गोले Z के लिए ~ / .zprofile जैसे विभिन्न स्टार्टअप फ़ाइलों को पढ़ते हैं।

जिस गलत धारणा के चलते मुझे संदेह था कि स्थानीय चर (सेटिंग्स) किसी भी तरह से आगे नहीं हैं। रिमोट शेल की अपनी सेटिंग्स होती हैं। दूरस्थ होस्ट पर उपलब्ध भाषाओं को सूचीबद्ध करने के लिए, यह एक न्यूनतर बिजीबॉक्स शेल या पूर्ण-विकसित जीएनयू ओएस हो, स्विच के localeसाथ कमांड का उपयोग -aकरें (जैसा कि प्रश्न में उल्लेख किया गया है)। किसी भी मुद्रित रेखा का उपयोग उस वातावरण के लिए स्थानीय सेटिंग के रूप में किया जा सकता है।

पहले सवाल के लिए, किसी भी शेल के साथ शुरू होने वाले डिफ़ॉल्ट लोकेल को आमतौर पर केंद्रीय स्थान जैसे / etc / प्रोफाइल में कॉन्फ़िगर किया जाता है। अधिकांश लॉगिन गोले इस फ़ाइल को स्टार्टअप पर पढ़ते हैं।


2
स्थानीय सामान निश्चित रूप से अग्रेषित किया जाता है। /etc/ssh_configहर मशीन पर जो मैंने कभी भी परिभाषित किया है LANGऔर LC_*डिफ़ॉल्ट रूप से सभी मेजबानों को भेजा जाता है, और ssh -vजैसे कई पंक्तियों को प्रकट करता है debug1: Sending env LC_ALL = en_GB.UTF-8। बेशक, अगर दूसरे छोर पर शेल प्रोफाइल बाद में ओवरराइड करता है, तो यह दूसरी बात है - लेकिन मेरी कुछ मशीनों पर, ऐसा नहीं है
kine

पुनश्च: मैंने अपनी मूल पोस्ट को अपडेट किया है कि शायद मैं इस बात का बेहतर चित्रण करूं कि मैं किस का जिक्र कर रहा हूं
kine

बेशक मैंने ऐसा कभी नहीं देखा। जिन मशीनों का आप जिक्र कर रहे हैं, डेबियन? शायद यह ssh env-अग्रेषण तंत्र की व्याख्या करेगा। मुझे अभी भी लगता है कि लोकेल के नामों को बिल्कुल मेल खाना है, क्योंकि स्थानीय लोगों को यह पता लगाने के लिए पर्याप्त स्मार्ट नहीं होना चाहिए। तार अलग हैं इसका कारण यह है कि सी लाइब्रेरी बीएसडी और जीएनयू / लिनक्स आधारित मशीनों के लिए अलग है। वे एक दूसरे के बारे में नहीं जानते। लेकिन शायद मुझे बहुत संदेह हो रहा है और स्थानीय कार्यक्रम में इसे स्वचालित रूप से समायोजित करने का एक तरीका है।
урослав Рахматуллин

यह वह हिस्सा है जिसके बारे में मैं उत्सुक था - sshअग्रेषित सामान आकस्मिक है, यह सिर्फ इस बात का संदर्भ है कि मेरा स्थान इस तरह सेट क्यों है। मुझे नहीं पता कि दूसरे छोर पर शेल वास्तव में क्या कर रहा है, यह कैसे निर्धारित किया जाए - मुझे आमतौर पर लोकेल सेट करने की कोशिश में त्रुटियां नहीं मिलती हैं (हालांकि मैं कभी-कभी एम्बेडेड उपकरणों पर करता हूं), और यूनिकोड टेक्स्ट इनपुट / डिस्प्ले में दिखाई देता है सामान्य रूप से (?) काम करते हैं, लेकिन मैं जिस लोकेल का उपयोग कर रहा हूं वह स्पष्ट रूप से सिस्टम पर मौजूद नहीं है। अधिकांश लिनक्स डिवाइस जो मुझे कनेक्ट करते हैं वे डेबियन- या उबंटू-आधारित हैं, जबकि अन्य यूक्लिब / बिजीबॉक्स-आधारित (नेटवर्क उपकरण, और सी) हैं।
परिजनों

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 मुद्दों और कर सकते हैं: ओएस एक्स शेर में टर्मिनल 'रिमोट मशीन पर लिखने के लिए )।

एक और समाधान दृष्टिकोण यह है:

# 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 #
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.