使用 expect 实现 sftp 自动化的问题

使用 expect 实现 sftp 自动化的问题

我正在尝试使用 sftp 自动传输数据。

我有一个 hacky expect 脚本,用于抓取数据文件。不幸的是,在传输过程中,文件意外被截断。当我尝试手动执行相同的命令时,它总是传输整个文件。

我的期望脚本的第一行是:

spawn  sftp -o ConnectTimeout=120 username@boxAddress

我的印象是,如果连接停滞时间少于两分钟,则输入“-o ConnectTimeout=120”可以防止连接超时。

我应该怎么做才能让脚本下载整个文件?

另一个不太重要的问题:我更愿意使用密钥进行身份验证(但这不是必需的,因为我只从外部服务器获取数据)。我认为我不能在这个外部服务器上放置密钥(因为它不在我的控制之下),但是(当我使用 FileZilla 连接到它时)我注意到 FileZilla 接受了它的密钥。我如何设置我的脚本来请求和使用此密钥?

答案1

您不需要expect脚本来通过 SFTP 抓取一些文件;可以从命令行完成相同的操作:

sftp username@boxAddress:/path/to/datafile

将获取datafile到当前目录。


回答第二个问题(应该是单独发布),您混淆了两种不同的键。

  • 当 FileZilla 或sftp 接受关键服务器,它是“主持人密钥”,用于验证服务器的身份。
  • 当您使用密钥进行身份验证时,它是用户认证密钥,用于验证你的身份。

通常情况下,你会不是无需对服务器进行任何额外的控制来启用后者;只需将您的公钥附加到 即可~/.ssh/authorized_keys。这可以通过任何方式完成,包括 SFTPgetput

相关内容