在bash脚本中自动向ftp提供命令

时间:2018-10-23 09:30:35

标签: linux bash shell ftp

我正在尝试使用ftp创建一个bash脚本。

如果我使用终端并将命令一一拖到下面,它的工作就像一种魅力。

$ 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程序运行时输入这些命令。我搜索了Internet,尝试了各种技术(例如printfexpect等),但是没有用。我还尝试使用Internet上的一些脚本来自动化此过程,但没有任何帮助。我是bash脚本和这些东西的新手。你们可以帮我解决这个问题吗? 预先感谢...

4 个答案:

答案 0 :(得分:1)

您可能对所谓的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传递的内容

答案 1 :(得分:1)

好的,在User123给我一个link之后,我终于解决了我的问题。所以,我正在提供我的工作脚本。

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

答案 2 :(得分:1)

首先,如果您有其他选择,请不要执行此操作。这是一个相当标准的习语,但实际上在很多方面都存在问题。如果您非常确定它不会做任何无法预测的事情,并且无论何时都可以,请确定,但是总的来说...

1)使用ftp以外的其他东西。例如,scp效果很好,并且具有可检查的返回码,这实际上很有用。

2)对模块使用更精细的编程语言。不要误会我的意思,我喜欢bash,并且会在可能的情况下始终首先使用它,但是将命令流泵入ftp,就像一劳永逸的UDP鱼雷,而没有任何简便的方法来检查每个bash是否不好习惯。尝试使用Perl,Python或任何其他可让您检查每个命令的返回码并做出相应反应的事情。 :)

3)如果您必须使用bash(是的,我已经做到了),并且如果它足够重要以进行检查(什么不是?),那么请考虑您将如何做。也许您可以将lesson.pdf拉回到本地的testme.pdf并cmp以确保它很好,这似乎很容易。对于任何更复杂的脚本,您可能需要将ftp作为协进程运行,并一次提供一个命令,然后回读其输出并解析返回代码,因为ftp通常仅在此处报告错误...并当心“已发送500个字节”,这不是500个错误。

无论哪种方式,祝你好运。在许多方面,简单仍然是最好的。

答案 3 :(得分:0)

虽然您使用的ftp方法可能适合您的目的,但是如果服务器未按预期响应,它将无法正常工作。

如已经建议的那样,请尽可能使用ftp以外的其他东西。使用密钥验证的Scp或rsync会更好,更方便,因为每次更改密码都不会破坏它,并且更安全。