Executar comando na conexão sftp por meio de script

13

Esta é uma pergunta muito básica, sou bastante nova no bash e não consegui descobrir como fazer isso. Infelizmente, pesquisar no Google não me levou a lugar algum.

Meu objetivo é conectar-se ao sftp em um servidor, carregar um arquivo e desconectar.

Eu tenho o seguinte script:

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins
#Change directory on server
#cd /home/kalenpw/TestWorld/plugins

#Upload file
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar

exit

o problema é que esse script estabelecerá uma conexão sftp e não fará nada. Depois de digitar manualmente exit em conexão, ele tenta executar o comando put, mas como a sessão sftp foi fechada, apenas diz put: command not found.

Como faço para que isso funcione corretamente?

obrigado

kalenpw
fonte

Respostas:

15

Você pode alterar seu script para passar comandos em um documento aqui, por exemplo,

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins <<EOF
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar   
exit
EOF

O <<marcador seguido pelo nome ( EOF) diz ao script para passar as seguintes linhas até que o nome seja encontrado no início da linha (por si só).

Thomas Dickey
fonte
Incrível que fez exatamente o que eu precisava. Vou ter que ler aqui os documentos. Obrigado pela resposta rápida. Aceito em 8 minutos.
kalenpw
Não tem problema (procurei uma duplicata, mas só encontrei uma fechada como "pouco clara").
Thomas Dickey
Tem certeza de que o servidor não engasgará com os comentários do shell-script?
alk
Além disso, essa abordagem depende do tipo de shell.
alk
@alk as obras de script com e sem comentários
kalenpw
5

Você pode preferir usar em scpvez de sftp. scpcomporta-se como o comumcp comando , mas os arquivos podem ser remotos:

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar [email protected]:/home/kalenpw/TestWorld/plugins

Isso copia o arquivo na sua máquina local para um diretório na máquina remota sem precisar usar a interface de comando antiga do estilo ftp.

Os ssh, scpe sftpserviços são geralmente disponíveis se algum deles são; o mesmo programa daemon fornece todos eles simultaneamente. Em princípio, o administrador do servidor pode optar por desativar qualquer um deles, mas na prática isso é bastante raro.

db48x
fonte
Não sabia sobre o scp de antemão parece muito útil. E você estava certo scpjá está disponível na minha máquina
kalenpw
4

Você também pode usar a -bopção de sftppara indicar um arquivo que contém comandos parasftp .

Por exemplo, você pode colocar todos os seus comandos no arquivo sftp_commands.txt:

cd /home/kalenpw/TestWorld/plugins
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar
exit

e execute sftpcomo:

sftp -oPort=23 -b sftp_commands.txt [email protected]:/home/kalenpw/TestWorld/plugins 

Ou você pode passar os comandos via STDIN também se não quiser usar um arquivo.

A partir de man sftp :

-b batchfile

O modo de lote lê uma série de comandos de um arquivo em lotes de entrada em vez de stdin. Como não possui interação com o usuário, deve ser usado em conjunto com autenticação não interativa. Um arquivo em lote de '-' pode ser usado para indicar a entrada padrão. O sftp será cancelado se qualquer um dos seguintes comandos falhar: get, put, reget, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink e lmkdir. A terminação por erro pode ser suprimida em um comando por base de comando, pré-fixando o comando com um caractere '-' (por exemplo, -rm / tmp / blah *).

heemail
fonte
2

Outra opção seria usar curl :

curl -u user -T file.tar sftp://example.com/home/user/
Pere
fonte