Script de shell remoto Digite a frase secreta para

5

Como posso executar um script para entrar em um servidor remoto e executar um comando ssh remoto sem inserir minha senha?

Por exemplo:

Quando eu faço logon em um servidor remoto e executo o comando git pull , vejo ssh solicitar minha senha:

$ git pull origin master
Enter passphrase for /home/v3ed2/.ssh/id_rsa:

Quando eu inserir minha senha, continuo com o comando.

Eu quero executar um script que faça o login no servidor remoto e execute o comando para mim. Eu já tentei este script:

ssh ve "cd clients/ ; git pull"

No entanto, quando o script é executado, ele não solicita minha frase-senha. O script é interrompido enquanto aguarda minha frase-senha, mas quando tento digitar uma senha, recebo o erro:

bash: line 1: [REDACTED]: command not found    
    
por luk3thomas 22.12.2012 / 05:59

3 respostas

6

Quando você executa ssh com nenhum comando, ele configura um pseudo-terminal no lado do servidor e executa um shell interativo nesse terminal. Quando você passa um comando, o comando é executado com sua entrada e saída diretamente conectadas ao canal SSH, não há terminal remoto. Se você passar a opção -t , um terminal será criado no lado remoto e você receberá uma solicitação de senha onde poderá digitar sua senha.

ssh -t ve "cd clients/ ; git pull"

No entanto, essa não é uma maneira conveniente de fazer isso. A maneira conveniente é executar um agente SSH em sua máquina local e encaminhar a conexão desse agente.

Primeiro, você precisa usar a autenticação de chave pública, não a autenticação de senha, na segunda conexão (para o servidor git). Você já está fazendo isso, então não vou entrar em mais detalhes.

Copie a chave privada do segundo servidor ( /home/v3ed2/.ssh/id_rsa na máquina intermediária) para a sua máquina local. Alternativamente, no servidor git, autorize uma chave pública para a qual você possui a chave privada em sua máquina local. Como alternativa, execute primeiro ssh -t ve ssh-add .ssh/id_rsa para registrar a chave da máquina intermediária com seu agente local.

Algumas distribuições e ambientes de área de trabalho já configuram um agente SSH. Verifique se você tem um em execução com ssh-add -l . Se isso indicar que você não tem agente em execução, será necessário iniciar um com sua sessão. Execute ssh-agent your-session-manager em vez de chamar your-session-manager diretamente ou execute eval $(ssh-agent) no script de inicialização da sessão ou marque a caixa de seleção "executar o agente SSH" na configuração da GUI. Você precisa fazer duas coisas: iniciar o programa ssh-agent e obter a variável SSH_AUTH_SOCK que define ou imprime no ambiente da sua sessão. Os detalhes de como fazer isso são muito específicos para seu ambiente de distribuição e área de trabalho.

Depois de ter o agente SSH sendo executado localmente, verifique se ele está encaminhado. Pode ou não ser encaminhado por padrão. Execute ssh ev ssh-add -l para verificar se o agente foi encaminhado. Se não estiver, adicione a linha ForwardAgent yes ao seu local ~/.ssh/config .

Se você estiver executando o Windows com o PuTTY localmente, ele também vem com um agente de chave, o Pageant. Consulte o Manual do PuTTY para obter instruções.

Quando você tiver uma configuração de agente SSH em funcionamento, registre sua (s) chave (s) com o agente uma vez por sessão, com o comando ssh-add ~/.ssh/id_rsa (ou qualquer que seja o caminho para a chave privada). Depois disso, você pode usar a chave sem solicitar o restante da sessão.

    
por 22.12.2012 / 15:32
3

A pergunta é muito ampla, por isso existem várias variantes para corrigir isso.

O primeiro é usar uma chave sem passphrase. Tecnicamente, uma frase secreta é uma chave para algum algoritmo de criptografia simétrica que criptografa a chave privada local. Frase secreta vazia significa que a chave não é criptografada e pode ser usada por qualquer pessoa que tenha acesso para lê-la. Você pode instruir o ssh-keygen a usar a frase secreta vazia com -N '' ao gerá-la ou alterá-la posteriormente usando -p (todas as opções são para o tipo OpenSSH). Esse é o método mais popular para fornecer acesso automatizado assinado a um sistema remoto. Geralmente é combinado com restrições do lado do servidor para a chave (limitando por IP, comando forçado, shell restrito, etc.)

Você pode proteger chaves privadas não criptografadas em um disco criptografado, se necessário.

Em seguida, você pode usar o ssh-agent. Requer que um usuário esteja logado no sistema e armazena em cache as senhas em sua memória durante a execução, para que você possa inserir a frase secreta apenas uma vez durante uma sessão de terminal X (ou analógica) e depois conectar-se automaticamente ao servidor remoto sem repetir a frase secreta.

Em seguida, você pode usar o Kerberos, que fornece seus próprios tíquetes de sessão para o login remoto, se os hosts do cliente e do servidor pertencerem ao mesmo domínio.

Em seguida, você pode usar expect ou uma ferramenta semelhante para automatizar a interação com um terminal no qual o comando é executado. Seu script deve ouvir um prompt de frase secreta e inseri-lo. Mas isso é muito mais complexo e complicado do que todas as outras abordagens descritas aqui, e deve ser tratado como o último recurso quando outros falham.

Esta lista pode ser continuada com abordagens mais exóticas:)

    
por 22.12.2012 / 07:18
1

Acho que o que você está procurando é o uso de chaves SSH. Você precisará gerar um conjunto de chaves (uma é privada, a outra é pública) e adicionar a chave pública à sua conta no sistema remoto. Uma vez que você tenha as chaves situadas, você poderá fazer o login remotamente no outro sistema, sem ter que pedir uma senha.

Confira esses howtos para mais detalhes:

por 22.12.2012 / 06:37