linux 如何在shell脚本中添加输出

cvxl0en2  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(94)

假设我正在检查是否与特定端口建立了连接。

nc -zv 162.147.191.141 8080 2>&1  |grep  -w 8080;

output- 
Connection to 162.147.191.141 port 8080 [tcp/*] succeeded!

nc -zv 162.147.191.141 80 2>&1  |grep  -w 80;

output-
nc: connectx to 162.147.191.141 port 80 (tcp) failed: Connection refused

字符串
所以现在我有一个场景,如果连接建立与特定端口(前8080或80),然后添加IP到输出文件。
这里的$?我已经用来查看连接是成功还是失败。如果连接将成功然后添加ip到out.txt文件。
如何在then语句中提取ip[162.247.241.14]写入输出文件?

nc -zv 162.247.241.14 8080 2>&1  |grep  -w 8080; if [ $? -eq 0 ]; 
then ??
 ; fi


稍后我将使用这些代码来实现更大规模的应用。

port1=80
port2=8080

for host in `cat hostfile.txt`
do
nc -zv $host $portno1; if [ $? -eq 0 ]; then ??  >>output.txt
nc -zv $host $portno2; if [ $? -eq 0 ]; then ??  >>output.txt
done

2uluyalo

2uluyalo1#

考虑类似这样的情况:

#!/usr/bin/env bash

ports=( 80 8080 )

while IFS= read -r host; do
  for port in "${ports[@]}"; do
    if output=$(nc -zv "$host" "$port" </dev/null 2>&1); then
      printf '%s %s %q\n' "${host}" "${port}" "${output}" >&3
    fi
  done
done <hostfile.txt 3>>output.txt

字符串
注意事项:

  • 我们使用bash shebang,而不是以sh开始我们的脚本;这确保了扩展功能(如数组)可用。
  • 我们使用BashFAQ #1while read循环阅读输入文件;请参阅DontReadLinesWithFor了解为什么这是一种更安全的做法。
  • 我们只存储 * 一个 * 变量和一个端口数组;当我们可以有一个ports变量时,没有理由将port1port2存储为多个变量。
  • 我们将nc的stdin附加到/dev/null,这样它就不会阻止读取脚本的当前stdin。
  • 我们将nc的stdout和stderr(后者由2>&1选择)存储在一个名为output的变量中。
  • 使用3>>output.txt可以让我们在整个循环中只打开output.txt * 一次 *;随后,在特定的echo命令上使用>&3将内容定向到已经打开的文件描述符--比为每次写入创建一个全新的文件句柄快得多。

相关问题