Como SSH em uma linha


26

Como eu me conectaria a outro computador através do SSH em uma linha? Se eu fosse fazer ssh host@IP, seria necessário digitar a senha na segunda linha. Eu estava pensando que poderia fazer algo assim:, ssh host@IP | echo passwordmas isso coloca a senha antes de solicitá-la.


3
Esse tipo de pensamento vem dos dias do telnet e espera, quando a internet era um lugar mais seguro. A resposta de Allen está correta, a resposta de Jakuje é tecnicamente verdadeira, mas não é a ferramenta para o trabalho na maioria dos lugares.
precisa saber é o seguinte

3
Essa é uma boa pergunta para configurar o login sem senha. Eu pediria que você revisitasse sua resposta aceita. A resposta de Jakuje está correta e funcionará, a maneira correta de fazer isso é com as chaves SSH, descritas na resposta de Allan.
Scot

Se sshleria a senha do stdin, echo password | ssh host@IPfuncionaria, mas geralmente o SSH tenta ler diretamente do terminal.
Paŭlo Ebermann 5/17

Respostas:


82

Você deve usar as chaves SSH para se autenticar, em vez de colocar sua senha na linha de comando, pois é extremamente insegura.

A maneira como isso funciona é quando as chaves SSH são configuradas, tudo o que você precisa fazer é emitir o comando:

ssh user@host

e sem digitar outra coisa, você será automaticamente conectado.


Copie a chave pública SSH para Mac / FreeBSD / Linux do macOS

Isso pressupõe que você tenha acesso ao servidor remoto via autenticação baseada em senha (digitando uma senha) e que você já gerou seu par de chaves pública / privada (caso contrário, veja abaixo). No exemplo a seguir, estamos usando o RSA. Para começar, copie a chave (lembre-se de que o diretório "home" difere entre macOS, Linux, BSD etc.):

Usando SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

Ou simplesmente colocar o arquivo authorized_keys(eu prefiro este método):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(O nome da sua chave pode ser diferente) Se o diretório .ssh não existir no servidor remoto, você precisará fazer login e criá-lo.

Agora, a chave foi copiada do mac para o servidor remoto . Defina as permissões corretas para a chave pública SSH no servidor remoto:

chmod 600  ~/.ssh/id_rsa.pub

Em seguida, inclua a chave no arquivo SS_ allowed_keys, se o arquivo não existir, crie-o.

Se o arquivo authorized_keysjá existir no ~/.sshuse o seguinte comando:

cat id_rsa.pub >> authorized_keys

Se o arquivo não existir, digite os seguintes comandos:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Gere chave pública / privada SSH no macOS

Abra o Terminal, vá para Aplicativos -> Utilitários -> Terminal

No terminal, use o seguinte comando para iniciar a geração de chaves

ssh-keygen -t rsa

Em seguida, você será solicitado a fornecer o local em que deseja criar o arquivo de chave privada:

Digite o arquivo no qual salvar a chave ( /Users/username/.ssh/id_rsa):

Deixe em branco para criar a chave no local padrão, que é /Users/username/.ssh/id_rsa. O arquivo de chave pública será criado no mesmo local e com o mesmo nome, mas com a extensão .PUB.

Depois, você será solicitado a escolher uma senha. Essa é a senha opcional para usar a chave privada.

Enter passphrase (empty for no passphrase):

Sua chave SSH é gerada.

Agora, lembre-se de que, se você digitar uma senha, será necessário digitá-la sempre que se conectar. O utilitário ssh-agentmanterá a senha na memória, aliviando a necessidade de inseri-la manualmente toda vez que você se conectar enquanto estiver na mesma sessão. Para mais detalhes, consulteman ssh-agent


6
Absolutamente isso - as chaves podem e devem substituir completamente as senhas de qualquer acesso ssh pela Internet. Eu sugiro que você expanda a necessidade de segurança da chave privada, que não é algo para se ter em todos os seus computadores.
Criggie

+1 Esta é uma resposta muito boa, não apenas pelo que diz, mas também pelo modo como você a explicou. Qualquer coisa que seja mais fácil para os usuários seguirem e os ajude a serem mais seguros é uma vantagem nos meus livros!
Monomeeth

7
Ótima resposta. Só queria acrescentar que ssh-copy-idé uma boa ferramenta para automatizar algumas das opções acima.
Scot

Uma menção de ssh-agent também pode ajudar. A maioria (todas?) Das versões do OS X / macOS vem com ele e permite login sem senha, mesmo quando a chave está protegida por senha.
Qsigma

1
@Scot - não faz parte do macOS por padrão e deve ser instalado via Homebrew ou MacPorts . Eu não sou fã de instalar software, pois as coisas podem ser realizadas em uma linha ou em um script curto e auto-escrito, e por esses motivos, achei que estava fora do escopo da resposta. No entanto, é uma pequena utilidade boa e vale a pena mencionar.
Allan

13

