lftp 可以读取 sftp 连接的 netrc

lftp 可以读取 sftp 连接的 netrc

我正在尝试创建一个脚本来通过 SFTP 将一些文件上传到服务器。我可以通过打开交互式 lftp 会话并在其中提供用户名和密码来手动执行此操作。对于剧本,我想

  • 不在脚本中硬编码凭据(出于显而易见的原因)
  • 不要在命令行上提及它们(我希望在我的 .bash_history 中使用该命令,但当然不是凭据)
  • lftp阅读凭证.netrc或类似内容

我似乎无法让这个工作。我当前的解决方法是一个包装脚本,它解析凭据.netrc并将其添加到 lftp 脚本中,然后将其删除。这模拟了我手动执行的步骤,但似乎重新实现了现有功能,效果很差。虽然这有效,但问题仍然存在:

lftp 可以读取 .netrc 进行 SFTP 连接吗?

如果是这样,如果海关端口是设置的一部分,是否有特殊的语法要求?我需要连接到.sftp://username:[email protected]:12322

答案1

最好的选择是使用密钥对来访问服务器,就像您为ssh.三个步骤:

  1. 创建密钥对(如果还没有):

    ssh-keygen -t rsa -C "" -f ~/.ssh/id_rsa
    
  2. 将公钥复制到服务器:

    ssh-copy-id [email protected] -p 12322
    
  3. 连接到服务器:

    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 别名非常有用!

相关内容