如何通过管道获取ip?

如何通过管道获取ip?

我使用 收集所有本地 ip arp-scan,然后通过 mac 地址过滤特定系统 ip,并使用 ssh 自动连接到该特定系统。我通过管道尝试了以下命令

 sudo arp-scan --localnet|grep 10|cut -c1-12|xargs ssh myuser@

这里的1cgrep是我系统的mac地址起始字母。

它返回以下错误

ssh:无法解析主机名:名称或服务未知

xargs: ssh: 已退出,状态为 255;中止

答案1

使用参数替换字符串标志

您需要使用 xargs 的替换字符串标志。例如,假设管道的其余部分按预期工作:

sudo arp-scan --localnet | grep 10 | cut -c1-12 | xargs -I{} -n1 ssh -tt myuser@{}

请注意,两者参数SSH命令需要一些额外的标志才能正常工作。特别值得注意的是,当 SSH 客户端从管道接收标准输入时,需要将-tt标志传递给 SSH,以便在远程主机上强制进行 PTY 分配。

使用命令替换和 Shell 变量

或者,如果您准确地捕获单个 IP 地址,则只需在 shell 变量中捕获结果并在正确的主机上调用 SSH。例如,使用 Bash shell:

host_ip=$(sudo arp-scan --localnet | grep 10 | cut -c1-12)
ssh "myuser@${host_ip}"

这种方法的主要优点是更容易调试。但是,您的里程可能会有所不同。

答案2

  • 第一个问题是您正在尝试运行ssh myuser@ x.y.z.t(其中 xyzt 是识别的 IP 地址)。行不通。你需要(注意网络和IP地址之间没有空格)。你可以尝试一下。ssh [email protected]myuse@sudo arp-scan --localnet | grep ... | sed -e 's/^/myuser@/' | xargs ssh

  • 第二个问题是ssh不会建立交互式会话,抱怨标准输入不是终端。为了保持ssh满意,您必须在命令替换中进行 IP 地址选择:

    ACCOUNTNAME=myuser
    MACADDRESS=00:50:56:3a:8d:1e
    ssh "$ACCOUNTNAME@$(
      sudo arp-scan --localnet |
      grep "$MACADDRESS" |
      cut -c 1-15
    )"
    

我希望所grep显示的只是一个示例,实际上您可以使用完整的 MAC 地址。

您可能需要添加一些错误处理代码,以防grep找不到与给定 MAC 地址对应的 IP 地址。

相关内容