AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 501789
Accepted
Tuyen Pham
Tuyen Pham
Asked: 2019-02-21 00:24:01 +0800 CST2019-02-21 00:24:01 +0800 CST 2019-02-21 00:24:01 +0800 CST

Prompt para refletir o ponto de montagem sshfs?

  • 772

Eu uso sshfspara montar remotamente uma pasta remota na minha máquina local, o problema é que preciso de uma maneira de saber que estou trabalhando na pasta remota na máquina local OU localna pasta para evitar acidentalmente prejudicar a remota.

Como ter o prompt zsh/bash para refletir que estou atualmente no ponto de montagem remoto, para que eu faça as ações com mais cuidado?

Exemplo: sshfs agora quando eu cd para local_of_remote_mountpoint, o prompt me notificará que esta é a pasta que foi montada usando sshfscomo:user@host: sshfs% ls

zsh arch-linux
  • 2 2 respostas
  • 355 Views

2 respostas

  • Voted
  1. Best Answer
    fra-san
    2019-02-22T05:37:16+08:002019-02-22T05:37:16+08:00

    Enfrentamos dois problemas distintos aqui:

    1. Como saber se o diretório de trabalho atual (PWD) está em um sistema de arquivos montado por sshfs;
    2. Como refletir o ponto 1 no prompt do shell.

    O diretório de trabalho atual é parte de um sistema de arquivos montado por sshfs?

    Comparar PWD com pontos de montagem não é confiável. Pode não funcionar, por exemplo, se um componente do seu PWD for um link simbólico para um ponto de montagem.

    No GNU/Linux, as ferramentas como dfe findmntsão capazes de determinar o ponto de montagem em que um diretório está. Além disso, ambos podem relatar o FSTYPEatributo de um sistema de arquivos, que é definido fuse.sshfspara aqueles montados por sshfs.

    Você pode, assim, verificar com:

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

    ou:

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

    Você pode envolver esse teste em um script e disponibilizá-lo em seu arquivo PATH. Aqui vamos chamá-lo check_sshfs_mp:

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

    Como definir o prompt do shell com base no ponto de montagem em que estamos?

    Em ambos bashe zshvocê pode definir a PS1variável shell, que é expandida como o prompt principal.

    Em bashvocê pode fazer isso em wrappers para as funções relevantes: cd, pushdepopd (créditos: graças a esta resposta a "Conditional PS1" por me lembrar que cdnão é o único), adicionando este código ao seu ~/.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
    }
    

    A chpwdfunção invocacheck_sshfs_mp e, se seu status de saída for 0, adiciona uma única Rletra vermelha a PS1.
    Você pode querer ajustar o valor padrão de de PS1acordo com suas preferências.

    Nele zshé um pouco mais fácil, pois zshexecuta a chpwdfunção especial sempre que o diretório de trabalho atual é alterado (referências: The Z Shell Manual, Special Functions ). Você pode adicionar uma função de configuração de prompt à matriz de funções de gancho que são executadas junto com chpwd.
    Supondo que você não esteja usando contribuições de usuários que interfiram na configuração do prompt, você pode adicionar este código ao seu ~/.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 )
    

    Novamente, estamos simplesmente adicionando um vermelho Rao prompt principal quando for bem- chech_sshfs_mpsucedido.

    Observe que o embrulhocd e adicionar uma chpwd_functionsfunção de gancho não garantirá que o prompt seja definido corretamente se o PWD em que seu terminal foi iniciado estiver em um sshfssistema de arquivos montado. Você precisará de pelo menos um cdpara acionar o prompt correto, e isso pode ser enganoso.

    As contribuições do usuário para a zshcriação de temas de prompt exigirão soluções ad-hoc para personalizar os prompts.
    No entanto, você pode encerrar o tema de prompt com

    prompt off
    

    para experimentar este código.


    Integrando os pontos levantados nos comentários sobrezsh :

    Se você preferir especificar a coloração do prompt com sequências de escape ANSI (em vez de nomes de cores), poderá alterar a PS1linha de atribuição no trecho de código acima para:

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

    ou

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

    Observe que printé necessário transformar \es em caracteres de escape reais e o %{...%}formulário é necessário para evitar que o código do prompt se comporte mal. Referência: zshFAQ: Como obtenho prompts coloridos no meu color xterm?

    Se você preferir que a verificação seja executada toda vez que o prompt principal for definido, evite adicionar uma função de gancho chpwd_functionse adicionar ao seu .zshrc:

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

    A PROMPT_SUBSTopção é necessária para habilitar a substituição de comando na exibição do prompt. Referência: Expansão Prompt no Manual do Z Shell.

    • 3
  2. Cbhihe
    2019-02-21T05:51:49+08:002019-02-21T05:51:49+08:00

    Na linha do que @fra.san sugeriu, você pode modificar seu prompt LOCAL ajustando PS1para que reflita o fato de que uma pasta no caminho foi montada usando sshfs.

    Primeiro, verifique se o terminal yr suporta prompts de cores. Inclua o seguinte no ano ~/.kshrcou ~/.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
    

    Em seguida, toda vez que você montar um volume remoto em seu FS local com o wrapper sshfs_wrp, anexe automaticamente o caminho para esse volume remoto montado em um arquivo temporário, por exemplo /tmp/tmp_rem_vol. Você pode fazer isso com um simples wrapper para o comando 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
    

    Certifique-se de que o script seja executável e sua localização seja alcançável com a variável de ambiente PATH.

    Em seguida, defina uma função em seu ~/.kshrcou ~/.bashrcpara definir uma variável sinalizadora, remFlag, para [R]caso a string "$(pwd)"indique que você trabalha atualmente dentro de uma subárvore de volume remoto, montada anteriormente com sshfs_wrp. Usei casepara portabilidade.
    EDIT: Observe que assim que você encontrar uma correspondência na caseseção de correspondência de padrões, você deve sair do loop 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"
    }
    

    Por fim, modifique o prompt yr PS1em yr ~/.kshrcou ~/.bashrc, incluindo o sinalizador de volume remoto, rem_vol, em verde brilhante no prompt, caso algum volume remoto tenha sido montado usando 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
    

    Esta solução pode ser aprimorada para reduzir o número de partes móveis e para melhorar a criação do /tmp/tmp_rem_volarquivo ou arquivos temporários, caso coexistam mais de uma conexão ssh e os volumes remotos sejam montados de diferentes hosts remotos.

    Isso deve funcionar tanto para uma conexão ssh, dentro de um bashou kshshell, nas plataformas Debian ou Arch Lx.

    Ao desmontar o(s) volume(s) remoto(s), ou no logout da sessão, ou ao fechar a conexão ssh, você também deve cuidar do apagamento /tmp/tmp_rem_volpara evitar problemas de persistência. Você encontrará muitas referências e dicas para automatizar isso também.

    HTH

    • 2

relate perguntas

  • Como alguém pode configurar o áudio no Arch Linux suportando vários programas que emitem áudio ao mesmo tempo sem criar um asoundrc?

  • Por que às vezes é necessário importar chaves manualmente?

  • Como incrementar uma variável nomeada dinamicamente em `zsh`

  • Por que não consigo definir uma variável somente leitura chamada path no zsh?

  • Carregar dispositivo na inicialização

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve