我在一台 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