Ejecutar comando en conexión sftp a través de script

13

Esta es una pregunta muy básica que soy bastante nuevo en bash y no pude entender cómo hacer esto. Googlear desafortunadamente no me llevó a ninguna parte.

Mi objetivo es conectarme con sftp a un servidor, cargar un archivo y luego desconectarme.

Tengo el siguiente 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

El problema es que este script establecerá una conexión sftp y luego no hará nada. Una vez que escribo manualmente exit en conexión, intenta ejecutar el comando put pero debido a que la sesión sftp se ha cerrado, solo dice put: comando no encontrado.

¿Cómo puedo hacer que esto funcione correctamente?

Gracias

kalenpw
fuente

Respuestas:

15

Puede cambiar su script para pasar comandos en un documento aquí, por ejemplo,

#!/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

El <<marcador seguido del nombre ( EOF) le dice al script que pase las siguientes líneas hasta que el nombre se encuentre al comienzo de la línea (por sí mismo).

Thomas Dickey
fuente
Impresionante que hizo exactamente lo que necesitaba. Tendré que leer aquí los documentos. Gracias por la respuesta rápida, lo aceptaré en 8 min.
kalenpw
No hay problema (busqué un duplicado pero solo encontré uno cerrado como "incierto").
Thomas Dickey
¿Estás seguro de que el servidor no se ahogará con los comentarios del script de shell?
alk
Además, este enfoque depende del tipo de shell.
alk
@alk el script funciona con y sin comentarios
kalenpw
5

Es posible que prefiera usar en scplugar de sftp. scpse comporta de manera muy similar al cpcomando ordinario , pero los archivos pueden 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

Esto copia el archivo en su máquina local en un directorio en la máquina remota sin tener que usar la interfaz de comando de estilo ftp de la vieja escuela.

Las ssh, scpy sftplos servicios están generalmente disponibles si alguno de ellos son; el mismo programa daemon los proporciona a todos simultáneamente. En principio, el administrador del servidor podría optar por desactivar cualquiera de ellos, pero en la práctica eso es bastante raro.

db48x
fuente
No sabía sobre scp de antemano parece muy útil. Y tenías razón, scpya está disponible en mi máquina
kalenpw
4

También puede usar la -bopción de sftpindicar un archivo que contiene comandos para sftp.

Por ejemplo, puede poner todos sus comandos en el archivo 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

y correr sftpcomo:

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

O también puede pasar los comandos a través de STDIN si no desea utilizar un archivo.

De man sftp:

-b archivo por lotes

El modo por lotes lee una serie de comandos de un archivo por lotes de entrada en lugar de stdin. Como carece de interacción con el usuario, debe usarse junto con la autenticación no interactiva. Se puede usar un archivo por lotes de '-' para indicar una entrada estándar. sftp abortará si alguno de los siguientes comandos falla: get, put, reget, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink y lmkdir. La terminación en caso de error se puede suprimir comando por comando pre-fijando el comando con un carácter '-' (por ejemplo, -rm / tmp / blah *).

heemayl
fuente
2

Otra opción sería usar curl :

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