我正在通过 bash 脚本检查 ssh 连接
echo -e "Checking if you have setup a key for serve ssh connection ..."
timeout 5s ssh uname@host 'exit'
if [ $? -eq 0 ];
then
echo -e "You're done"
else
echo -e "Set up a ssh key please or check username password"
fi
脚本运行良好。它提示输入密码。
但问题是它在询问密码时没有任何消息,没有显示任何提示消息,例如:
uname@host's Password:
我希望显示此消息。
答案1
您检查 SSH 密钥是否已设置的方法非常糟糕。
- 它可能会失败(例如,当连接需要超过 5 秒才能建立时,或者当用户的 shell 不理解“退出”时,或者当任何事物否则不会在 5 秒内发生)即使用户设置了 SSH 密钥,
- 即使用户还没有建立连接(当连接在不到 5 秒内建立并且用户输入密码足够快,这种情况很常见!),或者已经建立连接时,它也可以成功,
- 并且它可能会留下半完成的 SSH 连接。
您需要替换该方法。它根本就没有完成它的工作。
这很简单,告诉 SSH 不允许密码验证;根据您的 SSH 版本,有一个选项 ( man ssh
);最有可能的是
ssh -n -oControlMaster=no \
-oPasswordAuthentication=no \
-oKbdInteractiveAuthentication=no \
-oPreferredAuthentications=publickey \
user@host true \
|| \
echo "can't log in"
做你想做的事,没有任何涉及超时等的坏主意。事情要么有效,要么失败。
问题:无论您是否无法连接到主机,或者是否无法进行身份验证,它都会打印相同的内容。这些是不同的事情。
顺便说一句,如果整个事情只是为了让用户确保他们已经设置了公钥身份验证:有ssh-copy-id user@host
,它会尝试登录(尽可能),然后检查是否安装了用户的公钥在服务器上。这可能会让你的整个脚本变得过时:)