Pergunta

Existe uma maneira de passar uma senha para o SSH automaticamente. Eu gostaria de automaticamente ssh para um servidor sem Usando a autenticação de chave pública ou espere scripts, de alguma forma fazendo com que o SSH leia a senha do Stdin ou um arquivo.

A razão pela qual deve ser assim é que eu gostaria de fazer backup dos meus arquivos em um servidor usando o RSYNC/SSH em execução como um trabalho de Cron. Este servidor monta meu diretório doméstico depois Ele me autentica, portanto, o uso da autenticação de chave pública não funciona, pois ~/.SSH não está disponível até que o login seja bem -sucedido. Espere (1) está fora de questão, porque eu gostaria de executá -lo como um trabalho de cron e, como os trabalhos de Cron não correm sob um terminal, a combinação de espera/ssh simplesmente não funciona. Não tenho acesso raiz a esse servidor e seria difícil fazer com que os administradores façam alterações na maneira como as coisas funcionam lá.

Foi útil?

Solução

Usar sshpass.

Por exemplo, quando a senha está em password.txt Arquivo:

sshpass -fpassword.txt ssh username@hostname

(retirado da resposta para um pergunta semelhante)

Outras dicas

Espere está fora de questão, porque eu gostaria de executá -lo como um trabalho de cron e, como os empregos de Cron não correm sob um terminal, a combinação de espera/ssh simplesmente não funciona

Você pode executar scripts de espera de Cron, pelo menos você pode com bibliotecas de espera como "Pexpect" para Python. Acabei de testar isso para confirmar, executando um script SCP/SSH da PEXPET da CRON e pude SCP com sucesso um arquivo de um script Python em execução em Cron.

Código de exemplo:

#!/usr/bin/python

import pexpect

FILE="/path/to/file"
REMOTE_FILE=""
USER="user"
HOST="example.com"
PASS="mypass"
COMMAND="scp -oPubKeyAuthentication=no %s %s@%s:%s" % (FILE, USER, HOST, REMOTE_FILE)

child = pexpect.spawn(COMMAND)
child.expect('password:')
child.sendline(PASS)
child.expect(pexpect.EOF)
print child.before

Em vez de passar sua senha, use um sistema de chave pública/privada. Adicione a chave pública para uma máquina à lista de chaves autorizadas em todas as máquinas às quais você deseja conectar. O uso deste método SSH pode validar as chaves automaticamente e nenhuma senha é necessária.

Você pode encontrar instruções aqui: http://linuxproblem.org/art_9.html

Como acabei de ler a pergunta com mais cuidado, convém procurar um cliente SSH diferente que suporta autenticação por senha sem interação do usuário. Eu rapidamente a pesquisa no Google sugeriu que eles existem (http://www.derkeiler.com/newsgroups/comp.security.ssh/2004-12/0134.html)

Perguntas relacionadas ao Stackoverflow:

This discussion talks about what you are trying to do:

http://cygwin.com/ml/cygwin/2004-02/msg01449.html

If you can't have the admin create a local directory for you, then this won't work.

SSH requires a "leap of faith" to secure the initial handshake against future tampering. (You initially trust the key the server gives you)

One currently avaliable but not well known approach is to use SSH-SRP. This uses mutual password knowledge to both authenticate you and provide session encryption keys necessary to securely encrypt your ssh session.

Its MUCH more secure than SSH's initial "trust me" and does not require long term storage of keys.

Don't use expect, pexpect or the like to feed in a password. If you do that, your password has to be somewhere in plaintext, which can actually be less secure than using a passwordless public/private key pair. And it's more work!

Read this page from "SSH: The Definitive Guide" for a discussion of your options: http://www.snailbook.com/faq/no-passphrase.auto.html

You have misunderstood how public key authentication works. You don't need access to your remote home directory, simply put the local public key in the remote authorized_keys file. Have a google around, there's plenty of guides.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top