दूरस्थ शेल में लोकेल वेरिएबल का कोई प्रभाव नहीं है (पर्ल: चेतावनी: लोकेल सेट करना विफल रहा।)


89

मेरे पास एक ताजा ubuntu 12.04 स्थापना है। जब मैं अपने दूरस्थ सर्वर से जुड़ता हूं तो मुझे इस तरह की त्रुटियां मिली हैं:

~$ ssh example.com sudo aptitude upgrade
...
Traceback (most recent call last):
  File "/usr/bin/apt-listchanges", line 33, in <module>
    from ALChacks import *
  File "/usr/share/apt-listchanges/ALChacks.py", line 32, in <module>
    sys.stderr.write(_("Can't set locale; make sure $LC_* and $LANG are correct!\n"))
NameError: name '_' is not defined
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "de_DE.UTF-8",
    LC_MONETARY = "de_DE.UTF-8",
    LC_ADDRESS = "de_DE.UTF-8",
    LC_TELEPHONE = "de_DE.UTF-8",
    LC_NAME = "de_DE.UTF-8",
    LC_MEASUREMENT = "de_DE.UTF-8",
    LC_IDENTIFICATION = "de_DE.UTF-8",
    LC_NUMERIC = "de_DE.UTF-8",
    LC_PAPER = "de_DE.UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_ALL to default locale: No such file or directory
No packages will be installed, upgraded, or removed.
0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B of archives. After unpacking 0 B will be used.
...

जब मैं एक पुराने ubuntu स्थापना से कनेक्ट करता हूं, तो मुझे यह समस्या नहीं है। यह मेरे ubuntu 12.04 इंस्टॉलेशन से आउटपुट है, LANG और LANGUAGE सेट हैं

$ locale
LANG=de_DE.UTF-8
LANGUAGE=de_DE:en_GB:en
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

क्या किसी को पता है कि दूरस्थ सर्वर पर इस त्रुटि संदेश को प्राप्त करने के लिए ubuntu में क्या बदलाव आया है?


जवाबों:


167

ऐसा इसलिए है क्योंकि आपके स्थानीय मशीन में आपका स्थान जर्मन पर सेट है, जो SSH सर्वर पर उपयोग करने की कोशिश करता है, लेकिन आपके सर्वर में यह स्थापित नहीं है।

आपको कई विकल्प मिले हैं:

  • लोकेल जनरेट करें । सर्वर पर जर्मन लोकेल जनरेट करें sudo locale-gen de

  • क्लाइंट से लोकेल फॉरवर्ड करना बंद करें । अपने स्थानीय मशीन से सर्वर के लिए स्थानीय वातावरण चर को अग्रेषित न करें। आप स्थानीय फ़ाइल SendEnv LANG LC_*में लाइन बाहर टिप्पणी कर सकते हैं । /etc/ssh/ssh_config

  • सर्वर पर लोकेल स्वीकार करना बंद करें । अपने स्थानीय मशीन से सर्वर के लिए स्थानीय वातावरण चर को स्वीकार न करें। आप दूरस्थ फ़ाइल AcceptEnv LANG LC_*में लाइन पर टिप्पणी कर सकते हैं । /etc/ssh/sshd_config

  • सर्वर लोकेल को अंग्रेजी में सेट करें । स्पष्ट रूप से सर्वर पर अंग्रेजी में लोकेल सेट करें। एक उदाहरण के रूप में, आप निम्न पंक्तियों को अपने दूरस्थ ~/.bashrcया ~/.profileफ़ाइलों में जोड़ सकते हैं :

    export LANGUAGE="en"
    export LANG="C"
    export LC_MESSAGES="C"
    

यदि आपके पास सर्वर तक रूट एक्सेस नहीं है, तो क्लाइंट ऑप्शन से स्टॉप फॉरवर्डिंग लोकेल जाने का सबसे अच्छा (और केवल) तरीका हो सकता है।


2
हा! मैंने इस तथ्य को पूरी तरह से याद किया कि उसने ग्राहक की स्थानीय सेटिंग्स को सूचीबद्ध किया था ! महान काम ...
ish

10
मैंने "ग्राहक से स्थान अग्रेषित करना बंद करने" का फैसला किया। ठीक काम करता है। भविष्य के संदर्भ के लिए: आप अपने स्थानीय ~ / .ssh / config में SendEnv सेटिंग्स को / etc / ssh / ssh_config से ओवरराइड नहीं कर सकते। देखें bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning

3
Bugs.php.net/bug.php?id=18556 के साथ संयुक्त रूप से , SSH के स्थानों को भेजने से वास्तविक समस्याएं पैदा हो सकती हैं (और वास्तव में मेरे लिए), Bugzilla.mindrot.org/show_bug.cgi?id?1285#c9 देखें .. ।
हलाल gzgür

1
मेरे मामले में, ~/.profileमेरी समस्या को हल करने में स्थान निर्धारित करना । धन्यवाद।
फ्रांसिस्को

यदि सर्वर में जर्मन लोकेल नहीं है, तो इसके लिए उपयोगकर्ता द्वारा अनुरोधित मूल्य को LANGकिसी और चीज़ से अधिलेखित करना क्यों स्वीकार्य है? ..
मिखाइल टी।

