我正在尝试使用批处理脚本从 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>
但是我需要自动输入密码的能力。
您需要安装 sshpass 程序。然后:
sshpass -p YOUR_PASSWORD sftp -oBatchMode=no -b YOUR_COMMAND_FILE_PATH USER@HOST
显然,最好设置公钥认证。仅在出于任何原因无法做到的情况下才使用它。
如果您正在生成一堆要运行的命令,然后从终端调用该脚本,您可以尝试以下操作。
sftp login@host < /path/to/command/list
然后系统会要求您输入密码(正常情况下),但是脚本中的所有命令都会在此之后运行。
这显然不是一个可以在
cron
作业中使用的完全自动化的选项,但它可以从终端使用。
我建议您使用 -v 选项运行 sftp。了解正在发生的事情变得容易得多。
说明书上写的很清楚:
最终使用格式允许使用 -b 进行自动会话 选项。 在这种情况下,有必要配置非交互式身份验证 避免在连接时输入密码的需要(见 sshd(8) 和 ssh-keygen(1) 了解详情)。
换句话说,你必须建立一个公钥认证。然后你就可以运行批处理脚本了。
附言 将密码放在批处理文件中是错误的。
你提到了批处理文件,我假设你在谈论 Windows 系统是正确的吗?如果是这样,您将无法使用 sshpass,您将不得不切换到其他选项。
遵循截然相反的哲学的两个这样的选择是:
无论哪种方式,强烈建议从密码验证切换到 PKI 验证。
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
需要使用命令pscp强制通过sftp协议。当你安装 PuttY 时会自动安装 pscp,这是一个通过 ssh 连接到 linux 服务器的软件。
当你有 pscp 命令时,这里是命令行:
pscp -sftp -pw <yourPassword> "<pathToYourFile(s)>" <username>@<serverIP>:<PathInTheServerFromTheHomeDirectory>
这些参数(-sftp 和 -pw)仅适用于 pscp 而不是 scp。如果你想以递归方式上传文件夹中的所有内容,你也可以添加 -r 。
这个命令会帮助你
sshpass -p MYPASSWORD sftp MYUSERNAME@HOST
可以使用标准的 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
- 执行力强,避免在日志中出现冗长的“服务器问候”消息