脚本中使用 ssh 自动登录

发布于 2023-10-24  3 次阅读


在编写脚本的时候,希望自动登录服务器,不必人为输入密码。

无论哪种方法,前提先使用 ssh 手动登录一次服务器,以使得客户端记录到你的服务器连接信息:

ssh admin@192.168.12.1 -p 2345

可以通过 cat .ssh/known_hosts 查看到 known_hosts 中的登录信息:

使用 sshpass

在脚本中添加自动登录脚本即可:

export SSHPASS='password' # 服务器的 SSH 登录密码
ROUTER_IP="192.168.12.1" # 服务器地址
ROUTER_PORT="2345" # 服务器 SSH 端口

echo `sshpass -e ssh admin@${ROUTER_IP} -p ${ROUTER_PORT} ifconfig` # ifconfig 为你要执行的命令,执行多个命令请复制多行
sshpass 可能需要额外安装!

使用密钥登录

首先在客户端使用 ssh-keygen 生成密钥对:

ssh-keygen 可能需要额外安装!(openwrt 中的软件包名为 openssh-keygen

在 /root/.ssh/ 下就可以找到 2 个文件:

id_ed25519(私钥)、id_ed25519.pub(公钥)

把公钥拷贝到服务器上(这里我需要访问的是路由器,梅林固件 web 界面上就有了,直接复制过去就行)!

回到客户端,输入命令尝试连接:

ssh -i '/root/.ssh/id_ed255191' admin@192.168.12.1 -p 2345

正常情况下,应该是登录成功了,但是我这里报错了!

因为 openwrt 使用的 SSH 是 dropbear SSH,跟 openssh 还有区别!

ssh: Exited: String too long 的解决办法

openwrt 中,安装 dropbearconvert 软件包,然后使用该工具转换私钥:

dropbearconvert openssh dropbear /root/.ssh/id_ed25519 /root/id_ed25519

或者直接使用 dropbearkey 生成密钥文件,一步到位:

dropbearkey -f /root/id_ed25519 -t ed25519
注意,使用如上 dropbearkey 生成时,公钥会直接打印在屏幕上,程序只会生成私钥文件!注意保存!

然后再尝试登录:

ssh -i '/root/id_ed255191' admin@192.168.12.1 -p 2345 # 注意,-i 后面的私钥路径换成转换后的了

此时,登录成功!

感谢

原本以为很简单的一件事,折腾了半个多小时,计划赶不上变化啊!特别感谢如下几位大佬的文章,终于解决了这个问题~

OpenWRT下ssh提示Exited: String too long的解决办法

ssh: Exited: String too long的解决办法