Minha equipe é responsável por milhares de máquinas Linux / Unix; portanto, a conta raiz é "compartilhada" entre os administradores. Eu prefiro o modo vi, outros preferem o modo emacs.
Como posso definir a linha de leitura do bash para o modo vi no login SSH em qualquer máquina, sem forçar todo mundo a usar o modo vi também?
Em essência, gostaria de ter o efeito de set -o vi
após o login sem precisar digitá-lo todas as vezes e sem forçá-lo a todos os outros (tanto quanto o modo emacs é irritante para mim, o modo vi é irritante para eles).
Eu sei que isso não seria um problema se todos usassem suas próprias contas com o sudo para executar comandos privilegiados, mas devido a circunstâncias fora do meu controle, isso infelizmente não é uma opção.
set -o vi
antes de me dar o controle do shell.set -o vi
comando e depois mude para o modo interativo.sshd
configura várias variáveis de ambiente que podem ajudá-lo a determinar quem está do outro lado. Por exemplo,SSH_CLIENT
contém o endereço IP de conexão (e também a porta de saída / entrada do cliente). Brincar com isso~/.bashrc
pode permitir que você faça as coisas apenas para você .Respostas:
Aqui está uma maneira boba de fazer isso, que realmente funciona bem com autenticação de chave pública:
Primeiro, verifique se a sua máquina local está
nc
nela.Segundo, ainda na sua máquina local, crie um script (eu o chamarei
connect-to-server
) e coloque-o em um local que você${PATH}
conheça *:Em seguida, modifique o
.bashrc
sistema remoto para incluir em algum lugar:Por fim, de volta à sua máquina local, edite
~/.ssh/config
para adicionar:Desvantagens dessa abordagem (e por que eu a chamo de boba):
.yourname
arquivo ainda não tenha sido excluído. Nesse caso, eles também receberãoset -o vi
.ssh serverNickname command
,command
será executado, mas (como.bashrc
nunca é originado) o.yourname
arquivo permanecerá; portanto, seria educado ter um segundo alias na sua configuração ssh que não use o pseudo-proxy.De fato, a única vantagem dessa abordagem é que seu
ssh
comando não precisa receber argumentos extras.* Se você não deseja alterar nada em sistemas remotos, aqui está um pseudo-proxy alternativo que cria um temporário
.bashrc
:Isso tem as mesmas desvantagens do outro método, portanto, você ainda deseja um segundo alias em sua
ssh
configuração que não invoque o pseudo-proxy.fonte
Eu iria para:
mas se você é um administrador, pode tentar algo mais limpo. Por exemplo, você pode usar a
SendEnv
opção ssh no lado do cliente para transmitir uma variável específica, usarAcceptEnv
nasshd
configuração (lado do servidor) para aceitá-la e, com base nisso, modificar o.bashrc
arquivo raiz para ajustar o comportamento de acordo com o valor da variável.Isso implica alterar a
sshd
configuração em todos os hosts, assim como nos deles.bashrc
. Não é exatamente uma maneira "independente" de fazer, no entanto ...fonte
Para uma solução fácil para o cliente:
Isto irá falhar se scripts de inicialização do shell da raiz explicitamente usos
set -o emacs
ou conjuntosEDITOR
paraemacs
, ou se da raiz.initrc
invoca arquivoemacs
atalhos de teclado.O restante desta resposta diz respeito a soluções do lado do servidor.
Isso funciona quando você está
ssh
inserindo na máquina e depois usasudo -i
:Para o seu
/root/.bashrc
:Isso permite que você tenha um
bashrc
arquivo pessoal chamado no/root/.bashrc-patrick
qual você pode fazer o que quiser, comoset -o vi
.Combinando isso com uma abordagem um tanto ingênua para escolher esse arquivo rc, dependendo de
$SSH_CLIENT
:Obviamente, isso só funciona se você estiver se conectando do mesmo endereço IP o tempo todo ...
Outra abordagem que usa o campo de comentário da chave SSH específica que você está usando, que funciona se você estiver encaminhando o agente SSH para o servidor:
Isso seleciona o campo de comentário da chave que você usou para se conectar ao servidor. O
head -n 1
que há no caso de acontecer de ter várias de suas chaves noauthorized_keys
arquivo.Em seguida, você pode
$ssh_comment
escolher um arquivo rc para a origem, diretamente como na$SUDO_USER
abordagem acima (na qual o comentário$ssh_comment
pode precisar passar por uma limpeza, se for o nome do caminho) ou por umacase
declaração, como na$SSH_CLIENT
abordagem.fonte
SSH_CLIENT
eSUDO_USER
é o que eu uso atualmente, mas requer modificação no servidor e não é particularmente confiável. Eu esperava uma solução pura do lado do cliente. Obrigado pela sugestão.Se você realmente deseja fazer isso sem modificação no lado do servidor, ou:
1) Execute algo como
Não acho que a documentação seja clara demais, mas
-o option
é mencionada e parece funcionar.2) Use esperar:
O
expect
script:Torne-o executável e execute:
Isso pressupõe que você possa efetuar login sem inserir senhas (para o host remoto ou para suas chaves); caso contrário, o script de espera precisará levar isso em conta. Mas com muitas máquinas, é provável que você já tenha isso. Além disso, esperava um cifrão e um espaço. Edite-o de acordo com sua solicitação:
"# "
talvez.Embora se algo impresso antes do prompt incluir esses mesmos caracteres, você precisará incluir algo mais específico na sequência esperada.
Além disso, esse script não suporta fornecer argumentos extras para
ssh
. Se você deseja dar um comando explícito para executar, provavelmente não precisa do modo vi, mas se precisar dizer tunelamento de porta, isso pode ser um problema.Mas, em qualquer caso, eu realmente acho que isso deve ser resolvido nos sistemas de destino com contas separadas (
sudo
ou simplesmente o antigo UID 0). A configuração personalizada também seria útil para muitos outros casos e, em geral, você teria vários arquivos de configuração e variáveis de ambiente que gostaria de definir. (Considere que os administradores podem não concordar com o valor$EDITOR
ou o conteúdovirc
ou o que for.)Também remover usuários seria mais fácil com contas separadas.
Qualquer maneira de sincronizar arquivos em todos os hosts também resolveria isso trivialmente, permitindo que você efetue login com algo como
ssh -t user@host 'patricks_shell.sh'
oussh -t user@host 'bash --rcfile patrick.rc'
.fonte
interact
. Não existe, os prompts podem ser muito diferentes, assim como os motds / output dos perfis. Obrigado pela sugestão embora.você pode ter um arquivo rc personalizado seguindo este guia:
Usuário rc Arquivo | Shell Seguro: O Guia Definitivo
ou injete uma ação de linha de comando no seu arquivo allowed_keys:
SSH config auto execute comando remoto | Troca de pilha Unix e Linux
fonte