Выполнить команду в соединении sftp через скрипт

13

Это очень простой вопрос, я просто новичок в bash и не могу понять, как это сделать. Погуглить, к сожалению, никуда меня не привело.

Моя цель - подключиться к серверу с помощью sftp, загрузить файл, а затем отключиться.

У меня есть следующий скрипт:

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

проблема в том, что этот скрипт установит соединение sftp, а затем ничего не сделает. Когда я вручную набираю exit в соединении, он пытается выполнить команду put, но поскольку сессия sftp закрыта, он просто говорит: команда: не найдена.

Как я могу заставить это работать должным образом?

Благодарность

kalenpw
источник
Связанный: unix.stackexchange.com/questions/22726/…
Старейшина Гик

Ответы:

15

Вы можете изменить свой скрипт для передачи команд в здесь-документе, например,

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

<<Маркер следует имя ( EOF) говорит сценарию пройти следующие строки до тех пор , пока имя не будет найдено в начале строки (сам по себе).

Томас Дики
источник
Удивительно, что сделал именно то, что мне нужно. Я должен буду прочитать здесь документы. Спасибо за быстрый ответ, я приму его через 8 минут.
kalenpw
Нет проблем (я нашел дубликат, но нашел только один закрытый как «неясный»).
Томас Дики
Вы уверены, что сервер не захлебнется комментариями скрипта?
алк
Также этот подход зависит от типа оболочки.
алк
@alk скрипт работает с и без комментариев
kalenpw
5

Вы можете предпочесть использовать scpвместо sftp. scpведет себя так же, как обычная cpкоманда, но файлы могут быть удаленными:

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

При этом файл на локальном компьютере копируется в каталог на удаленном компьютере без использования старого командного интерфейса в стиле ftp.

В ssh, scpи sftpуслуги, как правило , доступны , если любой из них; одна и та же программа-демон предоставляет их все одновременно. В принципе, администратор сервера может отключить любой из них, но на практике это происходит довольно редко.

db48x
источник
Не знал про scp, заранее выглядит очень полезным. И ты был прав scpуже доступен на моей машине
kalenpw
4

Вы также можете использовать -bопцию, sftpчтобы указать файл, содержащий команды для sftp.

Например, вы можете поместить все свои команды в файл 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

и запустить sftpкак:

sftp -oPort=23 -b sftp_commands.txt kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins 

Или вы можете передавать команды через STDIN, если вы не хотите использовать файл.

От man sftp:

-b пакетный файл

Пакетный режим читает серию команд из входного пакетного файла вместо стандартного ввода. Поскольку в нем отсутствует взаимодействие с пользователем, его следует использовать в сочетании с неинтерактивной аутентификацией. Пакетный файл «-» может использоваться для обозначения стандартного ввода. sftp прервет работу, если любая из следующих команд завершится неудачно: get, put, reget, rename, ln, rm, mkdir, chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink и lmkdir. Завершение при ошибке может быть подавлено для каждой команды, предварительно зафиксировав команду символом «-» (например, -rm / tmp / blah *).

heemayl
источник
2

Другой вариант будет использовать curl :

curl -u user -T file.tar sftp://example.com/home/user/
Pere
источник