Shell Script para efetuar login em um servidor ssh


29

Eu tentei escrever um script de shell que pode fazer login automático em um servidor ssh usando a senha mencionada no script. Eu escrevi o seguinte código:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

Este código não está funcionando corretamente, ainda está solicitando a senha. Alguém por favor pode me ajudar a resolver isso



Respostas:


36

Certa vez, escrevi um expectscript para efetuar login em um servidor ssh (como o seu caso) e meu script era algo como isto:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

Acho que talvez interactesteja faltando no seu script.


Isto é absolutamente funcionando bem para mim e eu estou preso neste lugar, interagem fornece terminal interativo com o prompt, mas eu estou tentando automatizar ainda mais mais passos como fazer cde lse ler o conteúdo do arquivo também. É possível fazer depois de interagir? Por favor responda
— Hansiemithun

@ Hansie, você pode enviar um lscomando após o login. Por exemplo, após o envio da senha, faça um expectcom o texto do prompt de comando (para garantir que você esteja logado) e, em seguida send "ls\r". Tudo isso acontece antes interact.
— Saeedn

a pergunta estava um pouco incorreta e desculpe-me depois de ler sl e ler o conteúdo, sou capaz de imprimir o mesmo. Mas como tirar isso da sessão ssh em uma variável para acessar da máquina local. ref: stackoverflow.com/questions/32341234/expect-script-return-value . Mas a saída não está funcionando para mim. Minha pergunta foi publicada: stackoverflow.com/questions/51628465/… . Eu preciso file_listapós a saída para o acesso do comando local imediato
— Hansiemithun

31

Você está fazendo o caminho errado. O que você deseja fazer é gerar um par de chaves ssh sem senha e, desde que o servidor suporte a autenticação de chave RSA, você poderá entrar sem precisar digitar uma senha para todos. Esse é um risco de segurança se sua chave privada for armazenada em algum lugar em que possa ser roubada.

Siga esses passos:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Pressione Returnquando solicitado a senha
  5. Pressione Returnuma segunda vez para confirmar.

Agora haverá dois arquivos no seu ~/.sshdiretório, mysshkey.pube mysshkey. mysshkey.pubé sua chave pública, essa é segura para colocar em servidores remotos. mysshkeyé a chave sem senha privada, é não seguro para colocar em servidores remotos (ou em algum lugar alguém poderia obter uma cópia).

No servidor em que você deseja fazer o SSH:

  1. Efetue login no servidor remoto
  2. mkdir -p ~/.ssh
  3. Copie e cole o conteúdo de mysshkey.pubem~/.ssh/authorized_keys
  4. Certifique-se de que ~/.ssh/authorized_keysé chmod'd para600

Agora, para colocá-lo em ação na sua máquina local, execute o seguinte comando:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

E você estará logado sem ser solicitada uma senha.

Esse é um método muito preferível de gerenciar logins automatizados, pois você não codifica sua senha em vários locais que precisam ser atualizados se você a alterar.


2
Eu usaria chaves RSA em vez de DSA. Mas fora isso, concordo plenamente.
— glglgl

12
às vezes você não pode adicionar chaves ao host remoto, por exemplo, dispositivos de rede.
— precisa saber é o seguinte

1
Eu tentei isso. O ssh ainda está pedindo uma senha. Você precisa especificamente fornecer um endereço IP? Eu tentei com ambos <user> @ <domain-name> e apenas o nome do domínio.
— Jay Bienvenu

Este comando disse muitos argumentos? (para a etapa 3)
— Joseph Astrahan 08/08

Eu tive que mudar para ssh-keygen -t dsa e inserir manualmente o local do arquivo.
— Joseph Astrahan

20

Nas distribuições baseadas no Debian, o sshpasspacote fornece uma maneira mais fácil de fazer o que você deseja. O pacote está disponível para muitas outras distribuições populares. Você precisa configurá-lo primeiro:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Em seguida, chame o comando SSH a partir de um script como este:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

Isso fornece mais flexibilidade, como se você estiver usando um código de idioma diferente ou precise alterar a senha, do que as soluções usando expect.


7

Primeiro instale o sshPass sudo apt-get install sshpass

Em seguida, crie um alias no arquivo .bashrc como

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Agora recarregue seu arquivo .bashrc alterado source ~/.bashrc

Você está pronto agora.

