แก้ไขชื่อเทอร์มินัลหลังจากการบันทึกระยะไกล SSH ไปยังเครื่องอื่น


18

ตอนนี้ฉันกำลังใช้รหัส perl หนึ่งบรรทัดเพื่อเปลี่ยนชื่อของแถบเทอร์มินัลของฉัน

print("\e]0;@ARGV\7");

แต่ทุกครั้งหลังจากที่ฉัน ssh ไปยังเครื่องระยะไกลอื่นชื่อจะถูกแก้ไขโดยโฮสต์ (ซึ่งฉันไม่ได้ใส่ใจโดยเฉพาะอย่างยิ่ง) แต่หลังจากฉันออกจากการเชื่อมต่อชื่อที่แก้ไขจะยังคงอยู่ มีวิธีแก้ไขปัญหานี้หรือไม่? เป็นหลักฉันต้องการชื่อคงที่สำหรับอาคารของฉันเมื่อทำงานในพื้นที่

ฉันใช้ xfce terminal และ terminator เป็นหลักภายใต้ CentOS หรือ Debian ขอบคุณ

แก้ไข

ความละเอียดอ่อนอีกประการหนึ่งคือการมีเทอร์มินัลทั้งหมดในชื่อเดียวกันฉันต้องการที่จะมีอิสระในการแก้ไขชื่อเรื่องได้ทันที แต่ห้ามเซสชั่น SSH เพียงอย่างเดียวจากการแก้ไขสิ่งที่ฉันแก้ไข

คำตอบ:


6

ฉันไม่รู้เกี่ยวกับชื่อหน้าต่าง แต่ฉันพยายามให้ระบบของฉันทำบางสิ่งบางอย่างในการยกเลิกเซสชัน ssh - จริง ๆ แล้วหลังจากสิ้นสุดเซสชัน ssh ในระยะสั้น: มันไม่ทำงานอย่างนั้น โดยทั่วไปคุณมีสามตัวเลือก:

  1. เขียน wrapper รอบ ssh คือเชลล์สคริปต์ที่สามารถเรียกทำงานได้sshซึ่งมีความสำคัญกว่า/usr/bin/sshใน $ PATH ของคุณซึ่งมีบรรทัดexec /usr/bin/ssh $@อยู่ตรงกลาง สิ่งนี้ช่วยให้คุณสามารถให้เชลล์ทำบางสิ่งก่อนและหลังการรันไบนารี ssh ที่มีประสิทธิภาพในขณะที่รักษา eoverhead ไว้ให้น้อยที่สุด

  2. เขียนแพตช์กับแหล่งที่มาของ SSH ที่คุณเลือกเพื่อให้เบ็ดการล้างข้อมูลที่ดำเนินการคำสั่งเชลล์ที่ส่งผ่านทาง commandline หรือการตั้งค่าบางอย่าง นั่นคือสิ่งที่เราต้องการ

  3. มีการประเมินการส่งออกของPROMPT_COMMAND historyโดยทั่วไปแล้วเป็นวิธีที่ทั่วไปและน่าเกลียดมากกว่า 1


โดยทั่วไปฉันเพิ่งเขียนสคริปต์ง่ายๆเพื่อคว้าชื่อปัจจุบันและบันทึกไว้ก่อนเซสชัน SSH แล้วกู้คืนชื่อหลังจากนั้น
nye17

4
@ nye17 คุณสามารถโพสต์สคริปต์โซลูชันที่คุณใช้หรือไม่
Reg Mem

ฉันโพสต์สคริปต์โซลูชันด้านล่าง ควรตรงกับสิ่งที่ @ nye17 ทำ unix.stackexchange.com/a/341277/112190
phyatt

7

การแก้ไข: เพิ่มฟังก์ชั่นบางอย่าง ~ / .bashrc เพื่อทำบางสิ่งหลังจากคำสั่ง ssh และ su

function title()
{
   # change the title of the current window or tab
   echo -ne "\033]0;$*\007"
}

function ssh()
{
   /usr/bin/ssh "$@"
   # revert the window title after the ssh command
   title $USER@$HOST
}

function su()
{
   /bin/su "$@"
   # revert the window title after the su command
   title $USER@$HOST
}

หมายเหตุ: รีสตาร์ท bash หลังจากแก้ไขเป็น ~ / .bashrc

ตัวอย่าง:

# title is "user1@boxA"
ssh boxB  # auto changes title while on boxB to "user1@boxB"
exit
# title returns back to "user1@boxA" because of our title call in ssh()
su - user2 # auto changes title while switched user to user2: "user2@boxA"
exit
# title returns back to "user1@boxA" because of our title call in su()

หวังว่าจะช่วย


ไม่ถูกต้องเล็กน้อยที่จะพูดrevertในขณะที่คุณไม่ได้ตรวจสอบเพื่อดูว่ามันคืออะไรก่อน ... ถ้าคุณสอบถามและบันทึกค่าก่อนหน้านี้ ;-)
พฤศจิกายน

4

กำหนดค่าโลคอลเชลล์ dotfile ของคุณ (เช่น$PROMPT_COMMANDใน~/.bashrc) เพื่อตั้งชื่อเทอร์มินัลอย่างเหมาะสมโดยใช้กลไกเดียวกัน

