Предоставлять команды автоматически для ftp в скрипте bash - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь создать bash-скрипт с ftp.

Если я использую терминал и ставлю команды ниже одной до одной, это работает как чудо.

$ ftp 192.168.1.4 2121
Connected to 192.168.1.4.
220 SwiFTP 1.7.11 ready
Name (192.168.1.4:user): 
331 Send password
Password:
230 Access granted
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> cd Study/Math
ftp> put ~/Documents/Math/lesson.pdf lesson.pdf

Я пытаюсь автоматизировать эту команду с помощью bash-скрипта:

#!/bin/bash
ftp 192.168.1.4 2121
cd Study/Math
put ~/Documents/Math/lesson.pdf lesson.pdf

Не работает.Я знаю, что ftp - это независимый инструмент, и мне нужно вводить эти команды, пока работает программа ftp.Я искал в интернете, пробовал различные методы (например, printf, expect и т. Д.), Но это не сработало.Я также пытался использовать некоторые сценарии из Интернета, чтобы автоматизировать этот процесс, но ничего не помогло.Я новичок в bash-скриптинге и подобных вещах.Ребята, можете ли вы помочь мне решить эту проблему?Заранее спасибо ...

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Хотя подход ftp, с которым вы работаете, может подойти для ваших целей, он не будет работать должным образом, если сервер не будет отвечать должным образом.

Как уже было предложено, используйте что-то другоечем ftp, если это вообще возможно.Scp или rsync, использующий аутентификацию по ключу, будет работать лучше, будет удобнее, так как он не будет ломаться каждый раз при смене пароля, и будет более безопасным.

0 голосов
/ 23 октября 2018

Хорошо, после того, как User123 дал мне ссылку , я наконец решил свою проблему.Итак, я даю свой рабочий сценарий.

#!/bin/sh

HOST='192.168.1.4 2121'
USER='username_of_ftp'
PASSWD='password_of_ftp'

/usr/bin/ftp -n $HOST <<END_SCRIPT
user ${USER} ${PASSWD}
cd Study/Math
put ~/Documents/Math/lesson.pdf lesson.pdf
quit
END_SCRIPT

exit 0
0 голосов
/ 23 октября 2018

Во-первых, не делайте этого, если у вас есть другие варианты.Это довольно стандартная идиома, но она во многом сломана.Если вы уверены, что он никогда не сделает ничего непредсказуемого, и что когда он это сделает, все будет в порядке, то конечно, но в целом ...

1) используйте что-то кроме ftp.Например, scp работает довольно хорошо и имеет проверяемый код возврата, который на самом деле полезен.

2) используйте более детальный язык программирования с модулями.Не поймите меня неправильно, я люблю bash и всегда буду использовать его первым, когда смогу, но закачиваю поток команд в ftp, как UDP-торпеду «забей и забудь», без какого-либо простого способа проверить, что каждая из них работает просто плохопривычка.Попробуйте Perl, Python или любую другую проклятую вещь, которая позволяет вам проверять код возврата для каждой команды и реагировать соответствующим образом.:)

3) если вы ДОЛЖНЫ использовать bash (и да, я это сделал), и если это достаточно важно для проверки (что не так?), Подумайте о том, как вы собираетесь это сделатьтот.Может быть, вы можете просто вытащить lesson.pdf обратно в локальный файл testme.pdf и cmp, чтобы убедиться, что это хорошо, что кажется довольно простым.Для любого более сложного сценария вам может потребоваться запустить ftp как сопроцессы и передавать ему команды по одной, а затем считывать его выходные данные и анализировать коды возврата, потому что ftp обычно только сообщает об ошибках там ... и следите за«Отправлено 500 байт», что не является ошибкой 500.

В любом случае, удачи.Во многих отношениях просто все еще лучше.

0 голосов
/ 23 октября 2018

Вас может заинтересовать то, что известно как heredoc

#!/usr/bin/env bash
ftp -n 92.168.1.4 2121 <<EOF
cd Study/Math
put ~/Documents/Math/lesson.pdf lesson.pdf
EOF

Поскольку программа ftp считывает свой ввод из /dev/stdin, вы можете использовать heredoc для определения того, что следует передать из /dev/stdin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...