我正在尝试编写一个 bash 脚本,检查所有端口是否关闭或打开,以及当前 ssh 版本是否良好或需要更新。
下面是我弄清楚的代码,但我认为它可以改进-
$ ssh -p115 -vv [email protected] && /usr/lib/ubuntu-release-upgrader/check-new-release
我已经知道我正在使用的所有服务器都可以通过端口 115 访问。
我不确定如果不登录服务器是否可以获取当前版本。
答案1
使用nmap
(您可能必须sudo apt install nmap
先。阅读man nmap
。重新阅读man nmap
,然后执行以下操作(我的系统sshd
在端口 22 上运行):
sudo nmap -sV -p22 --version-all localhost
Starting Nmap 7.01 ( https://nmap.org ) at 2019-02-07 09:22 EST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00010s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.6 (Ubuntu Linux; protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.54 seconds
答案2
我不确定如果不登录服务器是否可以获取当前版本。
如果您正在运行像 Nagios 这样的基础设施监控系统,那么可能有一个插件或脚本,但我们假设您出于某种原因被困在准系统服务器上。
常见的建议是nmap
从另一个系统连接到您的服务器,但这可能会很慢,并且只覆盖您记得探测的接口。由于您无论如何都必须登录到服务器,因此您不妨运行一个netstat
来检查监听端口全部除环回接口之外的接口。这将是实际上可从任何接口访问的端口的严格超集(iptables
并且其他过滤规则可能会从此列表中删除某些端口),但它快速地并且不会出现假阴性。
这导致了如下脚本:
#!/usr/bin/env bash
# USAGE: check_servers <host1> <host2> ...
for h in "$@"; do
ssh -p115 -T "$h" <<'EOF'
echo -e "\n+++++ HOSTNAME: $(hostname) +++++"
echo ===== Checking for open ports =====
# Get all listening TCPv4/6 ports, then display non-loopback ones
netstat -tln | awk '$4 ~ /^[0-9:].*/ {print $4}' | grep -Ev '^(127\.|::1:|.*%lo)'
echo ===== Checking for new release =====
/usr/lib/ubuntu-release-upgrader/check-new-release
EOF
done