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

问题描述 投票:0回答:8

我正在尝试使用批处理脚本从 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>

但是我需要自动输入密码的能力。

batch-file passwords sftp
8个回答
59
投票

您需要安装 sshpass 程序。然后:

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

显然,最好设置公钥认证。仅在出于任何原因无法做到的情况下才使用它。


24
投票

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

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

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

这显然不是一个可以在

cron
作业中使用的完全自动化的选项,但它可以从终端使用。


1
投票

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

说明书上写的很清楚:

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

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

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


1
投票

你提到了批处理文件,我假设你在谈论 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 验证。


1
投票
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

1
投票

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

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

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

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


0
投票

这个命令会帮助你

sshpass -p MYPASSWORD sftp MYUSERNAME@HOST

0
投票

可以使用标准的 expect 工具做到这一点:

SFTP_SERVER='myserver.com'
SFTP_USER='mysftp_user'
SFTP_PWD='12345'

SFTP_BATCH=sftp.bat  #existing batch file with sftp commands to execute

SFTP_IGNORE_PUBKEY='-o "PubkeyAuthentication=no"'   # optional param

expect <<EOF
        set timeout 120
        spawn sftp -q -o "BatchMode=no" $SFTP_IGNORE_PUBKEY -b "$SFTP_SCRIPT" "$SFTP_USER@$SFTP_SERVER"
        expect  {
            -nocase "Are you sure you want to continue connecting (yes/no)?" { send "yes\r" ; exp_continue}
            -nocase "*password:" { send "$SFTP_PWD\r"; exp_continue }
            -nocase -re "failed|invalid password|timeout" abort
        }
        catch wait result
        exit [lindex \$result 3]  #catch and forward sftp result code
EOF
    rc=$?
echo $rc

这里:

  • -o "BatchMode=no"
    允许互动
  • -q
    - 执行力强,避免在日志中出现冗长的“服务器问候”消息
  • 期望代码在需要时回答是和密码,以及拦截 sftp 进程的退出代码。
© www.soinside.com 2019 - 2024. All rights reserved.