프롬프트에 sshfs 마운트 지점이 반영됩니까?

프롬프트에 sshfs 마운트 지점이 반영됩니까?

원격 폴더를 로컬 컴퓨터에 원격으로 마운트하는 데 사용하고 있습니다 . sshfs문제는 local실수로 원격 폴더에 해를 끼치는 것을 방지하기 위해 로컬 컴퓨터의 원격 폴더 위나 아래에서 작업하고 있음을 알 수 있는 방법이 필요하다는 것입니다.

내가 현재 원격 마운트 지점에 있다는 것을 zsh/bash 프롬프트에 반영하여 보다 신중하게 작업을 수행하려면 어떻게 해야 합니까?

예: 이제 sshfs 로 CD를 실행하면 다음을 사용하여 마운트된 폴더 local_of_remote_mountpoint라는 메시지가 표시됩니다 .sshfsuser@host: sshfs% ls

답변1

여기서 우리는 두 가지 다른 문제에 직면합니다.

  1. 현재 작업 디렉터리(PWD)가 sshfs다음으로 마운트된 파일 시스템에 있는지 확인하는 방법:
  2. 쉘 프롬프트에서 포인트 1을 반영하는 방법.

현재 작업 디렉토리가 마운트된 파일 시스템의 일부입니까 sshfs?

PWD를 장착 지점과 비교하는 것은 신뢰할 수 없습니다. 예를 들어 해당 구성 요소가 탑재 지점에 대한 기호 링크인 경우 PWD가 작동하지 않을 수 있습니다.

GNU/Linux에서는 df및 같은 도구를 사용하여 findmnt디렉터리가 있는 마운트 지점을 결정할 수 있습니다. 또한 둘 다 에 의해 FSTYPE설정된 파일 시스템의 속성을 보고할 수 있습니다 .fuse.sshfssshfs

따라서 다음을 확인할 수 있습니다.

# df always prints a header line, we want to skip it
[ "fuse.sshfs" = "$(df --output=fstype . | tail -n +2)" ] && ...

또는:

[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target .)" ] && ...

이 테스트를 스크립트로 래핑하여 에서 사용할 수 있게 만들 수 있습니다 PATH.check_sshfs_mp

#!/bin/sh
[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target .)" ] && exit 0
exit 1

현재 마운트 지점을 기반으로 쉘 프롬프트를 어떻게 설정합니까?

bash두 가지 모두 에서 기본 프롬프트로 확장되는 쉘 변수를 zsh설정할 수 있습니다 .PS1

