我需要将文件上传到服务器。
服务器使用 SFTP 上传。身份验证后,禁止执行任何命令,因此我无法直接通过 SSH 进入,我需要直接进入 SFTP 子系统。
例如。
ssh -N [email protected]
运行正常,除了我无法使用 SFTP 进行任何操作。
不过,我可以做得很好。sftp [email protected]
问题:我需要自动化,身份验证是键盘交互的,而不是基于密钥的。他们只是说,我连接的服务器不是我的。“这是密码,每周上传文件。”那里没有人知道关于钥匙或类似东西的任何事。
sftp -b
批处理脚本不允许键盘交互式验证。
我厌倦了手动上传文件。他们通过未加密的电子邮件发送了 8 个字符的密码,密码末尾包含 3 个相同的数字和一个字典单词(即“Words777”)——让我们假装安全在这里真的不是问题。
我可以仅通过密码来创建 SSH 密钥吗?请记住,我无法访问其他服务器。我可以用某种方式编写脚本吗?我尝试过使用不同的软件包,甚至rsync
尝试过上传,但它们都希望直接访问 SSH,而不是直接进入 SFTP 子系统。
答案1
我认为如果你创建一个 ssh 密钥没有使用“密码”保护它,您可以跳过键盘交互部分,从而轻松创建所需的上传脚本。例如参见此处:
ssh-keygen -t rsa -C "Your Name" -f your_key
这将创建必要的文件,然后您只需将公共文件(*.pub)复制到远程服务器上。
答案2
安装预计它可让您针对此类情况编写脚本。
sudo apt-get install expect
设置 shell 脚本
#!/bin/bash
HOST=""
USER=""
PASS=""
# Sorry for the offensive "assword", it's to cope with "Password" and "password".
VAR=$(expect -c "
spawn sftp $USER@$HOST
expect \"assword:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"exit\"
")
echo "==============="
echo "$VAR"
答案3
使用索卡特。
例子:
(sleep 2; echo password) | socat - EXEC: "sftp -o batchmode=no -o PubkeyAuthentication=no -b batchfile user@host",pty,setsid,ctty