Script de shell da máquina local para executar o comando na máquina remota e continue na máquina local

10

O problema é o seguinte: quero copiar arquivos de uma máquina remota.

Estou procurando uma maneira de escrever um shell script que se conecte à máquina remota, obtenha a localização do arquivo armazenado, assim que eu obtiver a localização desconectada do servidor remoto e usar scp de dentro da máquina local com a localização obtida para copie o arquivo

Especificamente, eu quero saber como, a partir de um script, eu me conectaria a uma máquina remota, executaria tarefas nessa máquina. Desconecte e continue a execução localmente.

gnsr
fonte

Respostas:

15

Solução 1:

remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path

Isso funciona conectando-se à máquina remota, executando alguns comandos e copiando a saída para uma variável em sua máquina local. Digamos, ecoando o caminho do arquivo remotamente, capturando-o localmente.

Solução 2:

ssh user@host "determine_path; cat filename" >local_filename

Isso funciona localizando e produzindo o arquivo diretamente do controle remoto e redirecionando-o para um arquivo localmente. Isso pula scp. Isso requer que as etapas anteriores a "cat" não tenham saída (que você pode resolver com &> / dev / null).

Mark Griffin
fonte
1
+1 para mostrar como resolver todo o problema com uma conexão, em vez de ssh + scp separado.
Peter Cordes
Todas as respostas são úteis, mas este endereços meu problema mais especificamente
gnsr
20

Você pode escrever um script no seguinte formato:

command1
command2
...
ssh user@machine command3
...
command4
command5

Você precisa configurar as chaves SSH para serem command3executadas sem solicitar uma senha.

Khaled
fonte
2
Note-se que isso será por síncrona. Enquanto ssh user@remote command3estiver em execução, command4não é possível iniciar
aaaaa diz restabelecer Monica
3
@aaaaaa, a menos que você tenha feito #ssh user@machine command3 &
Isaac
3
@ Isaac sim, meu argumento é que qualquer um pode ser um comportamento desejável, mas deve ser uma decisão consciente
aaaaa diz restabelecer Monica
2

Suponho que você já tenha alguma idéia de como identificar o arquivo que deseja copiar e que possa ou já tenha escrito um script ou conjunto de comandos que serão executados na máquina remota que faz essa identificação .

Além disso, também assumirei que esses comandos imprimem na saída padrão o caminho completo para o arquivo, ou o caminho relativo para o arquivo, relativo ao diretório inicial do usuário SSH que está sendo usado para a cópia. No meu exemplo, o nome do script é "getfilepath.sh", embora não precise ser um script de shell, pode ser outro executável ou até uma série de comandos.

# Script to be executed on local machine.

# put any leading local commands here.

FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .

# put any trailing local commands here.

No código acima, a notação "$ ()" é uma maneira de capturar a saída padrão de um comando como uma variável de shell. É bastante padrão, mas se você estiver usando um shell que não o entende, poderá cercar o comando com "back-ticks", que são as marcas de destaque à esquerda da tecla 1 na maioria dos teclados dos EUA.

Jeremy Impson
fonte
0

talvez seja possível disparar uma tarefa agendada na máquina remota que faça todo o trabalho.

Isso impediria que você estivesse conectado à máquina remota enquanto pesquisava o local dos arquivos que deseja copiar.

Eu estou fazendo isto:

linha de comando dispara uma tarefa agendada que executa um batchscript no meu caso.

schtasks /run /s remoteserver /u %user% /p %password% /tn "scheduledtaskname"

Cumprimentos

Denyo
fonte