Agora você pode executar o ssh usando o alias criado acima sshLoginno terminal.



2

Tudo o que você precisa para criar uma chave de hash e salvá-la no seu PC

Apenas digite

ssh-keygen -t rsa -b 4096 # just press Enter till the end

então entre

ssh-copy-id <user>@<server>

faça o login normalmente usando

ssh <user>@<server>

Agora você não precisa de uma senha

Nota: Salvar sua senha em texto sem formatação é perigoso

Esse método está criando um valor de hash da sua senha usando o RSA com chave pública de comprimento 4096, o que é muito seguro.


1
Parece ser uma repetição desta resposta .
— roaima

#roaima Sim, mas algo sugere o ssh-copy-idcomando incrivelmente útil , que ninguém mais mencionou. Estou votando por isso.
— Huw Walters

1

Login sem senha do SSH usando o SSH Keygen em 5 etapas fáceis :

Configuração do ambiente: insira a descrição da imagem aqui

Etapa 1: Chaves SSH-Kegen de autenticação ativadas - (192.168.0.12)
Primeiro efetue login no servidor 192.168.0.12 com um usuário e gere um par de chaves públicas usando o seguinte comando.

insira a descrição da imagem aqui

Etapa 2: Criar diretório .ssh em - 192.168.0.11
Use o SSH do servidor 192.168.0.12 para conectar o servidor 192.168.0.11 para criar o diretório .ssh nele, usando o seguinte comando.

insira a descrição da imagem aqui

Etapa 3: Carregar chaves públicas geradas para - 192.168.0.11
Use SSH do servidor 192.168.0.12 e faça upload da nova chave pública gerada (id_rsa.pub) no servidor 192.168.0.11 no .sshdiretório do usuário como um nome de arquivo autorizado_chave.

insira a descrição da imagem aqui

Etapa 4: Definir permissões em - 192.168.0.11
Devido às diferentes versões do SSH nos servidores, precisamos definir permissões no .sshdiretório e no authorized_keysarquivo.

insira a descrição da imagem aqui

Etapa 5: Efetue login de 192.168.0.12 a 192.168.0.11 Servidor sem senha
A partir de agora, podemos fazer login em 192.168.0.11 como usuário sheena do servidor 192.168.0.12 como usuário tecmint sem senha.

insira a descrição da imagem aqui


Obrigado ... isso funcionou para mim, exceto na etapa 4, recebi um "aviso" dramático: "ARQUIVO DE CHAVE PRIVADA NÃO PROTEGIDA! ... ... /. Ssh / id_rsa 'estão muito abertos. ... a chave privada será ignorado ... permissões ruins ". Eu fiz chmod 700 id_rsano diretório .ssh no servidor local (cliente, ou seja, 192.168.0.12 no seu exemplo): resolvido o problema
— mike


1

Como já descrito em outras respostas, eu também uso, sshpassmas eu o combino com o readcomando para armazenar minha senha em uma variável de ambiente temporária. Dessa forma, minha senha nunca é escrita em nenhum lugar de forma clara. Aqui está o comando de uma linha que eu uso:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

Depois disso, é necessário digitar sua senha (nada aparece na tela) e pressionar Enter para abrir a conexão.


0

Eu fiz isso recentemente, isso pode ajudá-lo:

sshpass -p 'password' username@ipaddress

se isso não funcionar, você precisará gerar chaves na outra máquina com a qual deseja se conectar

ssh-keygen

ele gerará chaves privadas e públicas e solicitará um local; deixe em branco; ele salvará as chaves na pasta .ssh; por padrão, solicitará a senha; você também pode deixá-lo vazio na pasta .ssh e altere o nome da chave pública para 'allowed_keys'

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

isso adicionará o usuário à lista agora vá para o diretório inicial e dê permissão e reinicie os serviços sshd

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

agora você terá que mover a chave privada para o sistema naquele local de onde você executará o comando ssh, para conectar-se a

sshpass -p 'password' ssh -i id_rsa username@ip

se mesmo isso não funcionar, entre no / etc / ssh open sshd_config com o editor vim, verifique se o pubkeyAuthenticatoin está sim ou não, se não o alterar, se não mudar para sim, reinicie os serviços sshd e tente, definitivamente funcionará .


0

O primeiro argumento é o nome do host e o segundo é a senha.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Execução: ./script.expect

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.