Script de shell para ssh em um servidor Unix / Linux do MacOS X 10.10

1

Eu estou tentando ssh em um servidor usando um script bash do MacOSX.

#!/bin/bash

spawn ssh username@gatewayserver
expect "password"
send "Mypassword\r"
interact

spawn ssh username@storageserver
expect "password"
send "Mypassword\r"
interact
cd /path

spawn scp -r retrievedfolder username@gatewayserver:/path/
expect "password"
send "Mypassword\r"
interact

exit
exit

spawn scp -r username@gatewayserver:/path/retrievedfolder .
expect "password"
send "Mypassword\r"
interact

spawn ssh username@gatewayserver
expect "password"
send "Mypassword\r"
interact
rm -r retrievedfolder/
exit

mv -nv -- "$retrievedfolder" "$retrievedfolder.$(date +%Y%m%d)"
mv /retrievedfolder /backup

Se você puder seguir o código provavelmente redundante, o objetivo é fazer login no servidor gateway para acessar o servidor de armazenamento. cd para a pasta apropriada. cópia segura da pasta que eu quero para um diretório no servidor de gateway e, em seguida, copie o arquivo do servidor de gateway para a área de trabalho. Então eu quero remover a pasta recuperada do servidor de gateway (limitações de armazenamento) e mova a pasta copiada para uma pasta na área de trabalho com a data atual anexada ao final do nome do arquivo. Eu acho que a maior parte do que eu escrevi deve funcionar se eu estivesse rodando linux mas basear-se no MacOS não está reconhecendo spawn send ou interact e está procurando por um arquivo ou diretório após expect .

Depois de alguma ajuda de Stephen Kitt e webKnjaZ, meu código se parece mais com isso:

#!/bin/bash

ssh username@gatewayserver 'ssh username@storageserver; cd /path/; scp -r retrievedfolder username@gatewayserver:/path/'

scp -r username@gatewayserver:/path/retrievedfolder .

ssh username@gatewayserver 'rm -r retrievedfolder/'

mv -nv -- "retrievedfolder" "retrievedfolder.$(date +%Y%m%d)"
mv retrievedfolder.$(date +%Y%m%d)/ backup/

Após configurar corretamente o SSH sem senha, ele quase funciona corretamente. Sem ssh -tt, é exibida uma mensagem de erro: "O pseudo-terminal não será alocado porque o stdin não é um terminal". Com ssh -tt ele para no prompt de comando uma vez logado no segundo servidor, e quando eu uso o ssh -T ele trava. (provavelmente no mesmo local, mas não visível)

    
por Charles Butler 18.02.2015 / 00:20

3 respostas

3

Acho que você está apenas tentando copiar arquivos do servidor por trás do NAT por meio de gatewayserver .

Eu sugeriria uma solução mais simples.

  1. Configure a autenticação sem senha (coloque a chave privada da sua área de trabalho / Mac nos dois servidores mencionados)
  2. Use algo como

    ssh -MNf -L 60022:storageserver:22 username@gatewayserver
    

    para configurar o túnel ssh via gatewayserver . Agora a porta do seu Mac 60002 tem conexão direta com a porta 22 de storageserver .

  3. Neste ponto, você pode copiar arquivos diretamente através deste túnel:

    scp -P 60022 -R username@localhost:/path/to/folder .
    

Coloque esses comandos em seu script bash e você conseguirá o que deseja.

UPD:

Juntando tudo, aqui está o script completo:

#!/bin/bash

# set up tunnel
ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver || true

# copy files __directly__ into correct backup folder
scp -P 60022 -R "storageserver_username@localhost:/remote/path/to/retrievedfolder/at/storageserver" "/local/path/to/backup/retrievedfolder.'date +%Y%m%d'"

Pré-requisitos (execute apenas uma vez no seu Mac):

# Create SSH keys @ local machine
ssh-keygen

# Put your local SSH key to the gateway server
ssh-copy-id gatewayserver_username@gatewayserver

# Enable tunnel (will not ask your password if previous steps are correct)
ssh -MNf -L 60022:storageserver:22 gatewayserver_username@gatewayserver

# Put your local SSH key to the storageserver server
ssh-copy-id -p 60022 storageserver_username@localhost
    
por 18.02.2015 / 02:49
1

Se você olhar para Shell Script para fazer login em um ssh servidor você notará que a linha shebang é

#!/usr/bin/expect

Este é um script expect , não um script bash . Você precisará instalar Espere se ainda não o tiver.

    
por 18.02.2015 / 00:31
0

Para simplificar ainda mais:

Em primeiro lugar, você deve usar chaves em vez de senhas (o que você está fazendo agora).

Em segundo lugar, adicione o seguinte ao seu ~/.ssh/config

Host storageserver
    ProxyCommand ssh gatewayserver nc %h %p

Em terceiro lugar, use rsync para que seu script se torne um único comando:

rsync -havz storageserver:/path/retrievedfolder/ backup/retrievedfolder.$(date +%Y%m%d)

Que é um pouco mais curto que o ponto de partida!

    
por 05.10.2015 / 00:37