Qual é a mágica que me permite tab-complete arquivos remotos enquanto digito um comando scp?

16

Presumivelmente, esse é um recurso fornecido por algum plug-in que habilitei na minha configuração oh-my-zsh (uso o zsh há muitos anos).

Percebi desde que adicionei minha chave pública ao servidor (agora posso fazer o SSH no servidor sem digitar uma senha), quando componho um scpcomando no meu shell, na verdade, sou capaz de completar os caminhos dos arquivos remotos!

por exemplo

$ diff <(scp Remoteuser@remote.domain.net:/var/www/html/

Apertei a tecla Tab e simplesmente funciona! (quanto ao que estou tentando realizar com o próprio comando, usarei scppara "copiar" para stdout e alimentá-lo como um arquivo para diff. Dessa maneira, posso ver as mudanças exatas que implanto no servidor antes de correndo rsync)

Estou curioso sobre quais são as peças que fazem isso funcionar tão bem. É algo embutido no scp que foi integrado ao z shell? Ou outra coisa?

Steven Lu
fonte

Respostas:

16

Oooh, eu encontrei uma explicação .

Para citar a parte relevante:

O shell zsh vem com (mais de um) ótimo (s) recurso (s), como o preenchimento de tabulação remoto. Se você, por exemplo, deseja copiar um arquivo pelo scp, basta pressionar tab em qualquer parte do nome do arquivo no host remoto. O zsh pode estabelecer uma sessão ssh em segundo plano e buscar as informações relacionadas para você, para que você possa concluir a tabulação através dos arquivos remotos.

A publicação continua mostrando algumas zstyledeclarações que alcançam a conclusão, mas eu sugiro usar um pacote zsh, como o mencionado oh-my-zsh, para manter esse material mantido pela comunidade OSS para você.

Algo aparentemente relevante, como visto no meu sistema no meu diretório .oh-my-zsh:

$ ack scp 
plugins/common-aliases/common-aliases.plugin.zsh
85:zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%
[# ]*}//,/ })'

<...>
Steven Lu
fonte
Surpreendente!! Esse recurso é exclusivo para zsh. É possível entrar bash.
Shivams
11
@shivams, isso pode ser relevante para suas necessidades do bash. Parece que configurar o oh-my-zsh é muito mais fácil, além do zsh ser realmente muito bom. Acho que, se você realmente se importa com isso, não há muito o que o zsh possa fazer com o bash (e o contrário também é verdade). Simplesmente uma questão de quanto trabalho você está disposto a colocar nele.
Steven Lu
7
@shivams Para mim, sempre funcionou no bash - apenas instalei "tab" um dia em um comando scp e fiquei bastante surpreso ao ver que ele era preenchido automaticamente! Ao pesquisar no Google, parece que você precisa instalar o pacote bash-complete, se ainda não o tiver. Esta questão unix.se é relevante.
Pont