我使用 收集所有本地 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 地址。