我需要编写一个bash脚本,当您为其提供服务的默认端口号时,该脚本会返回服务名称。我正在使用/etc/services
文件。我的代码是:
grep -E $1 /etc/services | head -n 1 | awk '{print $1}'
但它不适用于 1、2、3 等端口,...20 和其他一些。如何改进它,或者我需要另一种解决方案来解决这个问题?
在这里,您可以提供input_port
变量的任何port_number,它将在第二列的第一部分中匹配,如果匹配,则将打印第一列。
awk -v input_port="$1" '{split($2,a,"/")}input_port==a[1]{print $1}' /etc/services
smtp
getent services 22
输出:
ssh 22/tcp
如果您只需要名称:
getent services 22 | awk '{print $1}'
输出:
ssh
查询系统上的信息时,请尽可能使用 getent
,因为某些条目可能来自 /etc
中的文件以外的来源。例如,不要解析名为 USERNAME
的用户的/etc/passwd
,而是使用 getent passwd USERNAME
,因为该条目可能来自 LDAP,而不是 /etc/password
。
在我的系统上,getent
知道以下"数据库":
ahosts ahostsv6 ethers gshadow netgroup passwd rpc shadow
ahostsv4 aliases group hosts networks protocols services