26

यह कभी-कभी ताजा न्यूनतम / वैकल्पिक इंस्टॉल या अन्य स्थितियों में हो सकता है। तय बहुत आसान है। इनका प्रयास करें, निम्न क्रम में, प्रत्येक के बाद परीक्षण करके देखें कि क्या स्थिति ठीक है:

1. स्थानों को पुन: कॉन्फ़िगर करें

  • sudo dpkg-reconfigure locales
    • अगर वह काम नहीं करता है,

2. स्थानीय भाषा-पैक को पुनर्स्थापित करें

  • sudo apt-get --reinstall install language-pack-de
    • अगर वह काम नहीं करता है,

3. मैन्युअल रूप से लोकेल सेटिंग (लगातार)

  • sudo update-locale LC_ALL=de_DE.UTF-8 LANG=de_DE.UTF-8

मुझे जेवीएम की समस्या है और मैं 12.04 में भी सिस्टम लोकल सेट करने की कोशिश कर रहा हूं। केवल समस्या यह है कि मैं LC_ALL को सेट करने के लिए प्रतीत नहीं कर सकता चाहे मैं कोई भी प्रयास करूं, फिर भी स्थान इसे खाली दिखाते हैं।
डार्क स्टार


10

समस्या

डिफ़ॉल्ट रूप से, SSH सर्वर के लिए ssh क्लाइंट कमांड लोकेल से संबंधित एनवायरमेंट वेरिएबल्स को फॉरवर्ड करता है। यह /etc/ssh/ssh_configग्राहक की ओर से निर्दिष्ट है :

Host *
    SendEnv LANG LC_*

और डिफ़ॉल्ट रूप से, SSH सर्वर उन्हें ( /etc/ssh/sshd_configसर्वर पर) स्वीकार करने के लिए होता है :

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE

इसलिए, यदि आपके शेल में स्थानीय-संबंधित पर्यावरण चर हैं, तो वे सर्वर साइड पर SSH सत्र में पॉप्युलेट होंगे।

दुर्भाग्य से, SendEnvविकल्प संचयी है । के अनुसार man 5 ssh_config:

 SendEnv
         ... Multiple environment variables may be separated
         by whitespace or spread across multiple SendEnv directives.  The
         default is not to send any environment variables.

जिसका अर्थ है कि इसे ओवरराइड नहीं किया जा सकता है

समाधान

कभी-कभी सिस्टम-वाइड कॉन्फ़िगरेशन को बदलने के लिए यह असंभव या नासमझ होता है, खासकर सर्वर की तरफ। हालाँकि, आप इसे बायपास कर सकते हैं। और -Fssh कमांड में विकल्प का साइड इफेक्ट है । के अनुसार man ssh:

 -F configfile
         Specifies an alternative per-user configuration file.  If a con-
         figuration file is given on the command line, the system-wide
         configuration file (/etc/ssh/ssh_config) will be ignored.  The
         default for the per-user configuration file is ~/.ssh/config.

डिफ़ॉल्ट रूप से प्रति उपयोगकर्ता कॉन्फ़िगरेशन फ़ाइल ~/.ssh/configका उपयोग किया जाता है यदि यह प्रस्तुत करता है। लेकिन आप इसे स्पष्ट रूप से कमांड लाइन पर बाईपास करने के लिए निर्दिष्ट कर सकते हैं/etc/ssh/ssh_config :

$ touch ~/.ssh/config
$ ssh -F ~/.ssh/config your_user@your_host

यदि आप एक उपनाम बनाते हैं तो यह अधिक सुविधाजनक होगा ~/.bashrc:

alias ssh="ssh -F ~/.ssh/config"

इस तरह, SendEnvसिस्टम-वाइड कॉन्फ़िगरेशन में डिफ़ॉल्ट निर्देश प्रभावी नहीं हैं, जिससे कोई भी पर्यावरण चर डिफ़ॉल्ट रूप से SSH सर्वर को नहीं भेजा जा सकता है।


2
यह ध्यान रखें कि सिस्टम कॉन्फ़िगरेशन फ़ाइल / etc / ssh / config में अतिरिक्त लाइनें हो सकती हैं जिन्हें आप अपने उपयोगकर्ता कॉन्फ़िगरेशन में बनाए रखना चाहते हैं। आपको उन सेटिंग्स को रखने के लिए उन्हें ~ / .ssh / config में अपने उपयोगकर्ता कॉन्फ़िगरेशन फ़ाइल पर कॉपी करना होगा।
स्टीवन मौड

4

मेरा मुद्दा भी ऐसा ही था। मेरा समाधान SendEnvलाइनों में टिप्पणी करना था /etc/ssh/ssh_config(क्योंकि ये अधिक नहीं हो सकते), और निम्नलिखित प्रविष्टि को इसमें जोड़ने के लिए ~/.ssh/config:

Host *,!<somehost>
    SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    SendEnv XMODIFIERS    

साथ <somehost>होस्ट नाम जो करने के लिए मैं जा रहा नहीं था किसी भी वातावरण चर भेजना चाहते हैं।

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