Eu uso sshfs
para 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 local
na 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 sshfs
como:user@host: sshfs% ls
Enfrentamos dois problemas distintos aqui:
sshfs
;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
df
efindmnt
são capazes de determinar o ponto de montagem em que um diretório está. Além disso, ambos podem relatar oFSTYPE
atributo de um sistema de arquivos, que é definidofuse.sshfs
para aqueles montados porsshfs
.Você pode, assim, verificar com:
ou:
Você pode envolver esse teste em um script e disponibilizá-lo em seu arquivo
PATH
. Aqui vamos chamá-locheck_sshfs_mp
:Como definir o prompt do shell com base no ponto de montagem em que estamos?
Em ambos
bash
ezsh
você pode definir aPS1
variável shell, que é expandida como o prompt principal.Em
bash
você pode fazer isso em wrappers para as funções relevantes:cd
,pushd
epopd
(créditos: graças a esta resposta a "Conditional PS1" por me lembrar quecd
não é o único), adicionando este código ao seu~/.bashrc
:A
chpwd
função invocacheck_sshfs_mp
e, se seu status de saída for0
, adiciona uma únicaR
letra vermelha aPS1
.Você pode querer ajustar o valor padrão de de
PS1
acordo com suas preferências.Nele
zsh
é um pouco mais fácil, poiszsh
executa achpwd
funçã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 comchpwd
.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
:Novamente, estamos simplesmente adicionando um vermelho
R
ao prompt principal quando for bem-chech_sshfs_mp
sucedido.Observe que o embrulho
cd
e adicionar umachpwd_functions
função de gancho não garantirá que o prompt seja definido corretamente se o PWD em que seu terminal foi iniciado estiver em umsshfs
sistema de arquivos montado. Você precisará de pelo menos umcd
para acionar o prompt correto, e isso pode ser enganoso.As contribuições do usuário para a
zsh
criaçã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
para experimentar este código.
Integrando os pontos levantados nos comentários sobre
zsh
:Se você preferir especificar a coloração do prompt com sequências de escape ANSI (em vez de nomes de cores), poderá alterar a
PS1
linha de atribuição no trecho de código acima para:ou
Observe que
print
é necessário transformar\e
s em caracteres de escape reais e o%{...%}
formulário é necessário para evitar que o código do prompt se comporte mal. Referência:zsh
FAQ: 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_functions
e adicionar ao seu.zshrc
:A
PROMPT_SUBST
opçã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.Na linha do que @fra.san sugeriu, você pode modificar seu prompt LOCAL ajustando
PS1
para que reflita o fato de que uma pasta no caminho foi montada usandosshfs
.Primeiro, verifique se o terminal yr suporta prompts de cores. Inclua o seguinte no ano
~/.kshrc
ou~/.bashrc
: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: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
~/.kshrc
ou~/.bashrc
para 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 comsshfs_wrp
. Useicase
para portabilidade.EDIT: Observe que assim que você encontrar uma correspondência na
case
seção de correspondência de padrões, você deve sair do loop while.Por fim, modifique o prompt yr
PS1
em yr~/.kshrc
ou~/.bashrc
, incluindo o sinalizador de volume remoto,rem_vol
, em verde brilhante no prompt, caso algum volume remoto tenha sido montado usandosshfs_wrp
.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_vol
arquivo 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
bash
ouksh
shell, 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_vol
para evitar problemas de persistência. Você encontrará muitas referências e dicas para automatizar isso também.HTH