원격 폴더를 로컬 컴퓨터에 원격으로 마운트하는 데 사용하고 있습니다 . sshfs
문제는 local
실수로 원격 폴더에 해를 끼치는 것을 방지하기 위해 로컬 컴퓨터의 원격 폴더 위나 아래에서 작업하고 있음을 알 수 있는 방법이 필요하다는 것입니다.
내가 현재 원격 마운트 지점에 있다는 것을 zsh/bash 프롬프트에 반영하여 보다 신중하게 작업을 수행하려면 어떻게 해야 합니까?
예: 이제 sshfs 로 CD를 실행하면 다음을 사용하여 마운트된 폴더 local_of_remote_mountpoint
라는 메시지가 표시됩니다 .sshfs
user@host: sshfs% ls
답변1
여기서 우리는 두 가지 다른 문제에 직면합니다.
- 현재 작업 디렉터리(PWD)가
sshfs
다음으로 마운트된 파일 시스템에 있는지 확인하는 방법: - 쉘 프롬프트에서 포인트 1을 반영하는 방법.
현재 작업 디렉토리가 마운트된 파일 시스템의 일부입니까 sshfs
?
PWD를 장착 지점과 비교하는 것은 신뢰할 수 없습니다. 예를 들어 해당 구성 요소가 탑재 지점에 대한 기호 링크인 경우 PWD가 작동하지 않을 수 있습니다.
GNU/Linux에서는 df
및 같은 도구를 사용하여 findmnt
디렉터리가 있는 마운트 지점을 결정할 수 있습니다. 또한 둘 다 에 의해 FSTYPE
설정된 파일 시스템의 속성을 보고할 수 있습니다 .fuse.sshfs
sshfs
따라서 다음을 확인할 수 있습니다.
# 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
, pushd
및 popd
(크레디트:"조건부 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
하고 추가합니다 . 원하는 대로 기본값을 조정해야 할 수도 있습니다 .0
R
PS1
PS1
현재 작업 디렉토리가 변경될 때마다 특별한 기능이 실행되기 zsh
때문에 다소 간편합니다 . (참고: Z Shell 매뉴얼,zsh
chpwd
특수 기능). 함께 실행되는 후크 기능 배열에 프롬프트 설정 기능을 추가할 수 있습니다 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_functions
sshfs
cd
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
%{...%}
zsh
color 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_vol
sshfs 명령의 간단한 래퍼를 사용하여 이 작업을 수행할 수 있습니다.
#!/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_wrp
case
편집하다: 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
마지막으로 ~/.kshrc
yr 에 있는 yr 프롬프트를 수정하거나 yr 를 사용하여 일부 원격 볼륨이 마운트된 경우 밝은 녹색으로 나타나도록 ~/.bashrc
프롬프트에 원격 볼륨 플래그를 포함시켜 수정합니다 .rem_vol
sshfs_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 연결이 닫힐 때 지속성 문제를 방지하려면 지우기에 주의해야 합니다 . 또한 이를 자동화하기 위한 많은 참조 자료와 팁도 찾을 수 있습니다.
화타이