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.