Como usar o fish em servidores remotos que o instalaram sem alterar o shell de login?

3

Eu normalmente ssh em vários servidores diferentes, alguns dos quais não têm fish instalado, mas muitos têm. Eu gostaria de obter fish como shell se disponível (mudar a midway é sempre entediante, e você perde o histórico do que você já digitou), mas mudar o shell padrão não é uma boa idéia, como:

  • existem muitas máquinas diferentes que eu precisaria mudar;
  • em muitos outros, estou logado através do LDAP e alterar meu shell conforme armazenado no LDAP seria interrompido em máquinas em que fish não está disponível;
  • em geral, como fish não é compatível com POSIX-sh colocando-o como shell padrão pode quebrar comandos executados por scripts através de ssh ;
  • finalmente, há algumas máquinas em que o usuário é compartilhado com outras pessoas (ou, onde eu preciso fazer login de outro usuário), portanto, alterar o shell padrão não é uma boa ideia.

Então, idealmente, eu gostaria de ter um comando como ssh , que inicia automaticamente fish , se disponível, ou simplesmente deixar qualquer shell padrão fornecido de outra forma.

    
por Matteo Italia 17.10.2018 / 19:57

2 respostas

1

Depois de algumas experiências, juntei o script fissh :

#!/bin/sh
ssh "$@" -t "sh -c 'if which fish >/dev/null ; then exec fish -li; else exec \$SHELL; fi'"
  • "$@" encaminha todos os argumentos passados para ssh
  • -t força a alocação de um tty (caso contrário, ssh assumirá o padrão quando nenhum comando for especificado)
  • sh -c é necessário porque não sabemos qual shell teremos do outro lado - em minhas máquinas pessoais eu tenho fish como shell padrão, o que quebraria na diferente sintaxe if ;
  • which fish é bem-sucedido se encontrar um executável fish ; Nesse caso, é exec -ed (pedindo por um shell interativo e de login);
  • caso contrário, voltaremos a $SHELL , que é o shell padrão para o usuário atual ( $ tem escape, caso contrário, ele é expandido por sh "deste lado").

Observe que stdout de which está oculto (como no caso normal, não nos importamos onde fish foi encontrado), mas stderr (onde a mensagem de erro de que fish não pôde ser encontrado intencionalmente deixado intacto como um aviso ao usuário de que, apesar de nossas melhores intenções, fish não foi encontrado.

Para concluir a experiência, em minhas máquinas com fish , adiciono o suporte para conclusão personalizada criando um arquivo ~/.config/fish/completions/fissh.fish contendo

complete -c fissh -w ssh

para instruir fish que fissh tem exatamente as mesmas conclusões válidas que ssh .

    
por 17.10.2018 / 19:57
0

Esse (sem teste) pequeno script de espera faria, eu acho, a mesma coisa:

#!/usr/bin/expect -f
spawn ssh {*}$argv
expect {
    {yes/no}   {send "yes\r"; exp_continue}
    -re {\$ $} {send "which fish >/dev/null && exec fish -li\r"}
}
interact

Suposições:

  • o seu shell de login é como o bourne e entende "cmd1 & cmd2",
  • você não precisa fornecer uma senha para fazer login,
  • seu prompt termina com um cifrão e um espaço.
por 17.10.2018 / 22:58