我正在尝试创建一个脚本来通过 SFTP 将一些文件上传到服务器。我可以通过打开交互式 lftp 会话并在其中提供用户名和密码来手动执行此操作。对于剧本,我想
- 不在脚本中硬编码凭据(出于显而易见的原因)
- 不要在命令行上提及它们(我希望在我的 .bash_history 中使用该命令,但当然不是凭据)
- 已
lftp
阅读凭证.netrc
或类似内容
我似乎无法让这个工作。我当前的解决方法是一个包装脚本,它解析凭据.netrc
并将其添加到 lftp 脚本中,然后将其删除。这模拟了我手动执行的步骤,但似乎重新实现了现有功能,效果很差。虽然这有效,但问题仍然存在:
lftp 可以读取 .netrc 进行 SFTP 连接吗?
如果是这样,如果海关端口是设置的一部分,是否有特殊的语法要求?我需要连接到.sftp://username:[email protected]:12322
答案1
最好的选择是使用密钥对来访问服务器,就像您为ssh
.三个步骤:
创建密钥对(如果还没有):
ssh-keygen -t rsa -C "" -f ~/.ssh/id_rsa
将公钥复制到服务器:
ssh-copy-id [email protected] -p 12322
连接到服务器:
lftp sftp://[email protected]:12322
如果您将使用一些非标准路径作为密钥,请注意您应该将密钥添加到ssh-agent
您的之前或之前.ssh/config
!
答案2
根据lftp
手册页,~/.netrc
是支持/使用者lftp
:
~/.netrc
查阅该文件以获得 FTP 服务器的默认登录名和密码。如果使用带有用户名但没有密码的 URL,也会在此处搜索密码。
根据本文的阅读,我怀疑您使用自定义端口的 URL 应该没问题。
答案3
我可以确认roneo.org 的答案是正确的并且故事编码器的解释如何指定端口的注释也有效。
我想要一个更安全的登录选项,它不会将凭据保存在纯文本文件中.netrc
,并确保我的流量是加密的。
如果 lftp 让您显式调用该.netrc
文件,您只需.netrc
使用 加密您的文件gpg
并将其传递给lftp
.就像你可以用cURL
.不幸的是,你不能。
不过,您可以做的是创建一个加密的 ftp url 字符串,其中包含所有连接信息(包括密码)并将其传递给lftp
.
首先创建一个纯文本文件,其中包含单个字符串以及服务器的完整登录名、端口和路径。基本上,lftp
如果您使用书签文件 ( ~/.local/share/lftp/bookmarks
),但没有别名,则会存储在书签文件中的内容。
因此,如果您的bookmarks
文件有:
myftpserver ftp://<user>:<pass>@ftp.mysite.com:10234/path/to/files/
您只需使用:
ftp://<user>:<pass>@ftp.mysite.com:10234/path/to/files/
首先,为自己创建一个空白文本文件:
touch ~/.lftprc
使用文本编辑器从文件中添加该 ftp URL,bookmarks
以便将密码保留在 bash 历史记录之外:
vi ~/.lftprc
如果您从未设置过gpg
,请立即进行设置:
gpg --full-generate-key
然后,使用以下命令加密该文件gpg
:
gpg -r <GPG USER ID/EMAIL> -e ~/.lftprc
该文件随后变为~/.lftprc.gpg
.请务必删除您创建的文件:
rm ~/.lftprc
现在,您的整个登录网址基本上是一个加密字符串,您可以使用Bash
和来调用gpg
:
lftp $( gpg --batch -q -d ~/.bookmark.gpg )
然后您可以将其转换为别名:
alias lftps='lftp $( gpg --batch -q -d ~/.bookmark.gpg )'
我选择lftps是因为它看起来很酷,但你可以做任何你想做的事:
HOSTNAME:~ # lftps
cd ok, cwd=/path/to/files
lftp <user>@ftp.mysite.com:/path/to/files>
我的 ftp 服务器支持 FTP 上的显式 TLS,因此为了安全传输,.lftp.conf
我有:
set ssl-allow true
set ssl:ca-file "/var/lib/ca-certificates/ca-bundle.pem"
set ftp:ssl-force true
所以,毕竟我想知道 lftp 如何将用户密码传递到服务器,以及您是否可以嗅出它......
答案4
您可以将您的凭据存储在~/.netrc
.该文件应如下所示:
machine ftp.cluster.host.net (do not include 'sftp://' here)
login yournickname
password xFrPkIB8767
然后您可以连接
lftp sftp://[email protected]/
昵称是必需的,但密码是从 中提取的.netrc
。
您的终端历史记录是干净的!
你也可以直接传递命令到lftp
:
lftp -c "open sftp://[email protected]; ls"
对于脚本和 bash 别名非常有用!