carregando aliases de shell locais para a sessão ssh dinamicamente

21

Quando faço login em alguma máquina usando ssh , desejo que meus alias e funções estejam lá. Em outras palavras, faça o login em alguma máquina que eu desejo usar meus atalhos de comando.

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

Notas:   Muitas vezes é o primeiro login, sem conhecer máquinas e arquivos.   Às vezes, é único login. Apenas uma vez para essa máquina. Ele precisa ser limpo depois, a configuração anterior também deve ser restaurada.

    
por Tomek Wyderka 08.11.2012 / 19:23

8 respostas

17

Você pode copiar temporariamente seu .bashrc para seu computador remoto 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 source o arquivo .bashrc_temp :

user@remote$ source ~/.bashrc_temp

Agora você pode usar seu .bashrc e suas funções. Quando você terminar o seu trabalho, você pode 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
}

Atualizar :

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

Atualização 2 :

Você pode logar na máquina remota usando ssh -t . Isso usará automaticamente seu temp .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"
}
    
por 08.11.2012 / 19:57
9

jens-na forneceu uma excelente resposta. Passei um pouco de tempo e re-trabalhei um pouco para trabalhar um pouco melhor. Dessa forma, você pode passar qualquer parâmetro para o SSH, como números de porta. A diferença é que ele usa o comando ssh para carregar o arquivo .bashrc , 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 originar 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 da seguinte forma:

sshs user@server

O nome ' sshs ' é para "Origem SSH". Use ssh quando não quiser pesquisar e use sshs quando fizer isso.

link

    
por 09.05.2013 / 21:16
6

Eu acho que o sshrc é o que você está procurando: link

sshrc works just like ssh, but it also sources ~/.sshrc after logging in remotely.

$ 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 de pós-login. É simples assim, e não afetará outros usuários no servidor - mesmo se eles usarem o sshrc também. Para uma configuração mais avançada, continue lendo.

    
por 12.09.2014 / 09:35
5

Não tenho certeza das limitações, mas consegui fazer isso funcionar 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"
    
por 18.05.2016 / 23:51
2

Isso é o que eu criei. Ele permite que você mantenha um arquivo rc normal, mas também faça tudo em uma conexão ssh (ou seja, só precisa se logar uma vez ao invés 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 ser, já que pode ser o máximo em algum momento.

    
por 02.03.2015 / 20:17
2

Acho que o link faz o que você precisa.

Eu escrevi isso há muito tempo antes do sshrc nascer e ele tem mais benefícios comparado ao sshrc:

  • Ele não exige dependências no xxd para ambos os 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 (muito fáceis de entender!)

Por exemplo:

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl [email protected]
myserver.com $> q
exit
    
por 06.06.2015 / 19:46
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.

    
por 03.07.2014 / 12:44
1

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

Meu problema é que, quando eu estava ssh'ing, eu queria manter minhas cores, aliases, funções e scripts enquanto trabalhava remotamente.

link

    
por 20.03.2015 / 14:29