Выполнить команду в соединении 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 закрыта, он просто говорит: команда: не найдена.

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

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


Ответы:


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услуги, как правило , доступны , если любой из них; одна и та же программа-демон предоставляет их все одновременно. В принципе, администратор сервера может отключить любой из них, но на практике это происходит довольно редко.


Не знал про 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 *).


2

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

curl -u user -T file.tar sftp://example.com/home/user/
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.