python - 脚本交互式 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()
解决方案
安装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
文件设置了正确的读取权限。
推荐阅读
- sql - 将表变量中的值分配给表的每一行?
- javascript - JS调用多个存储函数,从this开始
- python - 用于单元测试的python中的模拟流API
- dotnetnuke - 如何从 2sxc 模块中的另一个门户访问某些实体关联文件?
- node.js - Socket.io 客户端:总是无效的命名空间消息
- azure - Azure RBAC 应用程序洞察组件贡献者与监控贡献者
- javascript - 从 Javascript 创建填充的电子邮件
- linux - Shell 在 sed 替换中执行 grep 命令不符合预期
- excel - Excel VB - 正确的图表和格式
- mysql - docker mysql 可以从内部登录但不能从外部登录