使用密码自动进行 SSH 登录

使用密码自动进行 SSH 登录

在这个问题被删除之前我已经读过了, 和;并且大多数链接都没有回答我的问题;因为:

  1. 我确实需要钥匙和密码
  2. 我运行多个服务器(50+),我无法承受将它们全部更改为无密码。
  3. 公钥和私钥也是如此,会占用每个服务器太多时间。

我尝试了 sshpass,但它不知何故弄乱了我与某些设备的 SSH 登录(我不得不重置服务器的 known_hosts)。如果我可以修改脚本以正确使用 sshpass,这将是一个可能的解决方案。

我希望找到 ssh 上的某种选项,可以自动输入密码;类似于:

ssh -o ConnectTimeout=5 -p 'USER_PASSWORD' [email protected].*** sensors | grep Core >> sensors.txt

或者使用可以感知并自动填充(类似宏之类的?)密码的小脚本(无论如何,一半的服务器都有相同的密码)。

我的第二个问题是,我注意到脚本有时会挂起(Ping 连接,但 SSH 不连接),这需要我等待超时或重新启动脚本。不确定这是否是网络问题,或者是什么,但如果我重新启动它,有时它确实会通过。

ConnectTimeout=5 似乎无法按预期工作。只有当服务器离线(未建立 IP 链接)时,脚本才会停止。当服务器在线但 openssh 未进行握手时,脚本会挂起...

答案1

expect曾经自动化过无密钥登录。这是我的代码。Shell 包装器:

#!/bin/bash
    HOSTNAME=$1
    case `echo ${HOSTNAME:7:1}` in
            d|q)
              ENV='sit'
              PW='pw1'
              ;;
            u)
              ENV='uat'
              PW='pw2'
              ;;
            p)
              ENV='prod'
              PW='pw3';
              ;;
    esac
    # Pass hostname and password to expect script
    ./go.exp $HOSTNAME $PW

期望脚本:

#!/usr/bin/expect -f
set hostname [lindex $argv 0];
set password [lindex $argv 1];
spawn ssh your_username@$hostname
expect "*:"
send "$password\n"
send "bash\n"
expect "bash-*"
# The next two lines are prompt customization, it is not necessary
send "export PROMPT_COMMAND='echo -ne \"\\033k\$HOSTNAME\\033\\\\\"'\n"
send "export PS1='\\e\[0;33m\\u\\e\[0;36m@\\e\[0;33m\\h \\e\[0;32m\\w> \\e\[m'\n"
# If you don't need interactive session then you may replace the below with whatever you need
interact

注意:假设用户名和提示在任何地方都是相同的,而且这并不安全,因为密码以明文形式作为 arg 传递,因此ps其他用户可以看到(例如在输出中)

相关内容