【问题标题】:How to send password using sftp batch file如何使用 sftp 批处理文件发送密码
【发布时间】: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 样式 :)

标签: batch-file passwords sftp


【解决方案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 身份验证。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多