通过键盘继续 for 循环

通过键盘继续 for 循环

我在一台 Linux 机器上有一个用户帐户,但我不知道它的确切 IP 地址。但我知道它在其中一个上运行的范围。我想检查哪个服务器是我想要的服务器。有一些 Microsoft 服务器、一些 Linux 服务器和一些服务器也已关闭。

我有一个 shell 脚本来检查每个服务器:

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh 192.168.1.$i -l user_name
done

此代码适用于每个 IP。如果运行 ssh,它会提示输入密码,如果 ssh 没有运行,它会尝试下一个 ip,如果服务器关闭,它会等待很长时间。此外,如果服务器有 ssh 并提示输入密码,我无法从这样的服务器通过键盘逃脱它。

如何通过键盘逃离这两种类型并转到下一个IP而不终止程序?

例如CTRL+C终止程序。

答案1

Ctrl-C向交互式 shell 的前台作业的所有进程发送 SIGINT 信号。这样就将其发送到sh正在运行的脚本和ssh.

您可以通过添加以下内容使其不杀死外壳:

trap : INT

到脚本的开头。

您可能还想使用 ConnectTimeout 选项ssh

ssh -o ConnectTimeout=2 ...

请注意,您会将密码泄露给您尝试连接的所有计算机。如果您不信任他们的管理员,这不是一个好主意。

答案2

要解决超时较长的问题,可以测试是否可以使用ping低计数和短间隔(对于普通用户来说最小0.2秒)的机器。

...
ping -c 2 -i 0.2 "192.168.1.$i"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name
fi
...

如果您只想使用私钥/公钥登录服务器,您可以ssh只接受该身份验证,因此如果提示输入密码,ssh 就会失败。

答案3

ping -c 2 -i 0.2 "192.168.1.$i:"
if [ $? == 0 ] ; then
   ssh 192.168.1.$i -l user_name &
fi

本节将帮助您继续操作,而无需等待密码输入,因为所有 SSH 连接都在后台运行。

每当您想要输入任何一台计算机的密码时,您都可以通过运行来执行此操作jobs,这将列出所有后台运行的进程。然后通过命令将所需的 ssh 连接带到前台fg %<job_id>

可能这个解决方案有点棘手或肮脏,但它肯定能达到目的

答案4

您可以尝试使用 ssh_config(实际上这不是您正在寻找的确切解决方案,即从键盘)。有两个这样的选项可以帮助您了解有关服务器的信息。

ssh_config:系统范围的配置位于 /etc/ssh/ssh_config(在 Debian 和一些 Linux 发行版上)。- 您可以编写用户特定的配置,即 ~/.ssh/config

  • BatchMode= 如果设置为 yes,将禁用密码查询,此选项有助于避免从脚本输入密码。

  • ConnectTimeout= 尝试连接到 ssh 服务器时使用的时间(以秒为单位)。这使用命令行选项中指定的显式时间而不是 tcp 超时值。

  • ConnectionAttempts= 如果怀疑数据包被丢弃。

#!/bin/sh
for i in $(seq 1 127)
do
    echo "192.168.1.$i:"
    ssh -o BatchMode=yes -ConnectTimeout=20 192.168.1.$i -l user_name
done

相关内容