Biến cục bộ không có tác dụng trong shell từ xa (perl: cảnh báo: Đặt ngôn ngữ không thành công.)


89

Tôi có bản cài đặt Ubuntu 12.04 mới. Khi tôi kết nối với máy chủ từ xa, tôi gặp lỗi như thế này:

~$ 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.
...

Tôi không gặp vấn đề này khi tôi kết nối từ bản cài đặt Ubuntu cũ hơn. Đây là đầu ra từ cài đặt Ubuntu 12.04 của tôi, LANG và LANGUAGE được đặt

$ 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=

Có ai biết những gì đã thay đổi trong Ubuntu để nhận thông báo lỗi này trên các máy chủ từ xa không?


Câu trả lời:


167

Đó là vì ngôn ngữ của bạn trong máy cục bộ của bạn được đặt thành tiếng Đức, mà SSH chuyển tiếp và cố gắng sử dụng trên máy chủ, nhưng máy chủ của bạn chưa cài đặt nó.

Bạn đã có một số tùy chọn:

  • Tạo miền địa phương . Tạo miền địa phương Đức trên máy chủ với sudo locale-gen de.

  • Dừng chuyển tiếp miền địa phương từ khách hàng . Không chuyển tiếp biến môi trường miền địa phương từ máy cục bộ của bạn đến máy chủ. Bạn có thể nhận xét ra SendEnv LANG LC_*dòng trong tệp cục bộ /etc/ssh/ssh_config .

  • Ngừng chấp nhận miền địa phương trên máy chủ . Không chấp nhận biến môi trường miền địa phương từ máy cục bộ của bạn đến máy chủ. Bạn có thể nhận xét AcceptEnv LANG LC_*dòng trong tệp từ xa /etc/ssh/sshd_config .

  • Đặt ngôn ngữ máy chủ thành tiếng Anh . Hoàn toàn đặt ngôn ngữ thành tiếng Anh trên máy chủ. Ví dụ: bạn có thể thêm các dòng sau vào remote ~/.bashrchoặc ~/.profiletệp của mình:

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

Nếu bạn không có quyền truy cập root vào máy chủ, thì dừng chuyển tiếp ngôn ngữ từ tùy chọn máy khách có thể là cách tốt nhất (và duy nhất) để đi.


2
Hừ! Tôi hoàn toàn bỏ lỡ thực tế là anh ấy đã liệt kê các cài đặt ngôn ngữ của khách hàng ! Làm tốt lắm ...
ish

10
Tôi quyết định "Dừng chuyển tiếp miền từ khách hàng". Hoạt động tốt. Để tham khảo trong tương lai: bạn không thể ghi đè cài đặt SendEnv từ / etc / ssh / ssh_config trong địa phương ~ / .ssh / config. Xem bugzilla.mindrot.org/show_orms.cgi?id=1285
Janning

3
Kết hợp với bug.php.net/orms.php?id=18556 , việc gửi địa phương của SSH có thể gây ra sự cố thực sự (và thực sự gây ra cho tôi), xem bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. .
Halil Özgür

1
Trong trường hợp của tôi, thiết lập miền địa phương trong ~/.profilegiải quyết vấn đề của tôi. Cảm ơn.
Francisco

Nếu máy chủ không có ngôn ngữ tiếng Đức, tại sao nó có thể chấp nhận được để ghi đè lên giá trị do người dùng yêu cầu LANGbằng một thứ khác? ..
Mikhail T.

26

Điều này đôi khi có thể xảy ra trên các cài đặt tối thiểu / thay thế mới hoặc trong các tình huống khác. Cách khắc phục khá đơn giản. Hãy thử những thứ này, theo thứ tự sau, kiểm tra sau mỗi lần để xem tình huống đã được khắc phục chưa:

1. Cấu hình lại địa phương

  • sudo dpkg-reconfigure locales
    • nếu điều đó không làm việc,

2. Cài đặt lại ngôn ngữ gói ngôn ngữ

  • sudo apt-get --reinstall install language-pack-de
    • nếu điều đó không làm việc,

3. Cài đặt thủ công ngôn ngữ (liên tục)

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

Tôi có một vấn đề JVM và tôi cũng đang cố gắng thiết lập ngôn ngữ hệ thống trong 12.04. Vấn đề duy nhất là tôi dường như không thể đặt LC_ALL cho dù tôi có cố gắng thế nào, các ngôn ngữ vẫn hiển thị nó trống.
Ngôi sao đen tối

15

Nhận xét dòng SendEnv LANG LC_*trong /etc/ssh/ssh_config, vì vậy nó sẽ trông như:

#SendEnv LANG LC_*

10

Vấn đề

Theo mặc định, lệnh ssh client chuyển tiếp các biến môi trường liên quan đến miền địa phương đến máy chủ SSH. Điều đó được chỉ định ở /etc/ssh/ssh_configphía khách hàng:

Host *
    SendEnv LANG LC_*

Và theo mặc định, máy chủ SSH tình cờ chấp nhận chúng ( /etc/ssh/sshd_configtrên máy chủ):

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

Vì vậy, nếu có các biến môi trường liên quan đến miền địa phương trong trình bao của bạn, chúng sẽ được đưa vào phiên SSH ở phía máy chủ.

Thật không may, SendEnvtùy chọn được tích lũy . Theo 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.

có nghĩa là nó không thể bị ghi đè .

Giải pháp

Đôi khi, không thể thay đổi cấu hình toàn hệ thống, đặc biệt là ở phía máy chủ. Tuy nhiên, bạn có thể bỏ qua nó. Và đó là tác dụng phụ của -Ftùy chọn trong lệnh ssh. Theo 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.

Theo mặc định, tệp cấu hình trên mỗi người dùng ~/.ssh/configđược sử dụng nếu nó xuất hiện. Nhưng bạn có thể chỉ định rõ ràng nó trên dòng lệnh để bỏ qua /etc/ssh/ssh_config:

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

Sẽ thuận tiện hơn nếu bạn tạo một bí danh trong ~/.bashrc:

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

Theo cách này, các SendEnvchỉ thị mặc định trong cấu hình toàn hệ thống không hiệu quả, làm cho không có biến môi trường nào được gửi đến máy chủ SSH theo mặc định.


2
Hãy nhớ rằng tệp cấu hình hệ thống trong / etc / ssh / config có thể chứa các dòng bổ sung mà bạn muốn giữ lại trong cấu hình người dùng của mình. Bạn sẽ phải sao chép chúng vào tệp cấu hình người dùng của bạn trong ~ / .ssh / config để giữ các cài đặt đó.
Steven Maude

4

Tôi đã có một vấn đề tương tự. Giải pháp của tôi là bình luận các SendEnvdòng trong /etc/ssh/ssh_config(vì chúng không thể bị ghi đè) và thêm mục sau vào ~/.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    

với <somehost>tên máy chủ mà tôi không muốn gửi bất kỳ biến môi trường nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.