Execute o comando na conexão sftp através do script

11

Esta é uma pergunta muito básica. Eu sou muito novo em bash e não consegui descobrir como fazer isso. Pesquisando, infelizmente, não me levou a lugar nenhum.

Meu objetivo é conectar com o sftp a um servidor, fazer o upload de um arquivo e, em seguida, 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. Uma vez que eu manualmente digite exit na conexão, ele tenta executar o comando put, mas como a sessão sftp foi fechada, apenas diz put: command not found.

Como posso fazer isso funcionar corretamente?

Obrigado

    
por kalenpw 07.10.2016 / 23:18

4 respostas

12

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 do nome ( EOF ) diz ao script para passar as linhas a seguir até que o nome seja encontrado no início da linha (por si só).

    
por 07.10.2016 / 23:23
5

Você pode preferir usar scp em vez de sftp . scp se comporta como o comando normal cp , 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

Isto copia o arquivo em sua máquina local para um diretório na máquina remota sem ter que usar a interface de comando estilo old-school ftp.

Os serviços ssh , scp e sftp estão geralmente disponíveis se algum deles estiver; 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 é muito raro.

    
por 08.10.2016 / 01:51
3

Você também pode usar a opção -b de sftp para indicar um arquivo contendo comandos para sftp .

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 sftp como:

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.

De man sftp :

-b batchfile

Batch mode reads a series of commands from an input batchfile instead of stdin. Since it lacks user interaction it should be used in conjunction with non-interactive authentication. A batchfile of ‘-’ may be used to indicate standard input. sftp will abort if any of the following commands fail: get, put, reget, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, and lmkdir. Termination on error can be suppressed on a command by command basis by pre‐ fixing the command with a ‘-’ character (for example, -rm /tmp/blah*).

    
por 07.10.2016 / 23:29
0

Outra opção seria usar o curl :

curl -u user -T file.tar sftp://example.com/home/user/
    
por 13.08.2017 / 22:12