Existem várias possibilidades. Seu exemplo obviamente não funcionará, mas você pode obter algo semelhante usando o sshpassutilitário:

sshpass -p password ssh host@IP

Observe que isso não é recomendado, pois passwordficará visível para outros processos ou no histórico do shell.

Uma maneira muito melhor de fazer o mesmo é configurar a autenticação sem senha usando chaves SSH. Em resumo:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP

Eu tentei o sshpasscomo você recomendou, mas ele disse que o comando não foi encontrado.
Ben A.

8
Bem ... Você provavelmente terá que instalá-lo. E não, eu não recomendo. Configure a autenticação sem senha usando as chaves ssh.
Jakuje 4/17/17

4
@BenA. configure a autenticação sem senha, definindo um teclado público / privado e configurando-o nas duas máquinas envolvidas. Isso é muito mais fácil (e realmente mais seguro) do que qualquer senha
nohillside

8
Mil vezes não. O sshpass é um hack sujo usado para conectar-se a dispositivos que falam ssh, mas não fazem as chaves corretamente, e seu principal uso é o script de instalação. Você não usaria o sshpass em uma máquina multiusuário para ps auxw | grep sshpass informar aos outros usuários a senha do ssh.
Criggie

1
@Criggie, não inteiramente. Embora eu esteja 100% por trás da solução baseada em chave, possuo sshpass em alguns Raspberry Pis somente internos (para tarefas aleatórias e acessados ​​por clientes aleatórios; passar as chaves apenas para uso interno é um aborrecimento). Executando o seu comando dá o seguinte resultado: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh pi@192.168.0.208. O zzzzzzzzé literal; O sshpass mascara o conteúdo da senha. Talvez as iterações anteriores tenham menos consciência de privacidade.
flith

3

Passei muito tempo procurando a resposta para isso também. Apesar de ser inseguro e de todas essas pessoas dizerem para você usar chaves RSA ( que é uma idéia mais segura e confiável ), é bem possível.

Use um programa chamado expectpara isso. O Expect irá assistir ao stdout (e acho que o stderr se configurado corretamente) por você, aguardando determinadas mensagens e respondendo a elas com a saída. O próprio esperar é realmente uma linguagem de script e, quando eu fazia a mesma coisa, era muito difícil conseguir que meu próprio script funcionasse corretamente devido ao tempo. No entanto, o expect também inclui um utilitário útil chamado autoexpect.

Com a autoexpect, ele o observará e gerará um script de expectativa para você. Basta executar o autoexpect e o comando que você deseja:

autoexpect ssh host@ip 

e faça o que você normalmente faria. Quando você sai do programa (digitando exitno shell ssh'd), ele gera o script. Caso você não queira que todo o script que você está escrevendo esteja em um script esperado, você pode editar o script de autoexpect (chamado script.exp) para sair antes de digitar o exitcomando no shell. A linha que você deseja mover para alterar o final do script é:

expect eof

o que significa esperar o final do arquivo. Espero que isto ajude!


1
Caso ninguém mais tenha dito ainda: Bem-vindo ao Ask Different!
Synoli

2

O uso expecté totalmente errado para fazer login em uma conexão ssh para algo que não seja em um conjunto de testes.

O que o @ ben-a está procurando já está implementado no ssh. O truque é como usá-lo. Então aqui vai:

  1. Gere um par de chaves público / privado usando ssh-keygen. Use ECDSA ou RSA como -t(ou tipo) e para RSA use 2048 ou 4096 como -b(ou comprimento do BITS). Isso deve ser suficiente no momento da escrita. SEMPRE use uma SENHA!
  2. Utilize a ssh-copy-idmetodologia mencionada acima para criar na máquina em que você está efetuando logon (também conhecido como servidor) o ~/.ssh/authorized_keysarquivo. Dentro, há uma cópia da chave pública que você acabou de gerar.
  3. Agora, na máquina que você usa para fazer login no 'servidor' (ou cliente), você abre o arquivo ~/.ssh/config. Se não existir, você pode criá-lo.
  4. Neste arquivo, você adiciona o seguinte para suas necessidades

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Agora você pode usar apenas ssh <name>para configurar a conexão, mas ainda precisará da senha da sua chave. Para resolver isso, use o ssh-agent desenvolvido para essa finalidade e incluído. Para adicionar sua chave ao agente, basta usar ssh-add <path to keyfile>. Você será solicitado a senha e ela armazenará a chave para você com segurança nesta sessão. Se gerar o erro "não é possível encontrar o agente ssh" (ou similar), isso significa que provavelmente o agente não foi iniciado. Você pode iniciá-lo para esta sessão usando ssh-agent bash. Isso iniciará um novo shell com o agente ativo nele.

Ao usar essas etapas, você não apenas dificulta a representação de alguém ao seqüestrar suas credenciais, mas também mantém a usabilidade em ordem (é mais fácil de usar do que as senhas comuns).

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.