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 kalenpw@184.155.136.254:/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


Respuestas:


15

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

#!/bin/bash

sftp -oPort=23 kalenpw@184.155.136.254:/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).


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 kalenpw@184.155.136.254:/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.


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 kalenpw@184.155.136.254:/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 *).


2

Otra opción sería usar curl :

curl -u user -T file.tar sftp://example.com/home/user/
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.