我正在尝试编写一个脚本来登录我用于工作的单个 ftp 站点上的 30 多个帐户之一。
我希望看到的行为:
$ 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 session 具有交互性。
我的下一步是尝试curl:
curl ftp://user:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dcacbdafafabb3aeb89cbaa8acf2afb3b1b9acb0bdbfb9f2bfb3b1" rel="noreferrer noopener nofollow">[email protected]</a>
执行并退出,返回代码为 0。
最后,我尝试从 CLI 进行 ftp,方法是从脚本调用它:
ftp ftp.someplace.com <<END_SCRIPT
> quote USER username
> quote PASS password
> END_SCRIPT
执行并退出,返回代码为 0。
有没有办法编写脚本来做到这一点?我更喜欢在 python 中这样做,但我可以进行 bash 子进程调用。此时,我正在查看一些复杂的 .netrc 条目,但我感觉我正在掉入兔子洞。 感谢您的帮助!
****************用 Python 实现回答后进行编辑****************
以下 2 行在 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:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2e5e4f5d5d59415c4a6e485a5e005d41434b5e424f4d4b004d4143" rel="noreferrer noopener nofollow">[email protected]</a>
当您想以 user1 身份连接时:
lftp -e 'source user1.lftp'
这将使您进入可以执行ftp
命令的提示符。您可以通过在 .bashrc
中定义如下函数来使其更方便:
lftp-open() {
lftp -e "source $1.lftp"
}
然后就很简单了:
$ lftp-open user1
显然,这种方法或任何自动化 ftp
登录方法的缺点是需要以明文形式存储密码,因此您需要确保拥有适当的读取权限在 *.lftp
文件上设置。
关于python - 编写交互式 FTP 登录脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53858317/