如何解析 bash 中的前一个命令?
例子:
root$ ssh [email protected]
root$ echo !$ &>/tmp/foo.txt
root$ cat /tmp/foo.txt
[email protected]
目标:
仅将 ip 地址发送 1.2.3.4
到 foo.txt
我尝试过使用 awk,但没有成功
#doesn't work
cat /tmp/foo.txt |awk '{print $2,$3,$4}'
我还尝试使用 sed 解析出数字
#doesn't work
sed 's/.//p' /tmp/foo.txt
sed 's/[0-9]//p' /tmp/foo.txt
注意事项
1.2.3.4 始终是 0.0.0.0 到 255.255.255.255 之间的数字
用户名foo
可以是任意长度
[电子邮件受保护]是不是必然是传递到 ssh 的唯一参数(例如 .. ssh 1.2.3.4 -l foo)
资源
进一步澄清
最终目标是在我的 .bashrc 中创建一个函数,使我能够轻松删除冲突的 ssh 密钥。
root$ ssh [email protected]
#some big error message warning about man in the middle attack
root$ ssh-keygen -R 1.2.3.4
答案1
使用您的原始语法:
$ cat /tmp/foo.txt | awk -F@ '{print $2}'
1.2.3.4
答案2
如果您可以使用 ssh 命令的其他语法,它会变得更容易:
ssh -l foo 1.2.3.4
echo !:3
但这需要这种精确的语法。
答案3
您可以使用!!
访问上一个命令行,以便
echo !! | sed 's/.*@\(.*\).*/\1/' | awk '{print $1}'
可能适合你,例如
echo ssh [email protected] ls | ...
123.456.654.321
echo ssh -p 19111 [email protected] | ...
123.456.654.321
这里唯一的假设是 IP 地址前面有一个 @,并且后面有一个空格或行尾。
答案4
要从之前的 ssh 命令查找数字 IP 地址:
echo $(grep -oP '\d+\.\d+\.\d+\.\d+' <<< "!ssh")
我在手册中没有看到任何内容可以让您找到“与模式匹配的参数”(http://www.gnu.org/software/bash/manual/bashref.html#History-Interaction)
很确定你不能将!
-style 历史扩展放入函数内,但有命令fc
:
# return the IP address of the most recent ssh command
sship () { command grep -oP '\d+\.\d+\.\d+\.\d+' < <(fc -l ssh); }
这不会限制您将 IP 地址作为特定(例如最后一个)参数
ssh [email protected] hostname