Como ter um script de shell disponível em todos os lugares que eu SSH para

3

Eu tenho um script de shell que eu simplesmente não posso fazer sem: bar de Theiling Online

Eu uso muito o SSH e em uma variedade de servidores * nix. No entanto, não sou um administrador do sistema e geralmente não tenho tempo ou privilégios para instalá-lo em todos os servidores aos quais me conecto.

Aparentemente é um script sh muito portátil e tem opções de linha de comando para se exportar como uma função de shell, o que me fez pensar: Posso usar um dos recursos subjetivamente obscuros do OpenSSH para exportá-lo em todos os lugares?

Meu primeiro pensamento foi atribuir a fonte a uma variável de ambiente como BAR = "cat -v" e, em seguida, executá-la no outro lado como '$ BAR', mas 1) não consigo nem obter o exemplo do cat para trabalhar localmente, 2) Eu não sei como colocar a fonte multilinha real do script em uma variável de ambiente e 3) ainda estou para ver uma máquina com PermitUserEnvironment habilitada.

Eu acho que poderia até fazer com uma opção ssh para gravar um arquivo chamado ~/bar no logon, mas uma solução mais volátil seria melhor.

Chamar wget http://.../bar no logon seria inaceitável.

Alguma idéia?

P.S. Soluções específicas para putty, embora duvide que existam, também estão bem.

Edit: A razão pela qual eu não quero wget e outras soluções baseadas em arquivos é que eu não quero deixar uma marca, pois às vezes eu me conecto como usuários de outras pessoas ou como root. Eu também não quero que todos os servidores que eu conecto façam uma solicitação HTTP. Eu quero que isso tenha o mínimo de sobrecarga possível.

    
por aib 24.02.2011 / 23:34

4 respostas

1

Eu não tentei nada disso, mas você pode encontrar o que procura com uma combinação de opções.

Confira man 5 ssh_config para:

  1. SendEnv - você pode armazenar a barra em uma variável de ambiente, mas precisa executá-la. Por exemplo, BAR=$(bar -D) , então no shell remoto eval $BAR , tendo enviado a variável sobre - eu sei que é um passo curto do que você quer, mas, hey, progrida;
  2. LocalCommand - não tenho certeza se isso ajuda, a menos que você possa fazer um ssh autônomo, mas também não consigo ver funcionando;

A única outra opção que vejo é hackear o código-fonte do seu cliente e introduzir um recurso que executa um comando imediatamente após o logon (como eval $BAR , por exemplo, isso pode ser uma opção ssh_config chamado RemoteCommand , por exemplo), depois que as variáveis de ambiente foram enviadas e antes de esperar pela entrada do usuário.

...

Na verdade, tenho uma ideia para a resposta completa (não testada):

No SendEnv , certifique-se de enviar PS1 e DEFINEBAR e defina PS1 para eval $DEFINEBAR ($ DEFINEBAR deve conter sua função e definir PS1 como um valor razoável depois). A ressalva é que o servidor precisa ser configurado para aceitar variáveis de ambiente, o que é improvável que seja o caso de uma configuração padrão ou segura. Então, volte para a estaca zero se sua configuração não permitir isso.

    
por 25.02.2011 / 04:52
3

Aqui está uma variação da solução de Dennis Williamson, que não requer que você possa fazer o ssh da máquina remota de volta para a sua máquina local. No sistema local:

$ bar -D | ssh user@host 'cat > barfunc'
$ ssh user@host

No sistema remoto:

$ . ./barfunc

Eu testei os componentes disso, mas não usei bar , o que eu não tenho.

    
por 25.02.2011 / 00:18
1

Na sua pergunta, você disse que usar o wget era inaceitável. Você é contra o wget ou contra a cópia do arquivo? Eu não acho que você será capaz de obter a funcionalidade que deseja, a menos que você de alguma forma copie o arquivo para a máquina local.

Talvez seja possível criar o arquivo (mas tenho certeza de que isso falharia). O comando gostaria disso a seguir, dependendo do shell:

source mymachine:/home/user/bar
. mymachine:/home/user/bar

se você for contra o wget especificamente, você pode tentar scp, com a configuração de chaves ssh isso significaria uma experiência sem senha.

mkdir ~/bin; scp -r myserver:/home/user/bin/* ~/bin; chmod u+x ~/bin
Pessoalmente, o que funcionou para mim foi colocar meus scripts de shell em um repositório de subversão e então verificar o repo em todas as máquinas. Se eu atualizei o script, posso verificá-lo no svn e atualizá-lo em outras máquinas.

    
por 24.02.2011 / 23:41
0

Isso pode dar a você um começo:

No seu sistema local:

$ bar -D > ~/barfunc
$ ssh user@host     # or similar

No sistema remoto:

$ func=$(scp yourname@yoursystem:~/barfunc /dev/stdout)
$ eval "$func"
$ bar_cat somefile ...
    
por 25.02.2011 / 00:01

Tags