đổi tên tên cửa sổ tmux thành tên máy chủ prompt_command, ps1 hoặc ssh từ xa?


25

Tôi rất thích có thể tự động đổi tên tiêu đề cửa sổ tmux của mình thành prompt_command, ps1 hoặc chỉ tên máy chủ của máy tôi ssh. Có 9 cửa sổ được mở nhãn "ssh" thực sự vô dụng. Làm sysadmin làm việc tôi mở màn hình mới và ssh xung quanh nhiều để đổi tên chúng theo cách thủ công.

Một điều tôi nhận thấy là tmuxcập nhật xtermtiêu đề cửa sổ để tôi cảm thấy như nó phải biết.

Có ai giúp đỡ không? Tôi thậm chí sẽ sẵn sàng quay lại screennếu tôi có thể có được tính năng này.

Câu trả lời:


15

Tôi không biết cách nào để khiến nó nhìn PS1trực tiếp vào bạn .

Tuy nhiên, tmuxhiểu các lệnh tương tự để đặt tên cửa sổ như screenvậy.

Vì vậy, bạn có thể định nghĩa một chức năng như thế này trong ~/.bashrchoặc ~/.zshrc:

settitle() {
    printf "\033k$1\033\\"
}

và sau đó gọi settitletừ bất cứ đâu.

Ví dụ: bạn có thể đưa nó vào PS1biến của mình , vd

PS1='$HOST:$PWD$(settitle $HOST:$PWD)$ '

hoặc thông qua PROMPT_COMMAND:

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

Bây giờ tôi hiểu rằng bạn đã tmuxchạy trên máy tính để bàn của bạn và bạn muốn sshcác lệnh có tên máy chủ hơn là ssh, điều đó dễ dàng hơn nhiều.

Nếu bạn đã thêm vào settitleđịa phương của mình ~/.bashrc, tất cả những gì bạn muốn làm là thêm điều này:

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

Thay thế bash bằng zsh, hoặc một cái gì đó phù hợp hơn nếu cần thiết.


Điều này thực sự không đặt tên tiêu đề cửa sổ cho tên máy chủ của hộp từ xa mà không có thiết lập .bashrc trên hộp từ xa. Cảm ơn bạn mặc dù tôi đã học được một số khéo léo.
dùng68782

Nếu tất cả những gì bạn muốn là tên máy chủ ở phía địa phương của bạn, điều đó dễ dàng hơn nhiều. Đợi một chút ...
Mikel

rực rỡ! cảm ơn bạn. Xin lỗi, tôi không thể giải thích yêu cầu của mình dẫn đến hai câu hỏi. một lần nữa cám ơn!
user68782

Khi tmux thay đổi tiêu đề cửa sổ của nó theo ý thích, điều này có thể nhanh chóng bị ghi đè bởi các thay đổi bình thường đối với tiêu đề cửa sổ bởi tmux.
UtahJarhead

Cảm ơn! Tôi đã sử dụng PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- vì với mã của @ Mikel, tôi không có tên máy chủ và -bash: : No such file or directorylỗi trước mỗi dấu nhắc lệnh. Dường như với tôi rằng $()bash sẽ cố gắng thực hiện bất cứ điều gì settitle trả về . (Tôi đang chạy bash trên linux.)
tuomassalo

35

tmux rename-window -t${TMUX_PANE} "Title Text"

Đây là cách thích hợp để đặt tiêu đề tmux trong một cửa sổ. Biến $ TMUX_Pane được đặt bởi tmux và được sử dụng để phân biệt giữa các bảng khác nhau.


2
Vì đó là cửa sổ hoạt động, tôi không nghĩ -t${TMUX_PANE}là cần thiết (ít nhất là nó không dành cho tôi).
Christopher

8
@Christopher Nếu bạn đang chạy, nói sleep 3và chuyển đổi các cửa sổ, lời nhắc khác sẽ đưa lệnh đến cửa sổ sai khi chế độ ngủ hoàn tất. (Đây là lý do tôi đến đây, +1).
quornian

