carregando aliases de shell local na sessão ssh dinamicamente

24

Quando entro em uma máquina usando ssh , desejo que meus apelidos e funções estejam lá. Em outras palavras, efetue login em alguma máquina que gostaria de poder usar meus atalhos de comando.

Eu preciso que seja dinâmico, toda vez que fizer login, desejo ter aliases atualizados.

Notas: Muitas vezes, é a primeira vez que você faz login, sem conhecer a máquina e os arquivos. Às vezes, é o único login. Apenas uma vez para essa máquina. Ele precisa ser limpo posteriormente, a configuração anterior também deve ser restaurada.

Tomek Wyderka
fonte

Respostas:

18

Você pode copiar temporariamente .bashrcpara a sua máquina remota com outro nome. Por exemplo, usando .bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

Depois, você pode fazer login na máquina remota:

user@local$ ssh user@remote

e sourceo arquivo .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Agora você pode usar suas .bashrce suas funções. Quando você terminar seu trabalho, poderá remover o arquivo ~ / .bashrc_temp na máquina remota e sair.

A cópia do arquivo e o login na máquina remota podem ser obtidos com uma função bash:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

Atualização :

Você também pode considerar a copiar o .bashrcque /tmpem sua máquina remota e fonte /tmp/.bashrc_temp.

Atualização 2 :

Você pode efetuar login na máquina remota usando ssh -t . Isso usará automaticamente sua temperatura .bashrc. Função atualizada s():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}
jens-na
fonte
Definitivamente é isso que estou procurando. Obrigado! Mas é possível fazê-lo mais funcional? Em uma etapa? Porque agora precisamos de 3 etapas: logon, fonte, exclusão antes do logout.
OK, vejo agora após a sua atualização. Ótimo. Mais uma correção: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"
Eu adicionei sua correção à minha atualização 2. Obrigado.
5
Quase todas as respostas (incluindo esta) usam o nome de arquivo previsível em /tmp/. Isso pode ser trivialmente explorado por qualquer outro usuário para executar qualquer código como um usuário que efetua login. Isso deve ser usado mktemppara garantir que o arquivo temporário tenha um nome exclusivo.
Tometzky
9

jens-na forneceu uma excelente resposta. Passei um pouco de tempo e refiz um pouco para trabalhar um pouquinho melhor. Dessa forma, você pode passar qualquer parâmetro para o SSH, como números de porta. A diferença é que ele usa o sshcomando para fazer upload do .bashrcarquivo, em vez de scp, que usa nomes de parâmetros de comando diferentes.

Você também notará que ele carrega um arquivo diferente .bashrc_remote, para que você possa selecionar exatamente o que deseja buscar em servidores remotos, em vez de tudo

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

Execute-o da seguinte maneira:

sshs user@server

O nome ' sshs' é para "Origem SSH". Use sshquando você não deseja obter a fonte e use sshsquando quiser.

https://gist.github.com/jonahbron/5549848

Jonah
fonte
Isso é útil. O mesmo conjunto de parâmetros, não precisa adicionar entrada a ~ / .ssh / config apenas para especificar uma porta diferente no!
Tomek Wyderka
Uma vez que é o mesmo nome do comando, talvez seja possível fazê-lo em uma corrida, e digite a senha apenas uma vez ... juntando Infelizmente seus comandos em um relatórios:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka
@TomekWyderka Sim, tentei por cerca de 20 minutos reduzi-lo a um comando, mas não encontrei um caminho. Talvez uma pessoa mais experiente em BASH do que eu possa imaginar, mas não parece ser possível.
Jonah
2
Eu peguei essa resposta e iteramos nela por algumas semanas. O resultado é uma ferramenta soprado completo que esmaga o problema: github.com/Russell91/sshrc
RussellStewart
1
@Jonah, você pode me explicar por que usou o $ {*: 1} em vez de $ @.
RussellStewart
8

Acho que sshrc é o que você está procurando: https://github.com/Russell91/sshrc

O sshrc funciona da mesma maneira que o ssh, mas também gera ~ / .sshrc após o logon remotamente.

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

Você pode usar isso para definir variáveis ​​de ambiente, definir funções e executar comandos pós-login. É simples e não afetará outros usuários no servidor - mesmo que eles usem sshrc também. Para uma configuração mais avançada, continue lendo.

RussellStewart
fonte
Agradável. Eu gosto do xxd hack!
Tomek Wyderka
@Tomek - sim, o xxd hack é completamente incrível. Eu realmente tentei fazer o trabalho com o scp. Em seguida, com a tubulação em ssh. Isso simplesmente não pode ser feito sem duas chamadas para o servidor - duas entradas de senha - duas viagens de ida e volta. Isso era inaceitável. Então eu fiz o impensável.
RussellStewart
Eu tenho um bug. sshrc trava sem resposta. Você pode colocar algum código de depuração (pode estar nos comentários) no sshrc para que eu possa rastreá-lo.
Tomek Wyderka
Interessante. É apenas um script do bash; geralmente, quaisquer erros ou avisos lançados serão impressos na tela automaticamente. Quantos bytes existem no seu arquivo .sshrc.d? Além disso, basta digitar vim $(which sshrc)e você pode ver o arquivo bash. Você pode adicionar comandos de eco após cada linha para ver onde ele trava.
22814 RussellSttewart #
5

Não tenho certeza das limitações, mas consegui que isso funcionasse com algo como:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"
Brad
fonte
Esta é a melhor resposta para mim, porque é um único comando ssh, sem nada de scp. A única melhoria restante para mim seria encontrar uma maneira de evitar a RC_DATAvariável.
Sridhar Sarnobat
2

Isto é o que eu vim com. Ele permite que você mantenha um arquivo rc normal, mas também faça tudo em uma conexão ssh (ou seja, você só precisa fazer login uma vez em vez de fazer um scp primeiro).

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

Não tenho certeza de quão grande esse arquivo rc pode ter, pois pode chegar ao máximo em algum momento.

mlathe
fonte
Eu tive que agrupar parte do comando entre aspas simples para que isso funcionasse corretamente. echo '' base64 .... sh` '- depois disso, funcionou lindamente. Obrigado!!
K Robinson
Se o tamanho se tornar um problema, você poderá canalizar o conteúdo do arquivo através de um utilitário de compactação, como gzip, antes da codificação base64.
K Robinson
2

Acho que https://github.com/fsquillace/pearl-ssh faz o que você precisa.

Eu escrevi há muito tempo antes do sshrc nascer e ele tem mais benefícios em comparação com o sshrc:

  • Não requer dependências no xxd para os dois hosts (que podem estar indisponíveis no host remoto)
  • O Pearl-ssh usa um algoritmo de codificação mais eficiente
  • São apenas ~ 20 linhas de código (realmente fáceis de entender!)

Por exemplo:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit
user967489
fonte
1

Uma opção para fazê-lo funcionar com uma única sessão SSH é usar uma variável para armazenar seu arquivo bash em vez de copiá-lo.

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

Parece funcionar para mim.

gibsop1
fonte
1

Eu estava procurando resolver um problema como o seu e percebi que realmente estava procurando por sshfs. Talvez você possa usá-lo também?

Meu problema era que, ao fazer a ssh'ing, eu queria manter minhas cores, pseudônimos, funções e scripts enquanto trabalhava remotamente.

http://fuse.sourceforge.net/sshfs.html

Deificado
fonte
Lol, isso também nunca me ocorreu. É uma solução bastante criativa.
Sridhar Sarnobat 15/07