Como executar comandos automaticamente no login SSH?


18

Sempre que faço login no meu servidor Linux, gostaria que vários comandos fossem executados automaticamente (defina algumas variáveis, mude de local etc.)

Isso precisa ser feito no login do usuário, não na inicialização do sistema.

Como posso configurá-lo para fazer isso?


Você precisa ler a seção INVOCAÇÃO no bash (1) ( man bash).
Andrew Schulman

Respostas:


31

Coloque os comandos ~/.bashrc. Qualquer coisa lá é executada toda vez que você faz login.

Se você precisar que os comandos sejam executados apenas ao efetuar login via ssh (mas não ao efetuar login fisicamente), provavelmente poderá testar a presença da SSH_CONNECTIONvariável de ambiente e executar os comandos somente se achar que existe.


Não estou logando como root, é um servidor da AWS, portanto, preciso fazer login como "ec2-user" e depois mudar para root usando "sudo su -". Então, devo colocar os comandos em "/home/ec2-user/.bashrc"?

5
Isso pressupõe que ~ / .bashrc é originário do seu ~ / .bash_profile. ~ / .bash_profile será o script que é chamado para um shell de login como o ssh. Eu acredito que ~ / .bashrc será chamado se você abrir um Terminal Gnome, por exemplo, APÓS já ter
efetuado

Você me confundiu, deixe-me explicar mais: esta é uma instância do Amazon Web Services, que é praticamente um servidor, para que ninguém nunca efetue login fisicamente (nem tenho certeza se existe fisicamente como uma máquina). Faço login usando PUTTY com o nome de usuário ec2-user. Isso me coloca no diretório / home / ec2-user. Em seguida, mudo para usuário root digitando "sudo su -", que me coloca em "/ root", e preciso digitar uma série de comandos, incluindo a alteração de volta para "/ home / ec2-user" e definir alguns variáveis, aliases, etc. Então ... como eu faria isso?

Além disso, como estou mudando de usuário, espero que, no perfil bash do usuário ec2, eu deva colocar apenas "sudo su -" e o restante dos comandos no arquivo bash raiz?

NOTA: na verdade, é .profile que é chamado se existir, a menos que .bash_profile exista, então é chamado.
dgrant

14

Basta colocar isso em ~ / .bashrc ou /etc/bash.bashrc se você quiser isso para todos os usuários:

if [[ -n $SSH_CONNECTION ]] ; then
    echo "I'm logged in remotely"
fi

e como perco a sessão após fechar a execução?
e-info128

1
@WHK O que você quer dizer com perder a sessão?
Llamageddon

@Llamageddon: Acho que ele está se perguntando a mesma coisa que eu. Se eu quisesse colocar toda a minha sessão SSH screen, poderia usar sua resposta e colocá screen-la em vez do eco. O problema é que o término da sessão na tela retornará ao prompt SSH em vez de sair. Apenas escrever este comentário me deu a resposta, no entanto: adicione o logoutcomando após o screencomando.
Zondo

No entanto, isso não funciona para sessões ssh que não usam o bash, por exemplo, quando abro uma sessão sftp.
Fabio

O @zondo @ e-info128 exec commandsubstituirá o shell atual pelo que você executar.
Llamageddon

6

Como alternativa, você pode especificar um comando a ser executado durante a chamada de ssh:

$ ssh -t server 'cmd; exec bash -l'

O último comando da lista deve iniciar uma sessão interativa no seu shell preferido. Se você tiver muitos comandos para executar, considere criar um arquivo de script no servidor SSH.


1
Isso é muito útil. Não tenho certeza se é exatamente a resposta que o questionador perguntou, mas as pessoas devem saber sobre isso, pois pode não ser óbvio. Por exemplo "ssh user @ host" export x = 5; bash "Em seguida, no terminal que aparece eco $ x exibe 5.
clearlight

3

Na verdade, ~/.ssh/rcé o lugar certo para você adicionar um comando para executar quando efetuar login, em vez de qualquer usuário do sistema.

 ~/.ssh/rc
         Commands in this file are executed by ssh when the user logs in,
         just before the user's shell (or command) is started.  See the
         sshd(8) manual page for more information.

Não necessariamente. É um local onde os comandos podem ser colocados.
Daniel B


Isso poderia realmente colocar alguém em apuros se não soubesse o que está fazendo. É potencialmente útil em casos extremos, mas isso REALMENTE pode atrapalhar alguém se eles esquecerem de colocar comandos lá ou o nome e o caminho desse arquivo. Geralmente, seria altamente preferido colocar os comandos de login de inicialização no local esperado, .bashrc, no lado remoto e testar $ SSH_CONNECTION, como sugeriram outras respostas aqui.
Clearlight 26/07/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.