我正在尝试使用 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
。这可以通过任何方式完成,包括 SFTPget
和put
。