16

Chỉ dành cho những người đến đây bằng cách tìm kiếm cách thay đổi tiêu đề của phiên tmux:

Ctrl+ B,$

Điều này sẽ cung cấp cho bạn một lời nhắc, nơi bạn có thể đổi tên phiên hoạt động.

Để thay đổi cửa sổ hoạt động, sử dụng komma thay thế:

Ctrl+ B,,

xem: Làm thế nào để tôi đổi tên một phiên trong tmux?


8

Kết hợp cả câu trả lời của Mikel và UtahJarhead, tôi đã sử dụng cách sau .zshrcđể giải quyết vấn đề này:

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

Tôi có chức năng đổi tên cửa sổ tự động được bật theo mặc định và tôi không thể tìm cách bật lại nó sau khi thoát khỏi máy chủ từ xa. Vì vậy, tôi chỉ thoát khỏi cửa sổ hoàn toàn - không phải là vấn đề đối với quy trình làm việc của tôi. Nếu bạn muốn đổi tên nó thành 'bash', bạn có thể thay thế exitdòng này bằng tmux rename-window "bash".


1
Tôi đang sử dụng cửa sổ đổi tên tmux hostname -ssau lệnh ssh "@ $", về cơ bản nó "đặt lại" tiêu đề cho máy "gateway" của tôi.
andrei

7

Thay vì exithoặc tmux rename-window "bash"bạn có thể sử dụng

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

Điều này kích hoạt lại chức năng bình thường đổi tên cửa sổ tự động cho các lệnh tiếp theo.

Các ifngăn chặn khối từ (mà không có nó) đổi tên tmuxcửa sổ hiện tại từ sshcác lệnh được sử dụng trên vỏ khác (trong số tmux).


Tôi đã đi if env | grep -q "TMUX_PANE"; thenthay vì các ps -p...công cụ, nhưng cùng một nguyên tắc.
nguyên tử

1

Tôi biết điều này đã được trả lời từ lâu, nhưng tôi nghĩ rằng tôi sẽ thêm những gì tôi đã tìm hiểu và tìm thấy (dựa trên câu trả lời được chấp nhận) .. Tôi đã thêm nó vào / etc / bashrc của tất cả các máy chủ của tôi (dễ dàng làm với vải, con rối, vv)

settitle() {
    printf "\033k$1\033\\"
}
bash_prompt_command() {
    settitle "`hostname -s`:$PWD"
}
PROMPT_COMMAND=bash_prompt_command

Và nó tự động đặt tên cửa sổ trong màn hình hoặc tmux.


chúng tôi sử dụng dns nội bộ, do đó hostname -sloại bỏ các công cụ tên miền bổ sung, để server1.iternal.local hiển thị dưới dạng server1
Brian

1

Một giải pháp khác là đổi tên cửa sổ hiện hoạt thành tên trước đó, sau phiên ssh:

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}

0

Điều này hoạt động cho tmux 2.1và với zsh cục bộ và trên các máy chủ:

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

Tôi đã phải vô hiệu hóa tùy chọn cho phép đổi tên theo cách thủ công trước khi thay đổi tên cửa sổ - nếu không nó đã bị thay đổi thành đường dẫn hiện tại trên hầu hết các máy chủ của tôi (cũng sử dụng zsh ở đó). Điều tốt là: nếu bạn kích hoạt tùy chọn cho phép đổi tên, nó hoạt động ngay lập tức.


0

Thêm cái này vào .profilehoặc.bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}

0

Tôi sẽ lưu ý trong tất cả các ví dụ này với:

command ssh "$@"

Bạn có thể muốn lấy mã thoát và thoát khỏi chức năng với nó, nếu không thì những thứ như:

ssh server false

Sẽ trả về 0.

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

Sẽ thoát ssh với mã trả về của ssh.

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.