ตัวอย่างเช่น:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"

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

คำสั่งพรอมต์ปล่อยลำดับหนีที่จำเป็นสำหรับเทอร์มินัลของคุณเพื่อเปลี่ยนชื่อแถบหัวเรื่อง :)
Reinstate Monica

แต่ฉันยังต้องการอิสระที่จะเปลี่ยนชื่อเทอร์มินัลที่ฉันต้องการแทนที่จะให้ชื่อเดียวกันทุกเซสชั่นเดียว ในทางปฏิบัติฉันโดยทั่วไปแก้ไขคู่มือชื่อเทอร์มินัลและหวังว่าเทอร์มินัลจะยังคงมีชื่อคงที่แม้หลังจากการเข้าสู่ระบบ / ออกจาก SSH มันสมเหตุสมผลหรือไม่
nye17

1
ดังนั้นจากนั้นใส่ชื่อเรื่องที่ต้องการในตัวแปรแล้วส่งออก
Ignacio Vazquez-Abrams

หากคุณใช้ลำดับการยกเว้นเทอร์มินัลนี้เพื่อตั้งค่าหัวเรื่องเป็นโมฆะ (เช่นexport PROMPT_COMMAND="printf '\e]0;\7\n'") ตัวจำลองเทอร์มินัลของคุณสามารถตั้งชื่อหน้าต่างตามที่เห็นสมควร เมื่อคุณ ssh ไปยังรีโมตโฮสต์ที่ตั้งค่าชื่อเทอร์มินัลเครื่องจำลองเทอร์มินัลของคุณจะแสดงชื่อนั้นและเมื่อคุณออกจากระบบมันจะเปลี่ยนกลับไปใช้ชื่อของตัวเอง อย่างน้อยนั่นก็เป็นวิธีที่แอป Terminal ของ MacOS ทำงาน
claymation

3

เพิ่มบรรทัดเหล่านี้ไปที่ ~ / .bashrc

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

    ;;
*)
    ;;
esac

ทำงานได้ดีกับ linux ที่ใช้เดเบียน


1
มันไม่ได้ตั้งชื่อแม้ว่า ...
Bananguin

มันใช้งานได้ดีกว่าใช้PROMPT_COMMANDแทนการใช้PS1เนื่องจากคุณไม่จำเป็นต้องใส่\[ \]bracketing และสามารถกำจัดข้อความบางส่วนได้
Chris Page

2

ทางออกหนึ่งคือการเปลี่ยนตัวแปรเทอร์มินัลเป็น vt100 ก่อนที่จะส่งเช่นรัน

export TERM=vt100

วิธีนี้ใช้งานได้เนื่องจากสคริปต์การเริ่มต้นมักจะดูที่ตัวแปรเทอร์มินัลและเปลี่ยนเฉพาะชื่อเป็น xterm คุณสูญเสียหน้าจอสีและคุณสมบัติอื่น ๆ ที่คุณอาจจะชอบหรือไม่ชื่นชม

หากคุณต้องการให้ terminal ท้องถิ่นเป็น xterm, นามแฝง ssh เพื่อเปลี่ยนตัวแปร terminal ในทันทีเช่น

alias ssh='TERM=vt100 /usr/bin/ssh'

มันเปลี่ยนวิธีการแสดงสิ่งต่าง ๆ ไม่แสดงสี
npk

0

ฉันแก้ไขปัญหานี้โดยการเพิ่มสิ่งนี้ลงใน PS1 ของฉันในไฟล์. bashrc ของฉัน

\[\e]2;\u@\H:\w\a\]

ดังนั้นทั้งบรรทัดจะเป็นแบบนี้ (ฉันปรับแต่ง PS ของฉันแล้ว:

export PS1='\[\e]2;\u@\H:\w\a\]\n($LOGNAME@$HOSTNAME) \t\n[$PWD]: '

ฉันหวังว่าจะช่วยเหลือผู้อื่น


หากคุณใช้ลำดับการยกเว้นเทอร์มินัลนี้เพื่อตั้งค่าหัวเรื่องเป็นโมฆะ (เช่นexport PS1='\[\033]0;\007\]\h:\W \u\$ ') ตัวจำลองเทอร์มินัลของคุณสามารถตั้งชื่อหน้าต่างตามที่เห็นสมควร เมื่อคุณ ssh ไปยังรีโมตโฮสต์ที่ตั้งชื่อเทอร์มินัลเครื่องจำลองเทอร์มินัลของคุณจะแสดงว่าและเมื่อคุณออกจากระบบมันจะกลับไปใช้ชื่อของตัวเอง อย่างน้อยนั่นก็เป็นวิธีที่แอป Terminal ของ MacOS ทำงาน
claymation

0

คำตอบอื่น ๆ จะไม่ทำงานสำหรับฉันเมื่อฉันออกจาก SSH แต่ให้ฉันปิด การเพิ่มการเปลี่ยนชื่ออัตโนมัติของ setw ทำงานเมื่อฉันออกจากเซสชัน ssh จากระยะไกลดังนั้นมันจึงเปลี่ยนชื่ออัตโนมัติและไม่ต้องออกจากหน้าต่างอีกต่อไปเพื่อรีเซ็ต [มกราคม 2561 - เดเบียน 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.