如何使用 sftp 批处理文件发送密码

Posted

技术标签:

【中文标题】如何使用 sftp 批处理文件发送密码【英文标题】:How to send password using sftp batch file 【发布时间】:2012-07-29 02:31:10 【问题描述】:

我正在尝试使用批处理脚本从 sftp 站点下载文件。我收到以下错误:

Permission denied (publickey,password,keyboard-interactive).
Couldn't read packet: Connection reset by peer

运行命令时:

sftp -b /home/batchfile.sftp <user>@<server ip>:<folder>

batchfile.sftp 包含这些数据:

password
lcd [local folder]
cd [sftp server folder]
get *
bye

注意:在提示符下运行时它正在工作

sftp <user>@<server ip>:<folder>

但我需要能够自动输入密码。

【问题讨论】:

通过从批处理文件中删除密码是否有效?通过手动输入密码,其余功能是否正常工作? 将密码以纯文本形式存储在文件中显然不安全——如果您不想每次都输入密码,我强烈建议您使用 RSA 密钥身份验证。 @lindhe 将密码存储在纯文本文件中显然与使用没有密码的 RSA 密钥身份验证一样安全。如果您要使事情自动化,这确实是唯一的选择。只需确保纯文本文件只能由文件所有者读取(就像 ssh 密钥所需的一样) 只是一个想法,但我使用的一种似乎与本地私有 ssh 密钥一样安全的方法是将文件放在 ~/.ssh 目录中,并具有与 .ssh/your_private_keyfile_name 相同的权限。我不推荐以下将密码放入 .bashrc 的方法,尤其是将其放入导出变量中。 .bashrc 被很多进程读取,并且密码在您的环境变量中以“纯文本”形式显示。如有疑问,请使用 .ssh 样式 :) 【参考方案1】:

您需要安装 sshpass 程序。那么:

sshpass -p YOUR_PASSWORD sftp -oBatchMode=no -b YOUR_COMMAND_FILE_PATH USER@HOST

显然,最好设置公钥认证。仅在无论出于何种原因无法执行此操作时才使用它。

【讨论】:

谢谢!这是唯一真正回答问题的评论。有时根本无法获得密钥文件。 为了更安全,将export SSHPASS='your_password' 放到~/.bashrc 并使用-e 标志运行。我在一些这样的项目中使用过这个 cmd:echo 'ls -t upload/*.xml' | sshpass -e sftp -oBatchMode=no -b - user@example.com | grep -v "sftp&gt;" | head -n1 让@Lev Lukomsky 更进一步,您希望从 ~/.bashrc 中删除组和世界读取权限。 我建议“不要”放入 .bashrc,因为这是一个一直在读取的混杂文件。尤其是不要将您的密码放在导出的变量中或出现在 .bash_history 中的任何地方......两者基本上都会将其放在纯文本中并将其保存在内存中......不好。将它放在您的 .ssh/ 目录中,与您的 ssh 私钥具有相同权限的文件中,并且永远不要以使其驻留在内存中、可由“ps”显示或在您的环境中的方式使用它。保持 ssh'y !【参考方案2】:

如果您正在生成要运行的命令堆,然后从终端调用该脚本,您可以尝试以下操作。

sftp login@host < /path/to/command/list

然后您将被要求输入您的密码(正常情况下),但是脚本中的所有命令都会在此之后运行。

这显然不是可以在cron 作业中使用的完全自动化选项,但可以从终端使用。

【讨论】:

【参考方案3】:

我建议您使用 -v 选项运行 sftp。了解正在发生的事情变得容易得多。

手册明确指出:

最终使用格式允许使用 -b 进行自动会话 选项。 在这种情况下,需要配置非交互认证 避免在连接时输入密码(请参阅 sshd(8) 和 ssh-keygen(1) 了解详情)。

换句话说,你必须建立一个公钥认证。然后你就可以运行一个批处理脚本了。

附: 将密码放在批处理文件中是错误的。

【讨论】:

我否决了这个答案,因为它与问题的要求相反。 “附言” element 似乎是一个值得探讨的话题。事情很少有“正确”或“错误”之分,而是不同因素的妥协和权衡。【参考方案4】:
PSFTP -b path/file_name.sftp user@IP_server -hostkey 1e:52:b1... -pw password

文件内容为:

lcd "path_file for send"

cd path_destination

mput file_name_to_send

quit

让主机密钥运行:

psftp  user@IP_SERVER

【讨论】:

【参考方案5】:

您需要使用命令 pscp 并强制它通过 sftp 协议。 pscp 会在你安装 PuttY 时自动安装,PuttY 是一个通过 ssh 连接到 linux 服务器的软件。

当你有你的 pscp 命令时,这里是命令行:

pscp -sftp -pw <yourPassword> "<pathToYourFile(s)>" <username>@<serverIP>:<PathInTheServerFromTheHomeDirectory>

这些参数(-sftp 和 -pw)仅适用于 pscp 而不是 scp。如果您想以递归方式上传文件夹中的所有内容,也可以添加 -r。

【讨论】:

【参考方案6】:

您提到批处理文件,假设您说的是 Windows 系统,我是否正确?如果是这样,您将无法使用 sshpass,您将不得不切换到其他选项。

其中两个遵循截然相反的理念的选项是:

psftp:可以从批处理脚本中调用的命令行工具; psftp 是 PuTTY 包的一部分,你可以在这里找到它 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Syncplify.me FTP 脚本:用于 Windows 的可编写脚本的 FTP/S 和 SFTP 客户端,允许您将密码存储在加密的“配置文件”中;在这里查看 http://www.syncplify.me/products/ftp-script/

无论哪种方式,强烈建议从密码切换到 PKI 身份验证。

【讨论】:

以上是关于如何使用 sftp 批处理文件发送密码的主要内容,如果未能解决你的问题,请参考以下文章

如何在春季批处理中使用sftp上传多个文件

使用 WinSCP 和批处理监视 SFTP 服务器上的更改

linux scp 命令能不能实现跳转复制?

SFTP 使用 bash 脚本发送文件

jsch的sftp在多线程下的问题及处理办法

sftp如何连接远程