ตัวแปรโลแคลไม่มีผลในรีโมตเชลล์ (perl: คำเตือน: การตั้งค่าโลแคลล้มเหลว)


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=

มีใครรู้บ้างว่ามีการเปลี่ยนแปลงอะไรบ้างในอูบุนตูเพื่อรับข้อความแสดงข้อผิดพลาดบนเซิร์ฟเวอร์ระยะไกล


คำตอบ:


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
ฉันตัดสินใจที่จะ "หยุดส่งต่อสถานที่เกิดเหตุจากลูกค้า" ทำงานได้ดี สำหรับการอ้างอิงในอนาคต: คุณไม่สามารถแทนที่การตั้งค่า SendEnv จาก / etc / ssh / ssh_config ใน local ~ / .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 .. .
Halil Özgü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

ฉันมีปัญหา JVM และฉันพยายามตั้งค่าตำแหน่งที่ตั้งของระบบใน 12.04 ด้วย ปัญหาเดียวคือฉันไม่สามารถตั้งค่า LC_ALL ไม่ว่าฉันจะพยายามอะไรก็ตามสถานที่ยังคงแสดงว่าว่างเปล่า
Dark Star1 1


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.

ซึ่งหมายความว่าไม่สามารถเขียนทับได้

การแก้ไขปัญหา

บางครั้งมันเป็นไปไม่ได้หรือไม่ฉลาดที่จะเปลี่ยนการกำหนดค่าทั้งระบบโดยเฉพาะในฝั่งเซิร์ฟเวอร์ อย่างไรก็ตามคุณสามารถเลี่ยงได้ และนั่นคือผลข้างเคียงของ-Fตัวเลือกในคำสั่ง ssh ตาม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 เพื่อให้การตั้งค่าเหล่านั้น
Steven Maude

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>การเป็นชื่อโฮสต์ที่ฉันไม่ต้องการส่งตัวแปรสภาพแวดล้อมใด ๆ

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