อักขระต่างประเทศจะไม่แสดงใน SSH


17

ฉันประสบปัญหาในการใช้งานsshและเซิร์ฟเวอร์ระยะไกล (ซึ่งฉันไม่มีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบ) - โดยเฉพาะมีโฟลเดอร์สองสามโฟลเดอร์ที่มีข้อความภาษาเกาหลีและ Cyrillic

เมื่อฉันแสดงเนื้อหาของโฟลเดอร์พาเรนต์ด้วยlsอักขระจะถูกหลีกเลี่ยงเป็น "?" อาจจะทราบได้ว่าตัวละครเกาหลีดูเหมือนจะหลบหนีออกไปได้มากกว่าจำนวนตัวอักษรที่ควรมี

ฉันรู้ว่าโปรแกรมเทอร์มินัลที่ฉันใช้สามารถแสดงอักขระได้เช่นเดียวกับที่ใช้sftpแสดงมันอย่างสมบูรณ์ ปัญหาเกิดขึ้นกับทุกเครื่องที่ฉันได้ลอง

สรุปเครื่องจักร

เครื่องท้องถิ่น:

  • Linux 2.6.32-5-686, i686
  • Debian GNU / Linux 6.0.2 (บีบ)
  • มีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบ

เซิร์ฟเวอร์ระยะไกล:

  • Linux 2.6.32-bpo.5-amd64, x86_64
  • Debian GNU / Linux 5.0.8 (เงิน)
  • ไม่มีสิทธิ์การเข้าถึงระดับผู้ดูแลระบบหรือทางกายภาพ

ฉันอาจพลาดสถิติสำคัญหรือข้อมูลอื่น ๆ ไปบ้างซึ่งในกรณีนี้ฉันขอโทษ ฉันค่อนข้างใหม่สำหรับคอมพิวเตอร์ที่ไม่ใช่ Windows ทั้งหมดดังนั้นฉันจึงแทบไม่รู้ว่าฉันกำลังทำอะไรที่นี่


2
โพสต์ผลลัพธ์จากlocaleและlocale -aคำสั่งทั้งในและนอกสถานที่โปรด
enzotib

ขอบคุณ @enzotib - ความคิดเห็นของคุณทำให้ฉันคิดว่าสถานที่ที่เสนออาจไม่เหมือนกันในพื้นที่และจากระยะไกล
ChemicalRascal

คำตอบ:


20

ข้อมูลตำแหน่งที่ตั้งของคุณไม่ได้ตั้งค่าอย่างถูกต้องบนเครื่องเซิร์ฟเวอร์ โดยเฉพาะอย่างยิ่งLC_CTYPEตัวแปรซึ่งระบุการเข้ารหัสของอักขระบนเทอร์มินัลไม่ได้ตั้งค่าอย่างถูกต้อง (หรือฉันสงสัยเลย)

ในเทอร์มินัลท้องถิ่นของคุณเรียกใช้localeเพื่อดูการตั้งค่าสถานที่ของคุณ คุณอาจจะเห็นบางสิ่งที่คล้ายLC_CTYPE=en_US.UTF-8กัน สิ่งที่สำคัญที่นี่เป็น.UTF-8ส่วนแสดงUTF-8เข้ารหัส นี่คือการเข้ารหัสแบบมาตรฐานโดยพฤตินัยสำหรับข้อความหลายภาษาในโลกยูนิกซ์ (และอื่น ๆ )

คุณต้องส่งข้อมูลนี้ไปยังเซิร์ฟเวอร์ วิธีที่ดีที่สุดถ้าใช้งานได้คือการส่งข้อมูลสถานที่ผ่านการเชื่อมต่อ ssh สำหรับสิ่งนี้เพิ่มบรรทัดต่อไปนี้ในตอนท้ายของ~/.ssh/config:

Host *
SendEnv LC_* LANG

สิ่งนี้ต้องการให้มีAcceptEnvคำสั่งที่เหมาะสมในการกำหนดค่าเซิร์ฟเวอร์ ( /etc/ssh/sshd_config) (โดยค่าเริ่มต้นคือ Debian)

หากวิธีนี้ไม่ได้ผลและคุณลงชื่อเข้าใช้เซิร์ฟเวอร์จากเทอร์มินัล UTF-8 เสมอให้เพิ่มบรรทัดexport LC_CTYPE=en_US.UTF-8ลง~/.bashrcในเซิร์ฟเวอร์ของคุณ(หรือ~/.zshrcไฟล์ใด ๆ ที่เชลล์ใช้) ชื่อสถานที่ (เช่นen_US.UTF-8) จะต้องเป็นหนึ่งในชื่อที่เสนอโดยlocale -aและต้องมี.UTF-8(หรือ.utf8รูปแบบเล็กน้อย)


1
อา! นั่นเป็นปัญหา: ฉัน "ใช้" en_AU.utf8 ภายในเครื่องซึ่งดูเหมือนว่าจะถูกส่งต่อไปยังเซิร์ฟเวอร์แล้ว (หรืออย่างน้อยก็localeผลลัพธ์ที่ตรงกัน) อย่างไรก็ตามlocale -aจากระยะไกลให้ en_GB.utf8 และ en_US.utf8 เท่านั้น ขอบคุณ!
ChemicalRascal

1
ในการรับการเข้ารหัสของสถานที่ปัจจุบันคุณอาจใช้:locale charmap

ความ/etc/ssh/ssh_configต้องการของฉันยังส่งLANG( SendEnv LANG LC_*)
Shammel Lee

และฉันต้องการที่จะเพิ่มexport LC_CTYPE=en_US.UTF-8ของฉัน~/.profileในฝั่งเซิร์ฟเวอร์ การเพิ่มไปยัง~/.bashrcดูเหมือนจะไม่มีผล
datka
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.