首页 > 解决方案 > 脚本交互式 FTP 登录

问题描述

我正在尝试编写一个脚本来登录我用于工作的单个 ftp 站点上的 30 多个帐户中的 1 个。

我想看到的行为:

$ ftp ftp.someplace.com
connected blah blah
220 blah blah ready...
Name (something): username
Password: <enter password>
couple lines saying successful login
ftp> <manually enter commands such as ls, cd, get, put, etc>

我已经在 Python 中使用 FTP.connect()/.login() 在 ftplib 中进行了尝试,但我在 ftplib 中发现的任何内容都没有放弃控制并使 ftp 会话具有交互性。

我的下一步是尝试 curl:

curl ftp://user:password@ftp.someplace.com

这将执行并以返回码 0 退出。

最后,我在 CLI 中尝试了 ftp,方法是从脚本中调用它:

ftp ftp.someplace.com <<END_SCRIPT
> quote USER username
> quote PASS password
> END_SCRIPT

这将执行并以返回码 0 退出。

有没有办法编写脚本来做到这一点?我更喜欢在 python 中使用这个,但我可以进行 bash 子进程调用。在这一点上,我正在查看一些复杂的 .netrc 条目,但我觉得我正在陷入困境。谢谢你的帮助!

**************在用 Python 实现回答后编辑****************

python中的以下两行工作:

 process = subprocess.Popen("lftp -e ls -u {0},{1} ftp.someplace.com".format(username,password), shell=True)
 output, error = process.communicate()

标签: pythonbashftp

解决方案


安装lftp可行吗?它有一个标志,-e可能适合您的需求:

-e cmd     execute the command just after selecting the server

执行命令后,它保持交互。您可以使用以下方法,其中每个帐户有一个具有以下模式的文件(命名这个,例如user1.lftp

open ftp://user1:password@ftp.someplace.com

当您想以 user1 身份连接时:

lftp -e 'source user1.lftp'

这将使您进入可以执行ftp命令的提示。您可以通过在您的 中定义如下函数来使其更方便.bashrc

lftp-open() {
    lftp -e "source $1.lftp"
}

然后它会很简单:

$ lftp-open user1

显然,这个或任何自动化ftp登录方法的缺点是要求以明文形式存储您的密码,因此您需要确保您对*.lftp文件设置了正确的读取权限。


推荐阅读