Является ли команда, которую я использую, неверна, чтобы проверить, что порт установлен или нет?
count=$(netstat -an | awk '$4 ~ /:'"$PORT"'$/ && $6 == "ESTABLISHED" {print $0}'| wc -l)
И взяв $count > 0 как установлено?
Ваш подход, похоже, работает, однако он не очень изящный. Я бы предпочел сделать это следующим образом:
if [[ "$(LANG=C netstat -nt | awk -F" +|:" '/ESTABLISHED/{print$5}')" =~ "$PORT" ]]; then
echo $PORT established
else
echo $PORT not established
fi
Подстановка команды просто печатает список установленных хостов независимо от локали пользователя, условное выражение проверяет, находится ли $PORT в этом списке и выполняет then, если это так, и список else, если нет.
Я не уверен, что вы подразумеваете под «взятием значения $ count> 0 как estalished?», но это похоже на действительный счет установленных соединений с данным портом. Возможно, вы захотите ограничить данный интерфейс или протокол (поэтому две разные службы, прослушивающие один и тот же порт, но на разных интерфейсах, не смешиваются).
Кроме того, вы также можете немного упростить команду :
count=$(netstat -an | awk -v port=":$PORT\$" '$4 ~ port && $6 == "ESTABLISHED" {count++} END {print count}')
Вместо этого вы также можете использовать lsof. lsof -i :$PORT будет отображать открытые соединения на этом порту, и вы можете использовать -n (аналогично -n в netstat) и -F T (чтобы указать только идентификатор PID, номер дескриптора файла и состояния TCP) для упрощения анализа:
lsof -ni ":$PORT" -FT | grep -c TST=ESTABLISHED
Ваш подход, похоже, работает, однако он не очень изящный. Я бы предпочел сделать это следующим образом:
if [[ "$(LANG=C netstat -nt | awk -F" +|:" '/ESTABLISHED/{print$5}')" =~ "$PORT" ]]; then
echo $PORT established
else
echo $PORT not established
fi
Подстановка команды просто печатает список установленных хостов независимо от локали пользователя, условное выражение проверяет, находится ли $PORT в этом списке и выполняет then, если это так, и список else, если нет.
Я не уверен, что вы подразумеваете под «взятием значения $ count> 0 как estalished?», но это похоже на действительный счет установленных соединений с данным портом. Возможно, вы захотите ограничить данный интерфейс или протокол (поэтому две разные службы, прослушивающие один и тот же порт, но на разных интерфейсах, не смешиваются).
Кроме того, вы также можете немного упростить команду :
count=$(netstat -an | awk -v port=":$PORT\$" '$4 ~ port && $6 == "ESTABLISHED" {count++} END {print count}')
Вместо этого вы также можете использовать lsof. lsof -i :$PORT будет отображать открытые соединения на этом порту, и вы можете использовать -n (аналогично -n в netstat) и -F T (чтобы указать только идентификатор PID, номер дескриптора файла и состояния TCP) для упрощения анализа:
lsof -ni ":$PORT" -FT | grep -c TST=ESTABLISHED