¿Cuál es la magia que me permite completar los archivos remotos mientras escribo un comando scp?

16

Presumiblemente, esta es una característica proporcionada por algún complemento que he habilitado en mi configuración oh-my-zsh (he estado usando zsh durante muchos años).

Me di cuenta de que desde que agregué mi clave pública al servidor (ahora puedo usar SSH en el servidor sin ingresar una contraseña), cuando redacto un scpcomando en mi shell, ¡en realidad puedo completar las rutas de archivos remotas con pestañas!

p.ej

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

¡Golpeé la pestaña y simplemente funciona! (en cuanto a lo que estoy tratando de lograr con el comando en sí, lo voy a usar scppara "copiar" en stdout y alimentarlo como un archivo para diferir. De esta manera puedo ver los cambios exactos que implemento en el servidor antes de corriendo rsync)

Tengo curiosidad acerca de cuáles son las piezas que hacen que esto funcione tan bien. ¿Es algo integrado en scp que se integró con z shell? ¿O algo mas?

Steven Lu
fuente

Respuestas:

16

Oooh, encontré una explicación .

Para citar la parte relevante:

El shell zsh viene con (más de una) gran característica (s), como la finalización remota de pestañas. Si, por ejemplo, desea copiar un archivo sobre scp, simplemente presione la pestaña en cualquier parte del nombre de archivo en el host remoto. zsh puede establecer una sesión ssh en segundo plano y obtener la información relacionada por usted, de modo que pueda completar con pestañas los archivos remotos.

La publicación continúa mostrando algunas zstyledeclaraciones que logran la finalización, pero sugeriría encarecidamente utilizar un paquete zsh como el mencionado oh-my-zsh para que la comunidad OSS mantenga estas cosas para usted.

Algo aparentemente relevante, como se ve en mi sistema en mi directorio .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
fuente
¡¡Increíble!! Es esta característica exclusiva de zsh. ¿Es posible en bash.
Shivams
1
@shivams esto puede ser relevante para sus necesidades de bash. Parece que configurar oh-my-zsh es mucho más fácil, además de que zsh es realmente agradable. Sin embargo, creo que si realmente te importa, no hay mucho que zsh pueda hacer que bash no pueda (y lo contrario también es cierto). Simplemente es cuestión de cuánto trabajo estás dispuesto a poner en él.
Steven Lu
77
@shivams Para mí, siempre ha funcionado en bash, solo presioné "tab" instintivamente un día en un comando scp y me sorprendió ver que se completaba automáticamente. Al buscar en Google, parece que necesitas instalar el paquete bash-complete si aún no lo tienes. Esta pregunta unix.se es relevante.
Pont