Variabel lokal tidak berpengaruh pada shell jarak jauh (perl: peringatan: Pengaturan lokal gagal.)


89

Saya memiliki instalasi ubuntu 12.04 yang baru. Ketika saya terhubung ke server jarak jauh saya, saya mendapat kesalahan seperti ini:

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

Saya tidak memiliki masalah ini ketika saya terhubung dari instalasi ubuntu yang lebih lama. Ini adalah output dari instalasi ubuntu 12.04 saya, LANG dan LANGUAGE disetel

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

Adakah yang tahu apa yang telah berubah di ubuntu untuk mendapatkan pesan kesalahan ini di server jauh?


Jawaban:


167

Itu karena lokal Anda di mesin lokal Anda diatur ke Jerman, yang SSH maju dan coba gunakan pada server, tetapi server Anda tidak menginstalnya.

Anda punya beberapa opsi:

  • Hasilkan lokal . Hasilkan lokal Jerman di server dengan sudo locale-gen de.

  • Hentikan penerusan lokal dari klien . Jangan teruskan variabel lingkungan lokal dari mesin lokal Anda ke server. Anda dapat mengomentari SendEnv LANG LC_*baris dalam file lokal /etc/ssh/ssh_config .

  • Berhenti menerima lokal di server . Jangan terima variabel lingkungan lokal dari mesin lokal Anda ke server. Anda dapat mengomentari AcceptEnv LANG LC_*baris dalam file jarak jauh /etc/ssh/sshd_config .

  • Tetapkan lokal server ke Bahasa Inggris . Secara eksplisit mengatur lokal ke Bahasa Inggris di server. Sebagai contoh, Anda dapat menambahkan baris berikut ke remote ~/.bashrcatau ~/.profilefile Anda:

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

Jika Anda tidak memiliki akses root ke server, berhenti penerusan lokal dari opsi klien mungkin cara terbaik (dan hanya) untuk pergi.


2
Hah! Saya benar-benar merindukan fakta bahwa dia mendaftarkan pengaturan lokal klien ! Kerja bagus ...
ish

10
Saya memutuskan untuk "Hentikan penerusan lokal dari klien". Bekerja dengan baik. Untuk referensi di masa mendatang: Anda tidak dapat mengabaikan pengaturan SendEnv dari / etc / ssh / ssh_config di ~ ~ .ssh / config lokal Anda. Lihat bugzilla.mindrot.org/show_bug.cgi?id=1285
Janning

3
Dikombinasikan dengan bugs.php.net/bug.php?id=18556 , pengiriman lokal SSH dapat menyebabkan masalah nyata (dan menyebabkan saya benar-benar), lihat bugzilla.mindrot.org/show_bug.cgi?id=1285#c9 .. .
Halil Özgür

1
Dalam kasus saya, mengatur lokal dalam ~/.profilememecahkan masalah saya. Terima kasih.
Francisco

Jika server tidak memiliki lokal Jerman, mengapa dapat ditimpa untuk menimpa nilai yang diminta pengguna LANGdengan sesuatu yang lain? ..
Mikhail T.

26

Ini dapat terjadi kadang-kadang pada pemasangan minimal / alternatif segar atau dalam situasi lain. Cara mengatasinya cukup sederhana. Coba ini, dalam urutan berikut, pengujian setelah masing-masing untuk melihat apakah situasinya sudah diperbaiki:

1. Konfigurasi ulang lokal

  • sudo dpkg-reconfigure locales
    • jika itu tidak berhasil,

2. Instal ulang paket bahasa lokal

  • sudo apt-get --reinstall install language-pack-de
    • jika itu tidak berhasil,

3. Secara manual memaksa pengaturan lokal (persisten)

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

Saya memiliki masalah JVM dan saya mencoba untuk mengatur sistem lokal di 12,04 juga. Satu-satunya masalah adalah saya tampaknya tidak dapat mengatur LC_ALL tidak peduli apa yang saya coba, lokal masih menunjukkan itu kosong.
Dark Star1

15

Komentar garis SendEnv LANG LC_*di /etc/ssh/ssh_config, jadi seharusnya terlihat seperti:

#SendEnv LANG LC_*

10

Masalah

Secara default, perintah ssh client meneruskan variabel lingkungan terkait-lokal ke server SSH. Itu ditentukan di /etc/ssh/ssh_configsisi klien:

Host *
    SendEnv LANG LC_*

Dan secara default, server SSH menerima mereka (masuk /etc/ssh/sshd_configpada server):

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

Jadi, jika ada variabel lingkungan terkait-lokal di shell Anda, mereka akan diisi ke sesi SSH di sisi server.

Sayangnya, SendEnvopsi ini bersifat kumulatif . Menurut 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.

yang berarti itu tidak dapat ditimpa .

Solusinya

Terkadang tidak mungkin atau tidak bijaksana untuk mengubah konfigurasi seluruh sistem, terutama di sisi server. Namun, Anda dapat memotongnya . Dan itulah efek samping dari -Fopsi dalam perintah ssh. Menurut 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.

Secara default file konfigurasi per-pengguna ~/.ssh/configdigunakan jika ada. Tetapi Anda dapat secara eksplisit menentukannya di baris perintah untuk memotong /etc/ssh/ssh_config:

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

Akan lebih mudah jika Anda membuat alias di ~/.bashrc:

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

Dengan cara ini, SendEnvarahan default dalam konfigurasi seluruh sistem tidak efektif, sehingga tidak ada variabel lingkungan yang dikirim ke server SSH secara default.


2
Ingatlah bahwa file konfigurasi sistem di / etc / ssh / config dapat berisi baris tambahan yang ingin Anda pertahankan dalam konfigurasi pengguna Anda. Anda harus menyalinnya ke file konfigurasi pengguna Anda di ~ / .ssh / config untuk mempertahankan pengaturan itu.
Steven Maude

4

Saya memiliki masalah serupa. Solusi saya adalah mengomentari SendEnvbaris dalam /etc/ssh/ssh_config(karena ini tidak dapat diganti), dan menambahkan entri berikut di ~/.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    

dengan <somehost>menjadi nama host yang saya tidak ingin mengirim variabel lingkungan apa pun.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.