![Bash - 이전 명령 인수 분할](https://linux55.com/image/45264/Bash%20-%20%EC%9D%B4%EC%A0%84%20%EB%AA%85%EB%A0%B9%20%EC%9D%B8%EC%88%98%20%EB%B6%84%ED%95%A0.png)
Bash에서 이전 명령을 구문 분석하는 방법은 무엇입니까?
예:
root$ ssh [email protected]
root$ echo !$ &>/tmp/foo.txt
root$ cat /tmp/foo.txt
[email protected]
표적:1.2.3.4
foo.txt에 IP 주소만 보내기
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).
자원
추가 설명
최종 목표는 충돌하는 SSH 키를 쉽게 제거할 수 있는 기능을 .bashrc에 만드는 것입니다.
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