bash관련 함수 주위의 래퍼에서 이 작업을 수행 할 수 있습니다 : cd, pushdpopd(크레디트:"조건부 PS1"에 대한 답변을 주셔서 감사합니다cd나뿐만이 아니라는 점을 상기시켜 주세요 . 다음 코드를 다음 항목에 추가하세요 ~/.bashrc.

cd () { builtin cd "$@" && chpwd; }

pushd () { builtin pushd "$@" && chpwd; }

popd () { builtin popd "$@" && chpwd; }

chpwd () {
    normal='\[\e[0m\]'
    red='\[\e[1;31m\]'
    PS1='[\u@\h \W]\$ '
    if command -v check_sshfs_mp > /dev/null 2>&1; then
        check_sshfs_mp && PS1='[\u@\h '"$red"'R'"$normal"' \W]\$ '
    fi
}

함수 는 종료 상태가 이면 빨간색 문자를 chpwd호출 check_sshfs_mp하고 추가합니다 . 원하는 대로 기본값을 조정해야 할 수도 있습니다 .0RPS1
PS1

현재 작업 디렉토리가 변경될 때마다 특별한 기능이 실행되기 zsh때문에 다소 간편합니다 . (참고: Z Shell 매뉴얼,zshchpwd특수 기능). 함께 실행되는 후크 기능 배열에 프롬프트 설정 기능을 추가할 수 있습니다 chpwd.
사용하지 않는다고 가정하면사용자 기여간섭 프롬프트 설정에 다음 코드를 추가할 수 있습니다 ~/.zshrc.

chpwd_check_sshfs_mp () {
    PS1='%m%# '
    if command -v check_sshfs_mp > /dev/null 2>&1; then
        check_sshfs_mp && PS1='%m %F{red}R%f %# '
    fi
}
chpwd_functions+=( chpwd_check_sshfs_mp )

이번에도 R성공 시 기본 프롬프트에 빨간색을 추가합니다.chech_sshfs_mp

터미널을 실행하는 PWD가 마운트된 파일 시스템에 있는 경우 cd후크 기능을 래핑하고 추가해도 프롬프트가 올바르게 설정되었는지 확인할 수 없습니다. 올바른 프롬프트를 트리거하려면 최소한 a가 필요합니다. 이는 오해의 소지가 있을 수 있습니다.chpwd_functionssshfscd

zsh실행 프롬프트 주제에 대한 사용자 기여에는 다음이 필요합니다.애드 혹사용자 정의 프롬프트에 대한 솔루션입니다.
다음 명령을 사용하여 프롬프트 주제를 끌 수 있습니다.

prompt off

이 코드를 시험해 보겠습니다.


의견에서 제기된 핵심 사항을 통합합니다 zsh.

프롬프트 색상을 지정하려는 경우ANSI 이스케이프 시퀀스(색상 이름 대신) PS1위 스니펫의 할당 줄을 다음과 같이 변경할 수 있습니다.

check_sshfs_mp && PS1="$(print '%m %{\e[1;31m%}R%{\e[0m%} %# ')"

또는

PS1='%m'"$(check_sshfs_mp && print '%{\e[1;31m%} R %{\e[0m%}')"'%# '

s는 실제 이스케이프 문자로 변환되어야 print하며 프롬프트 코드에서 오작동을 방지하려면 해당 형식을 사용해야 합니다. 참고 자료: 자주 묻는 질문:\e%{...%}zshcolor xterm에서 색상 힌트를 얻는 방법은 무엇입니까?

기본 프롬프트가 설정될 때마다 확인을 수행하려면 후크 기능을 추가하지 않고 chpwd_functions다음 항목에 추가하면 됩니다 .zshrc.

setopt PROMPT_SUBST
export PS1='%m$(check_sshfs_mp && print "%{\e[1;31m%} R %{\e[0m%}")%# '

PROMPT_SUBST이 옵션은 프롬프트 표시에서 명령 대체를 활성화하는 데 필요합니다. 인용하다:급속한 확장Z Shell 매뉴얼에 있습니다.

답변2

@fra.san이 제안한 대로 LOCAL 프롬프트를 조정하여 PS1사용되는 경로의 폴더를 반영하도록 수정할 수 있습니다 sshfs.

먼저 터미널이 색상 힌트를 지원하는지 확인하세요. ~/.kshrc연도 에는 다음을 포함하십시오 ~/.bashrc.

# Option is turned off by default to not distract the user.
force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # you have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). If support lacks use `setf` rather than `setaf`.
        color_prompt=yes
    else
        color_prompt=""
    fi
fi

다음으로, 래퍼를 사용하여 로컬 FS에 원격 볼륨을 마운트할 때마다 sshfs_wrp마운트된 원격 볼륨의 경로가 임시 파일에 자동으로 추가됩니다. 예를 들어 /tmp/tmp_rem_volsshfs 명령의 간단한 래퍼를 사용하여 이 작업을 수행할 수 있습니다.

#!/usr/bin/sh
# script name: sshfs_wrp   # wrapper for sshfs
mount_path="$( echo "$@"| cut -d" " -f $# )"  # usually last parameter to `sshfs`
# Note: above will break when parameters passed to sshfs_wrp 
# contain blanks between quotes. 
echo "$mount_path" >> /tmp/tmp_rem_vol
sshfs "$@" 
exit 0

스크립트가 실행 가능하고 PATH 환경 변수를 통해 해당 위치에 액세스할 수 있는지 확인하세요.

~/.kshrc그런 다음 문자열이 이전에 를 사용하여 마운트한 원격 볼륨 하위 트리에서 현재 작업 중임을 나타내는 경우 ~/.bashrc플래그 변수를 설정하기 위해 또는 에 함수를 정의합니다 . 휴대성 때문에 사용하고 있어요 .remFlag[R]"$(pwd)"sshfs_wrpcase
편집하다: case패턴 일치 부분에서 일치 항목이 발견 되면 while 루프를 종료해야 합니다.

function check_rem_vol () {
    if [ -s /tmp/tmp_rem_vol ] ; then
        while read rem_vol; do
            case "$(pwd)" in 
                # check whether pwd contains sshfs_wrp-mounted volume 
                *"${rem_vol}"*) remFlag="[R]" ; break  ;;  
                *) remFlag="" ;;
            esac
        done < /tmp/tmp_rem_vol
    else
        remFlag=""
    fi
    echo "$remFlag"
}

PS1마지막으로 ~/.kshrcyr 에 있는 yr 프롬프트를 수정하거나 yr 를 사용하여 일부 원격 볼륨이 마운트된 경우 밝은 녹색으로 나타나도록 ~/.bashrc프롬프트에 원격 볼륨 플래그를 포함시켜 수정합니다 .rem_volsshfs_wrp

if [ "$color_prompt" = yes ]; then
    # For Debian based systems only
    #PS1="${debian_chroot:+($debian_chroot)}\[\e[0;38;5;166m\][\#/\!]\[\e[1;34m\] \w\[\e[38;5;46m\] \$(check_rem_vol)\[\e[1;38;5;166m\]>\[\e[0m\]"

    # For Archlinux
    PS1="\\[\\e[0;38;5;166m\\][\\#/\\!]\\[\\e[1;34m\\] \\w\\[\\e[38;5;46m\\] \$(check_rem_vol)\\[\\e[1;38;5;166m\\]\\> \\[\\e[0m\\]"
else
    # For Debian based systems only
    #PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    #PS1="${debian_chroot:+}[\#/\!] \[\w \$(check_rem_vol)\]>"

    # For Archlinux
    PS1="[\\#/\\!] \\[\\w \$(check_rem_vol)\\]>"
fi
export PS1
unset color_prompt force_color_prompt

/tmp/tmp_rem_vol여러 SSH 연결이 공존하고 원격 볼륨이 다른 원격 호스트에서 마운트되는 경우 움직이는 부분의 수를 줄이고 임시 파일 또는 여러 임시 파일 생성을 개선하도록 솔루션을 개선할 수 있습니다.

bash이는 Debian 또는 Arch Lx 플랫폼 이나 셸 내의 SSH 연결 에서 작동합니다 .ksh

/tmp/tmp_rem_vol또한 원격 볼륨이 마운트 해제되거나 세션이 로그오프되거나 SSH 연결이 닫힐 때 지속성 문제를 방지하려면 지우기에 주의해야 합니다 . 또한 이를 자동화하기 위한 많은 참조 자료와 팁도 찾을 수 있습니다.

화타이

관련 정보