Empurrando meu prompt PS1 sobre ssh

19

Eu uso um prompt "PS1" específico que eu gosto. Compartilho alguns logins com outras pessoas em alguns servidores diferentes. Fiquei me perguntando se havia uma maneira de especificar no meu perfil local do bash um prompt remoto ou qualquer outra maneira, além de copiar e colar cada vez que remotamente.

Unfundednut
fonte

Respostas:

17

Faça o upload de um arquivo em cada máquina remota, digamos ~/.my_custom_bashrc, com sua bashconfiguração personalizada (neste caso PS1=...) e inicie sshcom:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

Você pode usar facilmente uma bashfunção como wrapper para facilitar a leitura.

cYrus
fonte
10

Se você deseja enviar a PS1variável e ela não contém uma '(aspas simples), tente:

ssh targethost -t "PS1='$PS1'; exec bash"

O local .bashrcpode sobrescrever PS1(obrigado a Dennis Williamson por apontar isso).

Existem maneiras de transmitir variáveis ​​de ambiente pelo ssh , mas elas geralmente são desativadas na configuração do servidor. Se a PermitUserEnvironmentdiretiva estiver ativada na configuração do servidor e cada usuário tiver seu próprio par de chaves (sim, você pode não ter tanta sorte), poderá adicionar environment="PS1=…"à linha ~/.ssh/authorized_keyscorrespondente à sua chave.

Se você deseja manter sua própria configuração em uma conta de usuário compartilhada, é possível criar seu próprio diretório do arquivo de configuração e definir a HOMEvariável de ambiente para apontar para esse diretório.

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

Crie links simbólicos no mrstatic.homediretório apontando para a entrada correspondente no diretório pai quando desejar compartilhar um arquivo com os outros usuários.

Em seguida, faça login com

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

Se você deseja modificar o controle remoto .profile(ou outro arquivo de inicialização), provavelmente pode automatizar suas configurações. Muitos sites permitem LC_*a passagem de variáveis ​​de ambiente (normalmente são usadas para configurações de localidade). Se essas duas condições forem atendidas, você poderá definir uma variável que não seja realmente usada para localidades, digamos LC_USER, no lado do cliente e testá-la no servidor .profile.

(É claro que contas compartilhadas são uma péssima idéia, mas sei que você pode não estar em condições de mudar essa situação.)

Gilles
fonte
3
ssh -t user@host "remote='$PS1' bash -i"

Então, no prompt:

PS1=$remote
Dennis Williamson
fonte
1
Um prompt sofisticado do bash provavelmente será interrompido se não for citado (vindo de você, estou surpreso). E por que o comando extra, e não apenas "PS1='$PS1' bash -i"(e por que não exectambém)?
Gilles
1
@ Gilles: Faltando citações: negligência. Comando extra: não seria incomum PS1ser substituído durante a inicialização do shell. Sem exec: durante os testes no meu sistema, isso não fez nenhuma diferença - nenhum processo extra.
Dennis Williamson
1
Ah, sim, esse é um bom ponto, .bashrcé provável que o local substitua PS1.
Gilles
2

Coloque seu prompt do PS1 em ~ / .ssh / environment e a sessão ssh o levará a todos os hosts que você fizer login. Funciona para mim com o openssh 4.3p2.

Valmik
fonte
1
Isso funciona apenas se a configuração do servidor estiver ativada PermitUserEnvironment, que está desativada por padrão.
Flimm
1

você pode especificar variáveis ​​de ambiente no lado do cliente e, se o servidor ssh permitir (verifique man sshd-config), essas variáveis ​​serão copiadas para a sessão quando você fizer login na máquina.

portanto, você teria que configurar o .bashrc no servidor para verificar um PS1 existente (ou qualquer outra variável) e definir o PS1 apenas se ainda não estiver definido.

ou, que simplificam as coisas, você agrupa suas configurações em uma função .. e implanta essa função como um arquivo especial da sua fonte sob demanda ( source joes_bashrc) ou diretamente no .bashrc. ter seu próprio arquivo parece um pouco mais robusto. as outras pessoas podem usar suas configurações, mas não são obrigadas a fazê-lo.

akira
fonte
1

Não compartilhe logins. SSH como você, então faça sudo -su shareduser( -ssignifica "shell").

Faça sudomanter seu diretório inicial:

Defaults env_keep += "HOME"
gravidade
fonte
Quando eu for promovido, tentarei aprovar essa política, mas por enquanto estou preso a isso.
Unfundednut
1

Se você quiser fazer isso sem precisar de um scp extra, pode fazer algo assim:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

Isso gerará um .bashrc.n baseado no bashrc dos servidores, mas com suas substituições.

neurônio
fonte
É por isso que algumas pessoas têm medo de terminais.
0

Se você está disposto a interferir de forma imperceptível em seus colegas, e você pode confiar neles para não interferir com a sua preferência, então eu sugiro uma combinação de resposta de Ciro , resposta de Akira e resposta de Dennis Williamson .

  1. Em cada servidor, edite ~/.bashrce adicione
    if ["$ Unf" = 1] # código especial para Unfundednut
    então
        PS1 = " (seu prompt desejado) "
         (qualquer outra personalização desejada) 
    fi
    no fim. Embora seus colegas “não gostem [de escrever] sobre o perfil base”, eles não estarão cientes disso, a menos que procurem por ele.
  2. Ao fazer login em um servidor remoto, faça
    ssh -t usuário @ host "Unf = 1 bash -i"
    Embora você provavelmente deseje colocar isso em uma função de alias ou shell em sua conta local, é curto o suficiente - mais curto do que qualquer outra resposta - que você pode facilmente digitar manualmente.

Acredito que isso seja bastante claro, mas: o sshcomando faz com que a Unfvariável seja definida no servidor remoto quando você efetuar o logon. Isso invocará seu código no controle remoto .bashrc, o que colocará suas customizações em vigor. Como você coloca seu código no final de .bashrc, ele substituirá as configurações gerais anteriormente no arquivo.

Divulgação: Eu não testei isso.

Scott
fonte
-1

A maneira mais fácil é IMHO:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'
Matias Barrios
fonte
Não tenho certeza se funciona; parece estar faltando uma camada de aspas. Mesmo assim, a configuração PROMPT_COMMAND(que é executada toda vez que o shell emite um prompt) parece ser uma maneira muito pesada de resolver esse problema. E, como é um tanto misteriosa, qualquer resposta que sugira que realmente deva ter uma explicação de como funciona.
Scott
-2

Você pode fazer coisas como montar sua casa em sshfs / nfs, mas a solução mais fácil é passar o bashrc para a nova máquina. Isso também traz aliases e outras coisas.

Dentrasi
fonte
Como afirmei na minha pergunta, compartilho esses logins com outras pessoas. Tenho certeza de que eles não gostariam que eu escrevesse sobre o perfil base.
Unfundednut
1
Montar $ HOME sobre NFS é insano. Apenas dizendo'.
Wesley Rice