เป็นไปได้หรือไม่ที่จะเปลี่ยนมูลค่าของ $ TERM เมื่อเรียก ssh?


21

บนเทอร์มินัลท้องถิ่นของฉันฉันมี TERM = konsole-256color แต่ไม่ใช่เครื่องระยะไกลทั้งหมดที่ฉันเชื่อมต่อเพื่อให้คำจำกัดความนี้

เป็นไปได้ไหมที่จะเปลี่ยน ssh TERM บนเครื่องรีโมต? หากไม่เปลี่ยนสคริปต์. bash * บนเครื่องระยะไกลเพียงแค่เปลี่ยนการกำหนดค่าบนเดสก์ท็อปท้องถิ่น

คำตอบ:


9

ฉันได้เพิ่มนามแฝงต่อไปนี้ไปยังไฟล์. bashrc ของฉันแล้ว มันใช้คำตอบของ OG แต่หุ้มไว้ในนามแฝง ทำงานเหมือนมีเสน่ห์;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'

มันใช้งานได้ถ้าฉันใช้ ssh จากเทอร์มินัล แต่ฉันยังมีสคริปต์หลายตัวที่เรียกใช้ ssh และนามแฝงจะไม่ขยายสำหรับพวกเขา มีวิธีใดบ้างที่ฉันสามารถหลีกเลี่ยงการสร้างชื่อแทนแยกสำหรับแต่ละชื่อได้
Thayne

หากสคริปต์ของคุณต้องการค่า TERM ที่เฉพาะเจาะจงฉันคิดว่ามันจะเป็นการดีที่สุดถ้าเพียงตั้งค่า varialble ในสคริปต์เอง หรือว่าไม่ใช่ตัวเลือก?
Johan

นั่นไม่ใช่ตัวเลือกจริงๆ นอกจากนี้สคริปต์เหล่านี้จะเลือกเซิร์ฟเวอร์ตามพารามิเตอร์บางตัวและเปิดเซสชัน ssh ไปยังเซิร์ฟเวอร์นั้น (หรืออาจเป็นเซิร์ฟเวอร์ในเซสชัน tmux) สคริปต์เองไม่ได้ขึ้นอยู่กับค่า TERM
Thayne

ในกรณีนี้คุณสามารถรวมโปรไฟล์ทุบตีของคุณหรือสคริปต์นามแฝงแยกเป็นสคริปต์ด้วย: shopt -s expand_aliases; source ~ / .bash_aliases
Johan

7
TERM=vt100 ssh some.host.name

บนรีโมทรันecho $


ฉันคิดว่ามันเกี่ยวกับมัน แต่ฉันต้องการมันตั้งไว้เพียงส่วนย่อยของโฮสต์ที่ฉัน ssh ไปดังนั้นการออก TERM = ... ssh ตลอดเวลาจะไม่ทำงาน และการจดจำว่าโฮสต์ใดที่มีข้อมูล termcap แบบเก่าแล้วการเปลี่ยนคำสั่งได้ทันทีก็ไม่ดีเช่นกัน

การกำหนดค่าต่อโฮสต์ได้รับการสนับสนุนเฉพาะใน / etc / ssh / ssh_config แต่ฉันรู้ว่าไม่มีค่าการกำหนดค่าเพื่อรองรับการทำแผนที่เทอร์มินัลสกีมาต่อโฮสต์
OG

มันสามารถทำได้ใน ~ / .ssh / config ซึ่งฉันรู้ แต่ฉันยังไม่พบตัวเลือกใด ๆ ในการแก้ไขสภาพแวดล้อมที่ส่งไปยังเซิร์ฟเวอร์ระยะไกล หวังว่าฉันจะพลาดบางสิ่งบางอย่าง

7

ผู้ชาย ssh:

     ssh reads ~/.ssh/environment, and adds lines of the format
     “VARNAME=value” to the environment if the file exists and users are
     allowed to change their environment.  For more information, see the
     PermitUserEnvironment option in sshd_config(5).

แก้ไข:

หนูฉันหวังว่ามันจะอยู่ข้างๆถ้ายังมีความประสงค์มีทาง ผู้ชาย ssh_conf:

SendEnv
             Specifies what variables from the local environ(7) should be sent
             to the server.  Note that environment passing is only supported
             for protocol 2.  The server must also support it, and the server
             must be configured to accept these environment variables.  Refer
             to AcceptEnv in sshd_config(5) for how to configure the server.
             Variables are specified by name, which may contain wildcard char-
             acters.  Multiple environment variables may be separated by
             whitespace or spread across multiple SendEnv directives.  The
             default is not to send any environment variables.

ขึ้นอยู่กับการกำหนดค่าของ sshd ที่จุดรับซึ่งอาจเป็นหรืออาจไม่เป็นไปตามข้อกำหนดของ "ไม่มีการแก้ไขไฟล์ระยะไกล"


1
ใช่ แต่นี่คือการกำหนดค่าในด้านระยะไกลและฉันต้องการ / ต้องการบางสิ่งที่เปลี่ยนแปลงเฉพาะภายในเครื่องเท่านั้น

4
SendEnv ไม่เกี่ยวข้อง มันสามารถเป็นไปได้ส่งตัวแปร env เพิ่มเติม แต่ 1. มันไม่สามารถแก้ไขได้และ 2. คำจะถูกส่งต่อไปแม้จะไม่ได้อยู่ใน SendEnv

5

นี่เป็นวิธีแก้ปัญหาที่รวดเร็วและสกปรกของฉันที่ฉันเพิ่งโยนเข้าด้วยกัน ฉันต้องการสิ่งที่ดีกว่า ฉันเดาว่าฉันสามารถใช้เชลล์สคริปต์แทน การปรับTERMค่าจะถูกปล่อยไว้เป็นแบบฝึกหัดให้กับผู้อ่าน

# To move into a separate plugin...
function ssh {
   if [[ "${TERM}" = screen* || konsole* ]]; then
     env TERM=screen ssh "$@"
   else
     ssh "$@"
   fi
}

เป็นการดีที่มันจะทำอะไรบางอย่างเช่นตรวจสอบระยะเวลาในด้านอื่น ๆ โดยใช้ControlPersistสิ่งที่จะป้องกันไม่ให้เกิดความล่าช้านานสำหรับการเชื่อมต่อหลาย ๆ


ขอบคุณ! ฉันทำอะไรเช่นนี้ แต่แทนที่จะตรวจสอบค่าเฉพาะของ$TERMด้วยif/ elseสร้างฉันใช้$(echo -n "$TERM" | sed -e s/tmux/screen/)เพื่อแทนที่ "tmux" ที่มีปัญหาในเงื่อนไขท้องถิ่นของฉันด้วยประเภท "หน้าจอ" ที่ยอมรับมากขึ้น ( แหล่งที่มาที่นี่ )
ชนะ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.